オランダのアムステルダム自由大学(Vrije Universiteit Amsterdam)のVUSecグループと、イタリアのサンタンナ高等研究院(Scuola Superiore Sant’Anna)の研究者らが、Spectre v2攻撃の新たな亜種を公表しました。Intel、AMD、Arm製CPUを搭載するシステムが影響を受けます。
研究者らはこの亜種をBranch Target Reuse(BTR)と名付けました。攻撃の標的となるのは、OSカーネルやWebブラウザ、ランタイムが利用するJIT(Just-In-Time)コンパイラです。
標的のマシン上でコードを実行できる攻撃者は、BTRを悪用してメモリからパスワードハッシュなどの機密データを盗み出せる可能性があります。悪意のあるWebページからの攻撃も可能とみられますが、研究者らはまだブラウザに対する完全なエクスプロイトを構築できていません。
Spectre v2 BTRは、プロセッサが実行時に書き換えられるコードを扱う際の仕組みを突くものです。研究者らは次のように説明しています。「攻撃の要点は、最近のCPUが自己書き換えの後にアーキテクチャ上のコードの一貫性を回復する一方で、古い間接分岐予測エントリ(分岐ターゲット)を必ずしも無効化しないことにあります」
JITエンジンでは、こうした古い予測が、対象となったコードが消えた後も残り続けることがあります。同じメモリに新しいコードが書き込まれると、この予測が再利用される場合があります。研究者らが「投機的なexecute-after-freeプリミティブ」と呼ぶ状態です。これにより攻撃者は、古いオフセットを使って投機的実行を新しいコードへ誘導できます。
研究者らが分析したのは、LinuxのcBPF、OracleのGraalVMランタイム、Firefoxが搭載するJavaScript/WebAssemblyエンジンのSpiderMonkeyです。このうちLinuxカーネルに対しては、2種類のエンドツーエンドのエクスプロイトを開発しました。
Linuxカーネルのエクスプロイトでrootパスワードのハッシュが漏えい
カーネルに対するエクスプロイトは、クラシックBPF(cBPF)を悪用します。後継でより高機能なeBPFのJITには特権ユーザーしかアクセスできませんが、cBPFは非特権プログラムからも利用できます。seccompやソケットフィルタリング、DockerやChromeなどのアプリケーションにおけるパケットフィルタリングは、現在もcBPFに依存しています。
最近のIntel製CPUでは、このエクスプロイトによって任意のメモリの内容が漏えいし、有効化されているすべての緩和策も回避されます。研究者らによると、システムが完全に更新され、デフォルトのセキュリティ設定が適用されている場合でも、機密情報を抜き出せるといいます。
研究者らは次のように述べています。「このエクスプロイトで漏えいさせられるのは毎秒8バイトです。遅く聞こえるかもしれませんが、ポインタを丹念にたどれば、秘密情報にたどり着くまでに漏えいさせるデータはごくわずかで済みます」。デモでは、メモリに読み込まれたrootパスワードのハッシュを、この攻撃で特定して漏えいさせました。
ブラウザやサンドボックス化されたランタイムも影響
Firefoxの場合、標的のユーザーのブラウザでJavaScriptコードを実行する悪意あるWebサイトから攻撃が仕掛けられます。Mozillaはサイト分離(site isolation)の展開をまだ完了していないため、ほかのタブのコンテンツが攻撃者と同じアドレス空間を共有し、そのデータが漏えいする恐れがあります。
研究者らの概念実証(PoC)では、IntelプロセッサのSpiderMonkeyで、古い分岐エントリが再利用できるほど長く残ることが確認されました。データは毎秒数十バイトの速度で漏えいすると推定されるものの、ブラウザに対する完全なエクスプロイトの構築には、さらなる作業が必要です。
GraalVMでは、BTRによってSpectreからランタイムを守る最も厳格なサンドボックスモードのメモリマスキングを、攻撃者が投機的に飛び越えられる可能性があります。研究者らはメモリアドレスの確実な再利用には成功しました。しかしGraalVM自体のコードコンパイルとガベージコレクションの処理が、悪用される前に古い分岐エントリを消去してしまいました。研究者らは、この制約について「本質的なものとは思えません」としています。
対策はソフトウェア側に委ねられる
この問題は影響を受けるチップメーカーとソフトウェア開発元に報告され、いずれも研究内容を認めました。CPUベンダーは、間接分岐予測バリア(IBPB)などの既存の仕組みでBTRを緩和でき、対策はソフトウェアで実装する必要があると指摘しています。
Linuxカーネルの開発者は、x86向けの緩和策を導入しました。過去に実行されたBPFコードがすでに使ったメモリ領域へcBPFプログラムが配置されるたび、全CPUコアでIBPBを発動させる仕組みです。
Oracleは一部の緩和策を展開済みです。Mozillaは現在、IBPBによる緩和策よりも、サイト分離の完了を優先しています。
研究者らは、検証したIntel、AMD、ArmのすべてのCPUで、根本的な挙動を確認しました。
問題の原因は、CPUの分岐予測器が、実際にメモリ上にあるコードとずれてしまう場合があることです。研究者らは次のように警告しています。「現行のCPUには、両者を同期させる仕組みがありません。ベンダーがその仕組みを追加するまで、お使いのCPUは脆弱です」
x86のIBTやArmのBTIといったハードウェアによる制御フロー保護は、悪用を難しくするものの、脅威を完全に取り除けるわけではありません。古いIntel製CPUでは、チェックの前に命令が投機的に実行される可能性が残ります。研究者らが確認した範囲で、このレース条件が存在しない最初のIntel世代はLion Coveです。
ただし、レース条件のないCPUでも、研究者らはconstant blindingを無効にするとIBTを回避できました。もっとも、レース条件のないIBTとconstant blindingを組み合わせれば、はるかに強力な防御になるとも述べています。
SecurityWeekはIntel、AMD、Armにコメントを求めました。AMDは、研究者らの論文が自社製品の新たな脆弱性を明らかにしたものではなく、論文で述べられている手法はSpectre v2攻撃向けの既存のガイダンスで緩和できると説明しています。
IntelとArmからは、コメント要請への回答が得られていません。
翻訳元: https://www.securityweek.com/new-spectre-v2-variant-exposes-intel-amd-arm-cpus-to-data-leaks/