LinuxマシンでIntel SA-00086に対処する


# 概要
- IntelのCPUに重大な脆弱性(Intel SA-00086)が見つかった (北米時間2017/11/20公開情報)
    - [Intelによる公式情報](https://www.intel.com/content/www/us/en/support/articles/000025619/software.html)
    - [4gamerでのニュース](http://www.4gamer.net/games/382/G038245/20171122083/)
- 各ベンダからwindows用のセキュリティパッチツールが公開されている
- Linux(debian)しか入っていない自作PCで，このパッチを適用したので，参考情報としてここに共有する
- あくまで参考情報なので，自己責任で実行していただきたい

## 追記

[DamashiGamiさんのコメント](https://qiita.com/shirayu/items/f7e93487de63dc5a4f19#comment-e82f430f067ae1e50eb2)によれば，インストールメディアで代用出来るようだ．
Windows8のDVDを持っていたので，実際に試してみた．
起動して，DVDで起動して言語選択画面が表示された後「Shift+F10」を押すとコマンドプロンプトが出た．
その後は，``C:``コマンドでUSBメディアに移動し，記事の中にあるように，
``drvload heci.inf``と``FWUpdLcl.exe -F ME.bin``をすればアップデートできた．



# 背景
2017/11/20にIntelのCPUに重大な脆弱性(Intel SA-00086)が見つかった．
詳細は[Intelによる公式情報](https://www.intel.com/content/www/us/en/support/articles/000025619/software.html)を読んていただくとして，手っ取り早く自分のマシンで対応が必要か調べるには
[Intel-SA-00086 Detection Tool](https://downloadcenter.intel.com/download/27150)を実行すれば良い．

``SA00086_Linux.tar.gz``をダウンロードし，``sudo ./intel_sa00086.py``とし，
``Detection Error: This system may be vulnerable.``が表示されたならば対応が必要だ．

私のマシンでは表示されたので，対応が必要となった．

# Windows PEを利用したパッチ

私が使っているマシンのマザーボードはASUSのH170-PROだ．
ASUSから[対応ツール(MEUpdateTool)が公開](https://www.asus.com/jp/Motherboards/H170-PRO/HelpDesk_BIOS/)されており，Windowsマシンならば，zipマシンを解凍し出てくるexeファイルを実行するだけでよいみたいだ．

しかし，私はOSにDebianを使っている．そう一筋縄ではいかない．
わざわざWindows OSを入れて実行するのは面倒なので，なんとか簡便に済まないかを調べた所，Windows PEを使う方法があるらしい．

- [Updating Intel Management Engine firmware on a Lenovo without a Windows Install](https://www.flamingspork.com/blog/2017/11/22/updating-windows-management-engine-firmware-on-a-lenovo-without-a-windows-install/)

ここに書かれている方法をアレンジして実行すれば良い．

# H170-PROでのパッチ
必要となるものは

- USBメモリ
- 公式からダウンロードしたisoファイルかWindows 7 以降のインストールメディア (32bit用)
- [Asus公式サイト]((https://www.asus.com/jp/Motherboards/H170-PRO/HelpDesk_BIOS/))からダウンロードしたMEUpdateTool (zipファイル)
- [Intel公式サイト](https://downloadcenter.intel.com/ja/download/26136/NUCs--5m-8-1-Windows-10-NUC5i5MYHE)からダウンロードしたIntel Management Engine Driver (zipファイル)
- aptで入るwimtools (mkwinpeimgコマンド用)
- コマンドラインの操作技術
- USBにイメージを焼くための[Rufus](https://forest.watch.impress.co.jp/library/software/rufus/)を実行できるwindowsマシン
    - UNetbootinを使えばLinux上でもUSBにイメージを焼け，windowsマシンは不要かもしれない（未検証）

となる．
これらを使って，パッチファイルを実行するためのミニWindows環境をUSBメモリ内に構築する．
事前に[Windows PEについて知っておくと](https://wiki.archlinux.jp/index.php/Windows_PE)スムーズに事が進む．
手順は次のとおりだ．

1. isoファイルかCDを用意し，マウントする
    - 以下では``/path/to/mounted/windows``にマウントしたと仮定する
2. MEUpdateToolのzipファイルをunzipする
    - 以下では``~/me_update_tool``に解凍したと仮定する
3. Intel Management Engine Driverのzipファイルをunzipし，``WINDOWSDriverPackages/MEI``を``~/me_update_tool``にコピーする
4. ``mkwinpeimg``コマンドでimgファイルを作成する
    - ``mkwinpeimg -W /path/to/mounted/windows -O ~/me_update_tool intel-patch.img``
5. できたimgファイルをUSBメモリに焼く
    - 元記事ではddコマンドで良いと書いてあるが，それで焼くと，ファイルシステムが``ISO 9660``になってしまい，USBブートに失敗した
    - イメージをwindowsマシンにコピーし，Rufusを使ってUSBメモリに焼いた
6. マシンにUSBメモリを刺し，再起動する
7. F2キーを押し，BIOS設定画面に入り，USBメモリから起動する
8. コマンドプロンプトが表示されるので，以下のコマンドを実行する

```
cd \
cd MEI
drvload heci.inf
cd \
cd FW
FWUpdLcl.exe -F ME.bin
```

これで，最後まで処理が進めば，対処完了だ．
``exit``コマンドで再起動がかかるので，その後USBを抜き，あとは普通にLinuxを起動すれば良い．

Linux起動後，``sudo ./intel_sa00086.py``とし，``This system is not vulnerable.``と表示されれば，無事終わっていることが確認できる．


なお，この記事は一部記憶を頼りに書いているので，適宜補足してもらえると助かります

# 余談

あまりネット上に情報がなかったので，色々とハマってしまった．

- 最初64bit用OSを使ってしまい，exeが``必要なサブシステムがありません``というエラーで動かなかった
- ddでUSBメモリに焼いたものでは，Windows PEが起動しなかった．ファイルシステムが``ISO 9660``ではなく``NTFS``でないとダメみたいだ
- ``drvload heci.inf``をしないと，``FWUpdLcl.exe``がうまく動かない
- heci.infファイルだけコピーするとうまくいかない．他のファイルも必要．