プロセッサの速度こそが、セキュリティを危険にさらしている原因なのでしょうか?プロセッサがどのようにしてその速度を実現しているかを理解するには、プロセッサが「未来を予測する」ことで動作していると考える必要があります…いえ、プロセッサは魔法使いでもなければ、小さな水晶玉を持っているわけでもありません…
プロセッサの動作原理は、プログラムがどの経路をたどるかを待つのではなく、チップが可能性の高い経路を予測して先回りするというものです。予測が間違っていた場合、処理は破棄されますが、トレースはメモリに残ります。ここで登場するのが、近年発見された最も重大な脆弱性の1つであるSpectreです。Spectreが発見されて以来、攻撃者はこれらのトレースを読み取る方法を習得し、ますます高度な亜種を生み出してきました。TONTOUは、こうした新たな脆弱性の1つです。
MITの研究者らは、 Spectre v2の脆弱性を悪用する高度な新技術であるTONTOU(Time-of-Neutralization to Time-of-Use)を発見した。この技術により、カーネルメモリをユーザー空間から読み取ることができる。
メーカーや開発者は長年にわたり、予測型攻撃に対する様々な防御メカニズムを設計してきたが、攻撃者は新たな経路を発見することに成功しており、今回のCSAILによる新たな研究は、これらの防御策を回避する方法を示している。
研究者たちは、バッファがクリアされた瞬間から予測が使用される瞬間までの間に避けられない時間差が存在することを発見した。そして、このわずかな時間差を利用して、システム割り込みを介してコード(時にはほんの数個の命令)が挿入され、ハードウェアを再び汚染して重要なデータを抽出することが可能になるのだ。
攻撃について:Safe-RETにおける混乱と侵害
AMDは、 SRSO(投機的リターンスタックオーバーフロー)の脆弱性に対する防御策としてSaferetという技術を開発しており、これは予測機構を使用する直前にクリーンアップする。しかし、これにより数十ナノ秒という短い時間内に悪用可能な脆弱性が生じる。研究者たちは、このようなわずかな時間を攻撃するために、割り込み注入と呼ばれる手法を開発した。
プロセッサは割り込みを処理するためにタスクを一時停止することが頻繁にあり、一般的なプログラムではこれらのタイマーを設定できます。このことを念頭に、研究者たちはタイマーを精密に調整し、CPUの速度を低下させる手法を用いて、プロセッサを意図的に間違ったタイミングで割り込みさせました。この割り込み中に、攻撃者は大量の呼び出しを強制的に実行させ、アドレススタックをオーバーフローさせることができます。誤った実行が終了すると、プロセッサはプロセスを破棄しますが、アクセスされたデータは共有キャッシュに残り、アクセス時間を分析することでそこからデータを抽出できます。
実システムでのパスワード抽出とテスト
TONTOUの深刻さを実証するため、チームは最新のLinuxカーネルを搭載したAMDシステム上で動作するエクスプロイトを構築した。最初の難関は、オペレーティングシステムのメモリ上の位置をランダム化する防御策を回避することだったが、彼らは10回の試行でこれを成功させ、1回のテストにつき約9分を要した。
その後、彼らは権限のないユーザーとしてローカル攻撃を行い、ルートパスワードのハッシュ値を特定することに成功し、毎秒5.47バイトの速度で91.97%の精度でデータを抽出することに成功した。テストの50%(平均18分)では、パスワードファイルの内容を検出して抽出することに成功した。この速度は遅いものの、サーバーを致命的に侵害するには十分すぎるほどである。
Intel、AMD、および緩和パッチへの影響
研究チームは、インテルとAMDの4世代にわたるプロセッサをテストし、両方のアーキテクチャで予測の失敗を実証した。この手法はAMDのZen 1~4ファミリーでは有効であることが証明されたが、インテルのチップでは2つの異なる保護機能を回避した。ただし、インテルの世代間で動作に一貫性が見られなかったことから、名目上の防御機能がハードウェア上で異なる方法で実装されていることが示唆された。
解決策として、研究者らは割り込み処理終了後に予測機構を再度クリアすることを提案している。この対策はAMDにとっては有効な手段のように思えるが、Intelにとっては逆効果となる可能性がある。なぜなら、この攻撃は割り込み処理によって一貫した状態が維持されることを前提としており、Intelにとっては攻撃の信頼性を高めることになるからだ。
研究者らは2月初旬にAMDとIntelに、3月にはLinuxカーネルの開発者らにこの脆弱性を通知した。その結果、脆弱性を軽減するためのコードブロックが8月5日にLinuxカーネルに組み込まれた。
最後に、さらに詳しく知りたい場合は、以下のリンクから詳細をご確認いただけます。