
Intel Management Engine JTAG 概念実証 - 2022 手順
すべての情報は教育目的でのみ提供されています。これらの手順は自己責任で実行してください。著者およびその雇用主は、このページに含まれる情報に基づいて行動した、または行動しなかった個人または組織から生じる直接的または結果的な損害または損失について一切責任を負いません。
はじめに
必要なソフトウェア
ペイロードの生成
ロック解除トークンの生成
SPIフラッシュイメージの準備
ファームウェアイメージへのファイル統合
OEM署名の無効化
ファームウェアイメージの構築
メインCPUの立ち上げ
SPIフラッシュへのイメージ書き込み
USBデバッグケーブルの準備
OpenIPC設定ファイルのパッチ適用
OpenIPC設定ファイルの復号化
設定へのLMT Coreの追加
IPC_PATH環境変数の設定
JTAG動作確認の初期チェック
CPU MEスレッドの表示
コアの停止
MEデバッグ: クイックスタート
任意メモリの読み出し
ROMの読み出し
TXEとは?
テスト済みプラットフォーム一覧
著者
ライセンス
脆弱性 INTEL-SA-00086 により、Intel Management Engine コアの JTAG を有効化できます。私たちは Gigabyte Brix GP-BPCE-3350C プラットフォーム向けに [JTAG PoC][8] を開発しました。同じプラットフォームの使用を研究者志望者に推奨しますが、Intel Apollo Lake チップセットを搭載した他メーカーのプラットフォームでも(TXEバージョン 3.0.1.1107 で)PoCをサポートしているはずです。
Gigabyte Brix GP-BPCE-3350Cは広く市販されなくなったため、本手順は代わりにAAEON UP Squared SKU UPS-APLX7-A20-0864(Intel Atom® x7-E3950)を対象とするよう更新されました。このボードを購入する場合は、電源、シリアルアダプタ、および任意のUSB-シリアルアダプタも必ず入手してください。さらに、UP SquaredではDCIデバッグを実行するために基本的なUSBデバッグケーブルのみが必要です。USBデバッグケーブルは、ここに示されている黄色いUSBケーブルのポートに接続する必要があります。
脆弱性 INTEL-SA-00086 は、MFS([内部MEファイルシステム][6])に格納されたファイルを処理する際にバッファオーバーフローを発生させます。完全なファイルパスは /home/bup/ct です。この脆弱性を悪用したバージョンのファイルを、Intel PCHチップセットを搭載したハードウェアのOEMにIntelが提供するIntel System Toolsの1つである Intel Flash Image Tool (FIT) を使ってMEファームウェアに統合する必要があります。
Intel ME (TXE, SPS) System Toolsユーティリティはエンドユーザー向けではないため、Intelの公式Webサイトでは見つけることができません。ただし、一部のOEMはデバイスドライバとともにソフトウェア更新の一部として公開しています。したがって、PoCを統合するには "CSTXE System Tools v3" が必要です。これはここにあります。
JTAGデバッグを実行するにはIntel System Studioをインストールする必要があります。当初の実験では Intel System Studio 2018 を使用しました。本手順はIntel System Studio 2020向けに更新されており、ここから入手できます。
PoCはIntel TXEファームウェアバージョン3.0.1.1107を対象としています。Win-Raidフォーラムの "CSTXE 3.0" イメージリポジトリには、必要なTXEファームウェアバージョンが含まれています。
私たちのスクリプトはすべてPythonで書かれています。Python 2.7の使用を推奨します。また、スクリプトにはpycryptoパッケージが必要です。pycryptoをインストールするには、次のコマンドを実行してください:``` pip install pycrypto
## DCI経由でのベースラインx86デバッグの実行
このガイドの目的は、エクスプロイトを介してME内でJTAGデバッグを可能にすることですが、まずは正常性確認として、DCI経由でUP Squaredボードの通常のJTAGデバッグを実行できることを確認しておくのが良い習慣です。AAEONは、フォーラムで不安定性の原因となると述べたため、同社のBIOSにはDCIを有効化した状態ではもう出荷していません。(また、DCIが有効だったv5.0より前のBIOSバージョンは、DRAMベンダーのハードウェア変更により、新しいハードウェアでは動作しなくなります。) そのため、UP SquaredでDCI JTAGを有効にするには、次の3つの手順を実行する必要があります:
1) Satoshi Tanda が [ここ](https://forum.up-community.org/discussion/comment/12877#Comment_12877) で説明しているバイナリパッチを実行します (ただし、UEFITool 0.28 を使用すべきであり、2.8 ではないことに注意してください)。
2) 起動時にF7を押してBIOS設定メニューに入り、デフォルトのUPパスワード (*upassw0rd*) を入力し、メインメニューから "CRB Setup" -> "CSB Chipset" -> "South Cluster Configuration" -> "Miscellaneous Configuration" -> "DCI Enable (HDCIEN)" まで移動して、これを有効に設定することで、BIOS設定メニューからDCIを有効にします。その後、BIOSセットアップメニューを終了し、設定変更を保存して、システムを再起動します。
3) "C:\IntelSWTools\system_studio_2020\system_debugger_2020\target_indicator\bin\TargetIndicator.exe" を開き、デバッグケーブルを介してそのシステムをUP Squaredに接続したときに、以下のようにDCIが可能であることを示す青色のインジケータが表示されることを確認します:

その後、":\Program Files (x86)\IntelSWTools\sw_dev_tools\system_debugger_2020\system_debug_legacy\xdb.bat" を起動し、ターゲットに接続してブレークし、シングルステップ実行して、ベースラインデバッグ機能があることを確認できます。
(また、Alan Sguigna による [こちらのブログシリーズ](https://www.asset-intertech.com/resources/blog/2020/05/open-source-firmware-explorations-using-dci-on-the-aaeon-up-squared-board/) に従って、このプラットフォーム用のオープンソースコードのDebugビルドを構築する方法もあります。このビルドは、リセットベクタからDCIデバッグが可能です。ただし、DRAMのハードウェア変更により、このソースから構築されたコードは新しいハードウェアでは完全には起動せず、 [ここ](https://forum.up-community.org/discussion/comment/12877) に記載されているように起動時にハングすることに注意してください。Intel TianoCoreのメンテナはこれを修正することを拒否しています。)
# ペイロードの生成
スクリプト **me_exp_bxtp.py** を実行します:```
me_exp_bxtp.py -f <file_name>
このスクリプトは必要なデータを生成し、指定したファイルにエクスポートします(完全なファイルパス、またはカレントディレクトリ内であれば単に名前を指定します。既定値は ct.bin です)。このファイルは後で FIT によって使用されます。
スクリプト utock_gen.py を実行します:``` utock_gen.py -f <file_name>
スクリプトは必要なデータを生成し、指定されたファイルにエクスポートします(完全なファイルパス、または現在のディレクトリ内の場合は単に名前を指定します。デフォルトは *utok.bin*)。このファイルは後で *FIT* によって使用されます。
# SPI Flash イメージの準備
## ペイロードの統合
*ct.bin* ファイルと *utok.bin* ファイルを統合するには、*CSTXE System Tools v3* から取得した *FIT* ユーティリティ(*fit.exe*)を実行します。まず、それを使用して DCI が有効になっている UP Squared BIOS イメージ(例: "UPA1AM61_DCI_Enabled.bin")を開きます。

*FIT* は、イメージを開くと、SPI イメージ全体のさまざまなセクション(SPI ディスクリプタ、UEFI/BIOS ファームウェア、Intel ME ファームウェア、Unlock Token)を抽出し、FIT と同じローカルディレクトリのフォルダ *"image_name"/Decomp* に保存します。

この操作を行ったら、構成 XML を保存し(例: "UPA1AM61_DCI_Enabled.xml")、fit.exe を終了します。
Intel TXE ファームウェアを脆弱性のあるバージョン **3.0.1.1107** にダウングレードするには、<image name>/Decomp/TXE Region.bin ファイルを "3.0.1.1107_B_PRD_RGN.bin" ファイルで置き換える必要があります。これは、元のファイルの名前を "TXE Region.bin.orig" に変更し、次に "3.0.1.1107_B_PRD_RGN.bin" の名前を "TXE Region.bin" に変更することで行います。
fit.exe を再度開き、保存した XML ファイルから構成を再読み込みします。ファイルシステム上のファイルを正しく置き換えた場合は、Flash Layout タブの "Intel(R) TXE Binary File" に、元々表示されていたバージョンの代わりに 3.0.1.1107 と表示されるはずです。

# エクスプロイトファイルのファームウェアイメージへの統合
次に、*/home/bup/ct* 用に生成したファイル(**ct.bin**)と *Unlock Token* 用に生成したファイル(**utok.bin**)を *FIT* で指定する必要があります。*FIT* の *Debug* タブでは、ファームウェアに統合する Trace Hub Binary と Unlock Token を指定できます。これらは、すでに生成したファイルである必要があります。

# OEM 署名の無効化
Platform Protection タブには OEM Public key hash があります。32 個のゼロを入力して削除します:```
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

