
インテル マネジメント・エンジン JTAG 概念実証
すべての情報は教育目的のみで提供されています。これらの手順は自己責任で実行してください。著者およびその雇用者は、このページに含まれる情報に基づいて行動した、または行動しなかった個人または組織から生じる直接的または結果的な損害または損失について、一切責任を負いません。
はじめに
必要なソフトウェア
ペイロードの生成
アンロックトークンの生成
SPIフラッシュイメージの準備
ファームウェアイメージへのファイルの統合
OEM署名の無効化
ファームウェアイメージの構築
メインCPUの起動
SPIフラッシュへのイメージ書き込み
USBデバッグケーブルの準備
OpenIPC設定ファイルのパッチ適用
OpenIPC設定ファイルの復号
設定へのLMTコアの追加
IPC_PATH環境変数の設定
JTAG動作確認の初期チェック
CPU MEスレッドの表示
コアの停止
MEデバッグ:クイックスタート
任意メモリの読み取り
ROMの読み取り
なぜTXEなのか?
テスト済みプラットフォーム一覧
著者
ライセンス
脆弱性 INTEL-SA-00086 により、Intel Management Engine コアの JTAG を有効化できます。私たちは Gigabyte Brix GP-BPCE-3350C プラットフォーム向けに JTAG PoC を開発しました。将来の研究者には同じプラットフォームを使用することをお勧めしますが、Intel Apollo Lake チップセットを搭載した他メーカーのプラットフォームでも(TXEバージョン 3.0.1.1107 で)PoC が動作するはずです。
脆弱性 INTEL-SA-00086 は、MFS(内部MEファイルシステム)に格納されたファイルを処理する際のバッファオーバーフローに関係します。完全なファイルパスは /home/bup/ct です。これを、Intel PCH チップセットをベースにしたハードウェアの OEM に Intel が提供する Intel システムツールの1つである Intel Flash Image Tool (FIT) を使用して、ME ファームウェアに統合する必要があります。 Intel System Tools パッケージのルートディレクトリの構造は次のとおりです:

Intel ME (TXE, SPS) System Tools ユーティリティはエンドユーザー向けではありません。そのため、公式 Intel Web サイトにはありません。ただし、一部の OEM はデバイスドライバとともにソフトウェアアップデートの一部として公開しています。したがって、PoC を統合するには、オンラインで入手できる Intel TXE System Tools バージョン 3.x が必要です。
Intel System Studio をインストールする必要があります。試用版は Intel のサイトからダウンロードできます。私たちの実験では、Intel System Studio 2018 を使用しました。
PoC は Intel TXE ファームウェアバージョン 3.0.1.1107 を対象としています。Gigabyte GB-BPCE-3350C バージョン F5 の SPI フラッシュイメージには、必要なファームウェアバージョンが含まれています。
私たちのスクリプトはすべて Python で書かれています。Python 2.7 を使用することをお勧めします。 また、スクリプトには pycrypto パッケージが必要です。pycrypto をインストールするには、次のコマンドを実行します:
pip install pycrypto
このユーティリティは、CPU を起動する必要がある場合にのみ必要です。
EFI Human Interface Infrastructure (HII) は、UEFI でユーザーインターフェースを作成し、ユーザー入力を処理・管理するための特別なメカニズムです。EFI HII は、非表示のオプションを含むすべてのオプションのデフォルト値を特定します。DCI に関連するオプションが見つかれば、それをデフォルト設定用に有効化でき、BIOS の工場出荷時設定を復元することで DCI を有効にできます。メイン CPU を起動するには、オンラインでも入手できる AMI BIOS Configuration Program バージョン 5.xx が必要です。
スクリプト me_exp_bxtp.py を実行します:
me_exp_bxtp.py -f <file_name>
このスクリプトは必要なデータを生成し、指定したファイルにエクスポートします(完全なファイルパス、またはカレントディレクトリ内であれば単に名前を指定します。デフォルトは ct.bin です)。このファイルは後で FIT によって使用されます。
スクリプト me_utok_bxtp.py を実行します:
me_utok_bxtp.py -f <file_name>
このスクリプトは必要なデータを生成し、指定したファイルにエクスポートします(完全なファイルパス、またはカレントディレクトリ内であれば単に名前を指定します。デフォルトは utok.bin です)。このファイルは後で FIT によって使用されます。
CPU を起動する必要がない場合は、この手順をスキップしてください。
DCI Enable オプションを有効にするには、AMIBCP ユーティリティを実行し、プラットフォームに付属の SPI ファームウェアイメージを開きます。Gigabyte Brix GP-BPCE-3350C の場合、上記の Gigabyte リンクからダウンロードしたファイルを開きます(アーカイブ内のイメージファイルのパス: F5/image.bin)。

