Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CustomProcessingUnit — The first analysis framework for CPU microcode | Kitploit
ツール/GitHubGitHub/pietroborrello/customprocessingunit
Static AnalysisDynamic Code Analysis (DAST)ExploitationReverse EngineeringDebuggersHardware SecurityPayload DevelopmentFirmware Analysis
GitHubpietroborrello/customprocessingunit

CustomProcessingUnit

The first analysis framework for CPU microcode

リポジトリを見る
411273年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Custom Processing Unit

DOI

Custom Processing Unit は、CPU マイクロコードをソフトウェアレベルでフック、パッチ、トレースできる初の動的解析フレームワークです。

これは、Intel CPU 内の CRBUS へのアクセスを可能にする未公開命令を活用することで動作します。 私たちはマイクロコード逆コンパイラを用いて、CPU が CRBUS をどのように使用しているかをリバースエンジニアリングし、その相互作用を再現することで CPU を完全に制御します。

静的解析フレームワークは、このフォルダ内のサブツリー、または https://github.com/pietroborrello/ghidra-atom-microcode にあります。

この研究を説明するスライドはこちらです。

注意: Custom Processing Unit は Red-Unlocked CPU を必要とします。現在、Goldmont CPU (GLM) のみが公開されている Red Unlock を持っています。CPU stepping 0x9 および 0xa (cpuid 0x000506C9 および 0x000506CA) の Gigabyte GB-BPCE-3350C でテストしました。

Custom Processing Unit は、UEFI アプリケーションといくつかのライブラリで構成されています。UEFI アプリケーションは GLM CPU と対話し、ライブラリはマイクロコードを UEFI アプリケーションにコンパイルし、その出力を解析するためのさまざまなヘルパーを提供します。

前提条件

  1. https://github.com/ptresearch/IntelTXE-PoC の手順に従って Goldmont CPU の Red Unlock を行います。
  2. EFI シェル付きの起動可能な USB キーを作成します。
  3. メインのホストに gnu-efi をインストールします。

セットアップ

root@kitploit:~
GNU_EFI_DIR=<path_to_gnu_efi> make

これにより、ソースのマイクロコードファイルと UEFI アプリケーションが cpu.efi にビルドされます。 cpu.efi を USB キーの \EFI\ フォルダにコピーし、GLM に挿入して EFI シェルで起動します。

EFI シェルで map -r を実行して USB キーデバイスを特定し、<deviceid>: でマウントします。

Custom Processing Unit を実行する

./cpu.efi を実行するとヘルプが表示されます:

root@kitploit:~
Usage:
  patch:        <tool> p
  patch & exec: <tool> x
  perf:         <tool> f
  zero out m&p: <tool> z
  hook:         <tool> h  [m&p idx] [uop addr] [patch addr]
  template:     <tool> m
  dump imms:    <tool> di
  dump rom:     <tool> dr
  dump msrs:    <tool> dm
  dump SMM:     <tool> ds [address] [size]
  cpuid:        <tool> c  [rax] [rcx]
  rdmsr:        <tool> rm [msr]
  wrmsr:        <tool> wm [msr]
  read:         <tool> r  [cmd] [addr]
  write:        <tool> w  [cmd] [addr] [value]
  invoke:       <tool> i  [addr]
  update ucode: <tool> u  [size]
  ldat read:    <tool> lr [port] [array] [bank] [idx] [addr] [optional size]
  ldat write:   <tool> lw [port] [array] [bank] [idx] [addr] [value]

簡単な命令

cpu は、コマンドラインから簡単な命令を実行するためのヘルパーを提供します:

  • cpuid
  • rdmsr
  • wrmsr

複雑なアクション

cpu は、CPU の動作を研究するために実行すると興味深い、複雑な CPU ルーチンへのインターフェースを提供します:

  • u: 提供された(署名付き)パッチで CPU ucode を更新します
  • f: マイクロコード実行中にパフォーマンスカウンタを収集します

生の udbgrd と udbwr

cpu は、未公開命令 udbrd と udbgwr への生のインターフェースを提供します。 それらが提供する最も興味深いコマンドは次のとおりです:

  • 0x0: CRBUS にアクセス
  • 0x10: UROM にアクセス
  • 0x40: stgbuf にアクセス
  • 0xd8: アドレスから ucode ルーチンを呼び出し

LDAT アクセス

cpu は、読み書きするための LDAT アクセスルーチンを公開します。そこでの読み書きにはパラメータ [port] [array] [bank] [idx] [addr] を指定します。 興味深いポートは次のとおりです:

  • 0x6a0: 内部の ucode ROM と RAM にアクセスできるマイクロコードシーケンサ
  • 0x120: ロード/ストアバッファ
  • 0x3c0: 命令キャッシュ
  • 0x630: ITLB