「Build Settings」を選択

デフォルトでは次のようになります:

これを更新して、outimage.bin を入力ファイルと同じ名前に変更します。また、"Enable Boot Guard warning message at build time" を No に設定し、 "Verify manifest signing keys against the OEM Key Manifest" を No に設定します。その後は次のようになります:

イメージをビルドするには、Build menu の Build Image を選択します。

ここまでの操作がすべて正しく行われていれば、ビルドプロセスは成功し、FIT は次のようなコンソールメッセージを出力します:

このエクスプロイトを機能させるには、HAPモードを有効にする必要があります。fit.exe によってビルドされた出力ファイル内の、オフセット +0x102 にあるバイトのビットインデックス 0 を、16進エディタで手動で 1 に設定する必要があります:

プロセスの最後には、ここ で提供されているサンプルファイルと同様のファイルが得られるはずです。ただし、これは UP BIOS バージョン 5.2 用であり、前述の手順はバージョン 6.1 用です。
SPIフラッシュにイメージを書き込むには、SPIプログラマ(Dediprog SF600Plus など)の使用を強くお勧めします。
問題が発生した場合に復元できるよう、元のファームウェアを必ずバックアップしてください!
プラットフォームに接続するには、USB 3.0デバッグケーブル が必要です。専用に作られたものを 購入 するか、USB 3.0 AM–AM ケーブルから D+、D-、Vcc の各コンタクトを絶縁して自作してください。