次に、Setup Configuration タブで HDCIEN オプションを有効にする必要があります。
ct.bin ファイルと utok.bin ファイルを統合するには、FIT ユーティリティ(fit.exe)を実行し、SPI ファームウェアイメージを開きます。

他のハードウェアプラットフォームを使用していて TXE 3.0.1.1107 を利用できない場合は、Gigabyte GB-BPCE-3350C バージョン F5 の SPI Flash イメージをダウンロードし、FIT を使用して TXE セクションを抽出できます。FIT は、イメージを開くと SPI イメージ全体のさまざまなセクション(SPI デスクリプタ、UEFI/BIOS ファームウェア、Intel ME ファームウェア、アンロックトークン)を抽出し、*"image_name"/Decomp * フォルダに保存します。

これにより、必要な Intel TXE ファームウェアを含むファイルを /Decomp/TXE Region.bin で見つけることができます。 次に、FIT で特定のプラットフォーム用の SPI イメージを開き、Intel TXE ファームウェアを含むファイルを GB Brix 3350c イメージから取得したバージョンに置き換えます(Flash Layout タブの "Intel(R) TXE Binary File")。

次に、FIT で、/home/bup/ct と Unlock Token 用に生成したファイルを指定する必要があります。FIT の Debug タブで、ファームウェアに統合する Trace Hub Binary と Unlock Token を指定できます。これらは、すでに生成したファイルである必要があります。

FIT から OEM Public Key Hash フィールドを削除するだけです:

Build メニューの Build Image を選択してイメージを構築します。

BootGuard 設定に関するメッセージは無視します("Yes" をクリック):

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

CPU を起動する必要がない場合は、この手順をスキップしてください。
CPU を起動するには HAP モードを有効にする必要があります。オフセット +0x102 のバイトの 0 ビットをセットする必要があります:

SPIフラッシュにイメージを書き込むには、SPIプログラマの使用を強くお勧めします。
何か問題が発生した場合に復元できるよう、必ず元のファームウェアをバックアップしてください!
プラットフォームに接続するには、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 2018 のインストール後、OpenIPC は次のディレクトリにあります:
Windows
C:\Intel\OpenIPC_1.1740.2381.100
Linux
/opt/intel/system_studio_2018/system_debugger_2018/debugger/openipc
OpenIPC の設定は暗号化されており、TXE コアをサポートしていません。したがって、設定を復号し、TXE の説明を追加してください。
設定ファイルを復号するには、IDA Pro スクリプト openipc_key_extract.py を使用して、OpenIPC/Bin 内の StructuredData ライブラリ(linux: libStructuredData_x64.so、Windows: StructuredData_x64.dll)からキーを抽出します。そのキー(この場合、4504fb02be0a9c4c84df2a89cf508bc3)を、OpenIPC ディレクトリへのパスとともにスクリプト config_decryptor.py に渡します。
config_decryptor.py –k 4504fb02be0a9c4c84df2a89cf508bc3 –p C:\Intel\OpenIPC
提供されている OpenIPC のバージョンには、TXE コアに関する必要な情報がありません。そのため、復号した OpenIPC 設定ファイルにパッチ(patch.diff)を適用する必要があります。手順は次のとおりです:
patch -p2 < patch.diff
復号とパッチ適用後、ipccli が変更された OpenIPC バージョンを使用するように、IPC_PATH 環境変数を新しい OpenIPC ディレクトリに設定します。例:
Windows
set IPC_PATH=c:\Intel\OpenIPC\Bin
activator は、JTAG が有効化された後、BUP プロセスをループさせ続けることで、その後のロードをブロックします。起動後、プラットフォームは生命反応を示しません(モニタは点灯せず、キーボードのインジケータも点灯せず、BIOS POST サウンドも再生されません)。したがって、DCI デバッグを介して、プラットフォームが BUP モジュールで「スタック」していることを確認する必要があります。
DAL と同様に、OpenIPC ライブラリにはコマンドラインインターフェース (CLI) が含まれています。これは Python で書かれており、Intel System Studio の一部として Python 用ライブラリとして提供され、pip を使用してシステムにインストールできます。 ipccli のインストールパッケージは次のパスにあります:
Windows
<Program Files(x86)>\IntelSWTools\system_debugger_2018\debugger\ipccli\ ipccli-1.1740.544.100-py2.py3-none-any.whl
Linux
/opt/intel/system_studio_2018/system_debugger_2018/debugger/ipccli/ipccli-1.1811.727.100-py2.py3-none-any.whl
ipccli をインストールするには、次のコンソールコマンドを実行します:
pip install ipccli-1.1740.544.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(Instruction Register)コードは 0x54 です。読み取るには、次のコマンドを実行します:
dfx_agg = ipc.devs.mdu_dfx_agg_tap0
ipc.irdrscan(dfx_agg, 0x54, 32)
そのコマンドの結果は次のようになります:

ipccli ユーティリティにはかなり詳細な HTML ドキュメントが付属しており、ipccli Python パッケージのフォルダにあります:
<Python Dir>\Lib\site-packages\ipccli\html\Index.html
ここまでの手順が正しく実行されていれば、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)を使用すると、ME リセットベクタを含む ROM 領域の初期物理アドレスを取得できます。ROM アドレスは、オフセット 0xe20 にある MISA MMIO(0xf0000000P)の Hunit ROM Memory Base(HROMMB)レジスタから取得できます:

ROM は常に ROMBASE から 0xffffffff までに存在します。 ROM をファイルにコピーするには、次のコマンドを実行します:
ipc.threads[0].memsave("<file path>", "0xfffe0000p", 0x20001)
サイズは 0x20000 ではなく 0x20001 と指定することが重要です(そうしないと、32 ビット ME コアでは不可能な 64 ビットアクセスの問題により、OpenIPC が問題に遭遇します)。ファイルの最後のバイトは ROM の一部ではないため、破棄してかまいません。
このプラットフォームは、特別な Intel CCA-SVT アダプタなしでデバッグするためのより多くの機会を提供し、通常の USB デバッグケーブル を介して TXE コアの最も初期の段階をデバッグできます。
電源が切れたコンピュータをハッキングする方法、または Intel Management Engine で未署名コードを実行する方法
Mark Ermolov (@_markel___)
Maxim Goryachy (@h0t_max)
Mark Ermolov (@_markel___)
Maxim Goryachy (@h0t_max)
Dmitry Sklyarov (@_Dmit)
Copyright (c) 2018 Mark Ermolov, Maxim Goryachy at Positive Technologies
本ソフトウェアおよび関連文書ファイル(以下「本ソフトウェア」)のコピーを入手したすべての人に対し、本ソフトウェアを無償で使用、複製、変更、結合、公開、配布、サブライセンス、および/または販売する権利、ならびに本ソフトウェアを提供された者にこれらの行為を許可する権利を、以下の条件に従うことを条件として付与します。上記の著作権表示およびこの許可表示は、本ソフトウェアのすべてのコピーまたは主要部分に含めるものとします。
本ソフトウェアは「現状のまま」で提供され、商品性、特定目的への適合性、および非侵害性の保証を含むがこれらに限定されない、明示的または黙示的な保証は一切ありません。著者または著作権保持者は、契約、不法行為、またはその他の理由を問わず、本ソフトウェアに関連して生じたいかなる請求、損害、その他の責任についても、一切の責任を負いません。