これらの内部コンポーネントの一部にアクセスすると、CPU がフリーズする可能性があることに注意してください。

マイクロコードのパッチ

cpu は、マイクロコードにパッチをインストールする機能を提供します。

  1. bios/ucode_patches/ucode_patch.u にマイクロコードパッチを記述します(例については他のパッチを参照してください)
  2. UEFI アプリケーションをビルドします
  3. cpu.efi p を実行して、.org で指定されたアドレスにパッチをインストールします。

マイクロコード内では、0x7c00 から 0x7e00 の間のアドレスのみが書き込み可能で、パッチに意味があることに注意してください。

cpu.efi x を実行すると、パッチされたマイクロコードも実行され、結果として rax, rbx, rcx, rdx レジスタが出力されます。

マッチ & パッチ

特定の CPU イベントまたはマイクロコードポイントでマイクロコードを自動的に実行するために、cpu は Match and Patch を活用します。 フックするマイクロコードアドレスと、フックがトリガーされたときにジャンプするマイクロコードアドレスを定義します。

  • z: すべてのマッチ & パッチをリセットします。
  • h: インデックス(0-0x20)、フックするアドレス(0-0x7c00)、実行するターゲットアドレス(0x7c00-0x7e00)を指定してフックをインストールします。

マイクロコードのトレース

複数のフックをインストールし、命令を継続的に実行することで、cpu はその命令によって実行されるマイクロオペレーションをトレースし、ダンプすることができます。トレースするには:

  1. get_trace_clock_at() 内の // [TRACED INSTRUCTION HERE] の後にトレースする命令を記述します。
  2. UEFI アプリケーションをビルドします。
  3. cpu.efi m でトレースします。 ヒットしたすべてのアドレスを含む trace.txt ファイルが作成されます。
  4. uasm-lib/uasm.py -t trace.txt > parsed_trace.txt を実行します。 命令中に実行されたマイクロコードの完全なトレースが生成されます。

uasm.py は、フォルダ内の ms_arrayX.txt ファイルを利用して、実行されたマイクロ命令の逆アセンブルを生成することに注意してください。これらは stepping 0x9 (cpuid 0x000506C9) の GLM 用です。異なる stepping の場合は、適切な配列を生成してください。 この目的には LDAT ダンプ機能を使用できます。

シークレットメモリダンパー

CPU にはアーキテクチャからはアクセスできないさまざまなバッファがあり、それらをダンプするためのルーチンを提供します:

  • smm: SMROM (または SMM 保護を無効にしながらの他の任意のアドレス)
  • rom: 内部 ROM
  • imms: CPU にハードコードされた即値
  • msrs: 内部 MSR 構成

マイクロコードパッチの作成

cpu.efi UEFI アプリケーションにコンパイルされるヘッダファイルを生成するアセンブラを提供します。 構文については、bios/ucode_patches にある提供されたパッチを参照してください。 単純な操作とラベルをサポートしています。 uasm.py -i ucode_patch.u -o ucode_patch.h でマイクロコードパッチをアセンブルします。 cpu.efi がコンパイルされ、適用したいマイクロコードパッチが自動的に含まれます。

例

file: code_patch.u

root@kitploit:~
.org 0x7c00

rax:= ZEROEXT_DSZ32(0x00001337)
rbx:= ZEROEXT_DSZ32(0x00001337)
rcx:= ZEROEXT_DSZ32(0x00001337)
rdx:= ZEROEXT_DSZ32(0x00001337)

再コンパイルして、GLM で次のコマンドを実行します:

root@kitploit:~
cpu.efi z # zero out match & patch
cpu.efi p # apply the patch
cpu.efi h 0 0x0428 0x7c00 # rdrand entry point

これで、rdrand が実行されるたびに、レジスタに 0x1337 が返されます。

引用

私たちの研究は WOOT 2023 の論文として発表されました:

root@kitploit:~
@inproceedings{Borrello2023CustomProcessingUnit,
    title = {{CustomProcessingUnit}: Reverse Engineering and Customization of Intel Microcode},
    author = {Borrello, Pietro and Easdon, Catherine and Schwarzl, Martin and Czerny, Roland and Schwarz, Michael},
    booktitle = {IEEE Workshop on Offensive Technologies (WOOT 23)},
    year = {2023},
}

実験

論文で説明されている実験は次のコマンドで実行できます:

root@kitploit:~
cpu.efi e [exp_idx]

[exp_idx]:

  1. 高速 ucode ブレークポイント
  2. 定数時間 ucode 除算
  3. x86 PAC
  4. PACMAN による x86 PAC 攻撃
  5. 条件付きハードウェアブレークポイント
ツールをダウンロード