Intelは、プラットフォームとメインCPUのJTAGデバッグに使用できる2つのソフトウェアパッケージを開発し、ユーザーに提供しています:DAL(DFx Abstraction Layer)と OpenIPC です。DAL と OpenIPC はどちらも Intel System Studio の一部です。Intel System Studio 2020 をインストールすると、OpenIPC は次のディレクトリに表示されます:
Windows``` C:\IntelSWTools\system_studio_2020\tools\OpenIPC_1.2035.4868.100
*OpenIPC* の構成は暗号化されており、TXE コアをサポートしていません。そのため、構成を復号化して、TXE の記述を追加します。
## OpenIPC 設定ファイルの復号化
設定ファイルを復号化するには、[IDA Pro](https://www.hex-rays.com/products/ida/support/download_freeware.shtml) スクリプト *openipc_key_extract.py* を使用して、*OpenIPC/Bin* にある *StructuredData* ライブラリ (*StructuredData_x64.dll*) からキーを抽出します。スクリプトが機能しない場合は、IDA Pro でファイルを開き、文字列 "Logging.xml" を検索して、その位置から次のアライメントに揃えた後の 16 バイトを取得するだけです。(4 バイトの余分なデータがあり、その後、注目する 16 バイトの後に 4 バイトのゼロがあります。) キー (この場合は *F820AD4F6CC2E9EE050C43DEBF631F59*) を、OpenIPC ディレクトリへのパスとともにスクリプト *config_decryptor.py* に渡します。```
config_decryptor.py –k F820AD4F6CC2E9EE050C43DEBF631F59 –p C:\IntelSWTools\system_studio_2020\tools\OpenIPC_1.2035.4868.100
提供されているOpenIPCのバージョンには、TXEコアに関する必要な情報が含まれていません。そのため、復号化されたOpenIPC設定ファイルにパッチ(patch.diff)を適用する必要があります。手順は以下のとおりです。``` patch -p2 < patch.diff
# IPC_PATH 環境変数の設定
復号化とパッチ適用後、*IPC_PATH* 環境変数を新しい *OpenIPC* ディレクトリに設定して、*ipccli* が変更された *OpenIPC* バージョンを使用するようにします。例:
Windows```
set IPC_PATH=C:\IntelSWTools\system_studio_2020\tools\OpenIPC_1.2035.4868.100\Bin
activatorは、JTAGがアクティブ化された後、BUPプロセスをループさせ続けることで、それ以降のロードをブロックします。起動後、プラットフォームは生命反応を示しません(モニターがオンにならず、キーボードインジケーターも点灯せず、BIOS POSTサウンドも再生されません)。したがって、DCIデバッグを介して、プラットフォームがBUPモジュールで「スタック」していることを確認する必要があります。
DALと同様に、OpenIPCライブラリにはコマンドラインインターフェイス(CLI)が含まれており、Pythonで記述され、Intel System Studioの一部としてPython用ライブラリとして提供されています。これはpipを使用してシステムにインストールできます。
ipccliのインストールパッケージは次のパスにあります: Windows``` C:\IntelSWTools\system_studio_2020\system_debugger_2020\debugger\ipccli\ipccli-1.2035.1920.100-py2.py3-none-any.whl
ipccli をインストールするには、次のコンソールコマンドを実行します。```
pip install ipccli-1.2035.1920.100-py2.py3-none-any.whl
インストール後、ipccli は、対応するPythonバージョン(pipが呼び出されたバージョン)のランタイム内で利用可能になります。 OpenIPC を使い始めるには、管理者コマンドプロンプトからPythonコンソールで次のコマンドを実行してください:``` import ipccli ipc = ipccli.baseaccess()
DCIを介してターゲットプラットフォームに接続するメカニズムが起動し、次のコンソール出力が表示されます:

接続が確立されない場合(たとえば、プラットフォームの電源が入っていない、またはDCI経由で物理的に接続されていない場合)は、次のようなメッセージが表示されます:

*DCI* 接続が成功した場合は、*DFX_AGGRAGATOR* デバイスの *PERSONALITY* レジスタが3であることを確認してください。
*PERSONALITY* レジスタの *IR* (*命令レジスタ*) コードは *0x54* です。これを読み取るには、次のコマンドを実行します:```
dfx_agg = ipc.devs.mdu_dfx_agg_tap0
ipc.irdrscan(dfx_agg, 0x54, 32)
そのコマンドの実行結果は次のようになります:

ipccli ユーティリティにはかなり詳細な HTML ドキュメントが付属しており、ipccli Python パッケージのフォルダーにあります。``` \Lib\site-packages\ipccli\html\Index.html
## CPU ME スレッドを表示
前の手順が正しく実行されている場合、*ipccli* を介してプラットフォームへの接続が行われると、*TXE* コアは *CSE Tap* を介してアクセス可能になり、*ipccli* は次の *ipccli* パスを適用することでアクセスを許可します:```
ipc.devs.cse_c0.threads[0]
しかし、PoC はメイン CPU が初期化されるまでプラットフォームのロードをブロックするため、そのコアは JTAG 経由ではアクセスできず、ME コアは以下のコマンドでアクセスできます:``` ipc.threads[0]
## コアの停止
MEプロセッサの命令を停止するには、次のコマンドを実行します:```
me = ipc.devs.cse_c0.threads[0]
me.halt()
CPUプロセッサの命令を停止するには、次のコマンドを実行します:``` core = ipc.threads[0] core.halt()

コンソールには、停止が行われた命令の論理アドレスが表示されます。
## 任意のメモリの読み取り
*OpenIPC* は停止後のメモリ読み取りを可能にします。例:```
ipc.threads[0].mem("0xf0080004P", 4)
論理アドレス(sel:offset)、リニアアドレス(L修飾子)、または物理アドレス(P修飾子)を指定できます。
MEシステムエージェント(MISA)を使用すると、ROM領域の初期物理アドレス(MEリセットベクタを含む)を取得できます。ROMアドレスは、オフセット0xe20のMISA MMIO(0xf0000000P)にあるHunit ROM Memory Base(HROMMB)レジスタを介して取得できます:

ROMは常にROMBASEから0xffffffffまでに存在します ROMをファイルにコピーするには、次のコマンドを実行します:``` ipc.threads[0].memsave("", "0xfffe0000p", 0x20001)
サイズは *0x20000* ではなく *0x20001* と指定することが重要です(そうしないと、32ビットの *ME* コアでは不可能な64ビットアクセスが原因で、*OpenIPC* に問題が発生します)。ファイルの最後のバイトは *ROM* の一部ではないため、破棄してもかまいません。
# なぜ TXE なのか?
このプラットフォームは、特別な [Intel CCA-SVT](https://designintools.intel.com/Silicon_View_Technology_Closed_Chassis_Adapter_p/itpxdpsvt.htm) アダプターなしでもデバッグの機会が増え、通常の *USB デバッグケーブル* を介して *TXE* コアの最も初期の段階をデバッグできます。
## 関連URL:
[Intel ME: 静的解析への道][4]
[Intel DCI の秘密][5]
[Intel ME: フラッシュファイルシステムの解説][6]
[電源を切ったコンピュータをハックする方法、または Intel Management Engine で未署名コードを実行する方法][7]
[Intel Management Engine の内部][8]
[未公開モードによる Intel ME 11 の無効化][9]
## テスト済みプラットフォーム一覧
* Gigabyte Mini-PC Barebone (BRIX) GB-BPCE-3350C (rev:1.1, 1.2)
* Beelink M1
* [MinisForum N33](https://github.com/HackingThings/MinisForum_N33_JTAG) Mini PC - 2021
* UP Squared Intel Atom® x7-E3950 [SKU UPS-APLX7-A20-0864](https://up-shop.org/up-squared-series.html) - 2022
* UP 4000 Intel Atom® x7-E3950 [SKU UP-APL03X7F-A10-0464](https://up-shop.org/up4000series.html) - 2022
# 著者
Mark Ermolov ([@\_markel___][1])
Maxim Goryachy ([@h0t_max][2])
### Intel System Studio 2020 & UP Squared ハードウェア向け README.md の更新
Xeno Kovah ([@XenoKovah][10])
# 研究チーム
Mark Ermolov ([@\_markel___][1])
Maxim Goryachy ([@h0t_max][2])
Dmitry Sklyarov ([@_Dmit][3])
# ライセンス
Copyright (c) 2018 Mark Ermolov, Maxim Goryachy at Positive Technologies
ここに、本ソフトウェアおよび関連文書ファイル(以下「本ソフトウェア」)の複製を取得するすべての人に対し、本ソフトウェアを無制限に扱うことを無償で許可します。これには、使用、複製、変更、結合、公開、頒布、サブライセンス、および/または販売する権利、ならびに本ソフトウェアを提供された相手に同じことを許可する権利が含まれますが、これらに限定されません。許諾は以下の条件に従うものとし、上記の著作権表示およびこの許諾表示は、本ソフトウェアのすべての複製または重要な部分に含まれるものとします。
本ソフトウェアは「現状のまま」で提供され、明示的か黙示的かを問わず、商品適格性、特定目的に対する適合性、および非侵害についての黙示的保証を含め、いかなる保証もありません。いかなる場合においても、著作者または著作権保持者は、契約、不法行為、その他の原因を問わず、本ソフトウェアまたは本ソフトウェアの使用もしくはその他の取り扱いに関連して生じるいかなる請求、損害、その他の責任も負いません。
[1]: https://twitter.com/_markel___
[2]: https://twitter.com/h0t_max
[3]: https://twitter.com/_Dmit
[4]: https://www.troopers.de/troopers17/talks/772-intel-me-the-way-of-the-static-analysis/
[5]: http://conference.hitb.org/hitbsecconf2017ams/sessions/commsec-intel-dci-secrets/
[6]: https://www.blackhat.com/docs/eu-17/materials/eu-17-Sklyarov-Intel-ME-Flash-File-System-Explained-wp.pdf
[7]: https://www.blackhat.com/docs/eu-17/materials/eu-17-Goryachy-How-To-Hack-A-Turned-Off-Computer-Or-Running-Unsigned-Code-In-Intel-Management-Engine-wp.pdf
[8]: https://github.com/ptresearch/IntelME-JTAG
[9]: http://blog.ptsecurity.com/2017/08/disabling-intel-me.html
[10]: https://twitter.com/XenoKovah