新たなSpectre-v2系攻撃「BTR」、Linuxカーネルメモリからrootパスワードハッシュを窃取

新たに公開された攻撃手法「Branch Target Reuse(BTR)」は、ジャストインタイム(JIT)コードに残った古い間接分岐の予測を悪用し、Linuxカーネルメモリから機密データを漏えいさせます。

エンドツーエンドの概念実証(PoC)では、対策を有効にした最新のIntel環境でも、suプロセスのメモリからrootパスワードのハッシュを取り出すことに成功しました。

BTRが突くのは、プロセッサが認識するアーキテクチャ上のコードと、分岐ターゲットバッファ(BTB)に保持される予測状態とのずれです。最近のプロセッサは、コードが書き換えられたり解放されたり置き換えられたりしても、コードの整合性を正しく回復します。

ところが、古い間接分岐先を指すBTBエントリが残ることがあります。JITメモリが再利用される際、攻撃者は旧領域の一部に新しいコードを配置させ、CPUに古いターゲットへ投機的に実行させることができます。

結果として、投機的な「解放後実行(execute-after-free)」のプリミティブが成立します。プロセッサは陳腐化した予測に従い、攻撃者が影響を及ぼせる新規生成コードへ一時的に分岐します。そこにディスクロージャーガジェットがあると、秘密に依存するデータがマイクロアーキテクチャのサイドチャネルを通じて露出します。

アーキテクチャ上の実行結果は最終的に修正されます。しかし、投機実行中に生じたキャッシュ状態の痕跡を測定すれば、漏えいした値を復元できます。

Vusecの研究チームは、LinuxのクラシックBerkeley Packet Filter(cBPF)のJITコンパイラに対する完全なエクスプロイトを構築しました。攻撃では、トレーニング用とターゲット用の2つのseccompフィルタプログラムを作成します。

まず攻撃者はトレーニング用プログラムをインストールして実行し、間接分岐先をBTBに学習させます。次にそのプログラムを削除し、JITエンジンに、一部が再利用されたメモリ領域へターゲット用プログラムを割り当てさせます。

同じ間接分岐が再び実行されると、CPUは以前のトレーニング用プログラムのエントリポイントへ投機的にジャンプすることがあります。そのアドレスには、すでにターゲット用プログラムの一部が置かれています。

研究者らは、4バイトの即値の中にガジェットを配置し、アラインされていないオフセットから実行を開始させることで、攻撃者が制御するディスクロージャーロジックの投機実行を実現しました。PoCの漏えい速度は、報告によると毎秒約8バイトです。

この速度でも攻撃は成立しました。エクスプロイトがポインタチェイシングを用いるためです。Linuxカーネルのタスクリストをたどり、PIDで標的プロセスを特定します。続いてメモリ管理構造にアクセスし、マップされたページを走査して、suが読み込んだrootパスワードのハッシュを探し出します。

Vusecは、bpf_jit_harden設定で制御されるオプションの実行時防御であるLinuxのcBPF定数ブラインディングも回避しました。この手法は、攻撃者が制御するバイトを即値に置く代わりに、有用な命令バイトを前方ジャンプのオフセットにエンコードします。

同じバイト列は、通常のアラインメントで実行すれば正当なcBPFコードのままです。しかし2バイト後ろから実行を開始すると、投機的なディスパッチガジェットとして機能します。

これが重要なのは、より高機能なeBPF JITが制限されている環境でも、cBPFはseccompやLinuxのソケットフィルタリング経路を通じて、非特権プロセスから到達できるためです。

このため、信頼できないコードの実行を許可するシステムでは、この攻撃が現実的なローカル攻撃面となります。研究チームはBTRについて、MozillaのFirefoxが使うSpiderMonkeyとOracle GraalVMでも評価しました。

SpiderMonkeyについて、Vusecは、JITコードの解放・再割り当て後も古いBTBエントリが残りうることを確認しました。これにより、WebAssemblyのリテラルプールへの投機的ジャンプが可能となり、投機的な任意コード実行につながる可能性もあります。ただし、ブラウザに対するエンドツーエンドのエクスプロイトは完成していません。

GraalVMでは、サンドボックス化されたゲストコードのメモリアクセスを制限するためのマスキング処理を、BTRによって投機的に回避できました。Oracleは、JITコードキャッシュの配置をランダム化して領域の確実な再利用を難しくし、このリスクを緩和しています。

Linuxカーネルの開発者は、CVE-2026-64507とCVE-2026-64508でこの問題に対処しました。カーネルの修正では、BPF JITメモリの再利用時にx86でIndirect Branch Prediction Barrier(IBPB)のフラッシュを行います。これにより、古い分岐予測エントリが新たに割り当てられたJIT領域へ持ち越されるのを防ぎます。

この強化策は、BPF JITを使用しており、かつSpectre-v2対策が有効な場合に適用されます。管理者は最新のカーネルアップデートを適用し、影響を受けるJITランタイムについてはベンダーのガイダンスを確認してください。

x86のIBTやArmのBTIは、悪用の難易度を上げる可能性があります。しかし研究者らは、これらでBTRのリスクが完全になくなるわけではないと述べています。ターゲットの検証前に投機実行が起こりうるほか、攻撃者が作成した有効なランディングシーケンスに到達する場合もあるためです。

1万6,000以上のSOCチームがANY.RUNを活用し、脅威調査を効率化して手作業を減らしています。チームで試してみる

翻訳元: https://cyberpress.org/new-btr-spectre-v2-attack/

本記事は cyberpress.org の記事を翻訳・要約したものです。