Spectre (スペクター) の脆弱性について
Spectreは、現代の
マイクロプロセッサに存在する
ハードウェアレベルの
脆弱性であり、正式な権限を持たない
プロセスが保護されているメモリ領域にアクセスすることを可能にするものです。この
脆弱性は、
CPUの「投機的実行」という処理方式に起因しており、プログラムの実行を高速化するために、将来の処理を予測して事前に実行する機能が、セキュリティ上の欠陥を生み出しています。
Spectreの概要
Spectreは、悪意のあるプログラムがメモリ領域を読み取ることを可能にする
脆弱性です。読み取られるメモリ領域には、機密情報が含まれる可能性があり、この
脆弱性が悪用されると、情報漏洩などの深刻な被害につながる可能性があります。
この
脆弱性は特定の
CPUアーキテクチャに依存せず、x86(Intel、AMD、および互換
CPU)、ARMなど、幅広いプロセッサで発生することが示唆されています。GPUにおける影響は、まだ明確に確認されていません。
Spectreに関連するCVE番号は以下の2つです。
Variant 1: 投機的実行における境界チェックの回避 (CVE-2017-5753)
Variant 2: 投機的実行における分岐先インジェクション (CVE-2017-5715)
Variant 1(CVE-2017-5753)は、特にブラウザの
JavaScript JITエンジンにおいて発見された
脆弱性で、
ウェブサイトから他のブラウザのデータやブラウザ
プロセス自体のデータを読み取ることが可能になる可能性があります。この問題は、Firefoxや
Google Chromeなどの主要なブラウザで、
ウェブサイトごとに
プロセスを分割することで対策されています。
2018年には、Spectreの新しい亜種(Variant 3a/4)も発表されました。
Variant 3a: Rogue System Register Read (CVE-2018-3640)
Variant 4: Speculative Store Bypass (CVE-2018-3639)
Spectreは、GoogleのProject Zeroと暗号学者のポール・コッフェル氏を中心とした研究チームによって発見され、
Meltdownのチームとの共同作業の結果、2018年1月3日に発表されました。この
脆弱性が「Spectre」(幽霊)と名付けられたのは、投機的実行という技術に由来しており、根本的な解決が困難であることから、長く付きまとう問題となるだろうという意味が込められています。
Spectreの詳細
Spectreには、以下の2つの主要な
脆弱性が含まれています。
1.
境界チェックの回避 (CVE-2017-5753)
2.
分岐先インジェクション (CVE-2017-5715)
これらの
脆弱性は、いずれも権限のないデータへのアクセスを可能にするものであり、攻撃の痕跡が残りにくいため、攻撃を受けた際のデータ流出の特定が困難という特徴があります。
境界チェックの回避
通常、メモリアクセスは
マイクロプロセッサによる境界チェックによって、読み取り可能な領域かどうかを検証されます。しかし、投機的実行時に境界チェックが適切に行われず、不必要なメモリ領域がキャッシュに読み込まれてしまうことがあります。攻撃者はこのキャッシュの変化を追跡することで、秘密情報のアドレスを特定し、情報を入手することが可能になります。この攻撃は、理論的には他の
プロセスにも成功する可能性がありますが、実際には自身の
プロセス内のデータ読み取りが確認されています。また、eBPF JITを有効にした
カーネル環境下では、AMDプロセッサでも攻撃が成功したことが報告されています。
分岐先インジェクション
分岐先インジェクションの攻撃は、Return-oriented programming(ROP)と似た手法で、悪意のある
プロセスで分岐予測を学習させ、ターゲットとなる
プロセス内の間接分岐命令がガジェットを投機的に実行させることを試みます。この攻撃の成否は、キャッシュヒットミスを測定することで確認できます。この攻撃が成立するためには、投機的実行によって何らかの副作用が発生する必要があり、同一物理コア内のSMT(Simultaneous Multithreading)による論理コア間でデータの読み出しが可能であることが検証されています。
Spectreの評価
Spectreは、自
プロセス内の機密データを読み取る攻撃(ブラウザベースの
JavaScriptによる攻撃など)が確認されています。他の
プロセスのデータを読み取る場合は、確率的な挙動を示すため、攻撃の容易度はプロセッサのアーキテクチャに依存するとされています。AMDは、内部アーキテクチャの違いから、CVE-2017-5715はほぼリスクがなく、
Meltdownについては全くリスクがないと述べています。
Spectreへの対策
Spectreへの対策としては、以下の様なものが挙げられます。
メモリ構造を推測させないようにする:アドレス空間配置のランダム化(ASLR)やPosition Independent Code(PIC)を使用することで、メモリマップをランダム化し、攻撃を緩和できます。LLVMへのパッチ適用も同様の効果があります。
サイドチャネル攻撃の対策:スクリプトの応答時間を均一化したり、処理時間を高精度で測定させないようにすることで、攻撃を緩和できます。これは、ブラウザの
JavaScript実行時などに取り入れられています。
プロセッサアーキテクチャの刷新:完全に影響を排除するには、プロセッサアーキテクチャの大幅な刷新が必要とされています。
ウイルス対策ソフトウェアでの防御は、有効性が疑問視されています。
Spectreの影響
Spectreは、分岐予測や投機的実行を実装するプロセッサに潜在的な影響があると考えられています。
影響を受けるプロセッサの例
インテル: Xeon E5-1650 v3での攻撃成功が確認されています。
Intel Core 2世代や第1世代Core iシリーズの一部は、
脆弱性パッチの適用が中止されました。対象の
CPUには、Penryn、Yorkfield、Wolfdale、Bloomfield、Clarksfield、Gulftown、Jasper Forest、Harpertown、SoFIA 3GRなどがあります。
AMD: eBPF JITを有効にしたカーネルにおいて、AMD PROでの攻撃成功が報告されています。Radeon GPUへの影響は不明です。
ARM: Cortex-R7/R8/A8/A9/A15/A17/A57/A72/A73/A75がSpectreの影響を受けるとされています。Cortex-A53/A55は影響を受けないとされています。Qualcomm Snapdragonの一部も同様です。
NVIDIA: Geforce GPUでは、脆弱性は確認されていません。
Spectreへの回避策とアップデート
Spectreはハードウェアレベルの脆弱性であるため、OSやブラウザなどのアプリケーション側での回避策が講じられています。多くのベンダーは、パッチがMeltdownとSpectreのどちらを緩和するのかを明確にしていません。
Windows: OSアップデートによる対策が行われています。
macOS: macOS High Sierra 10.13.2 Supplemental UpdateにてSpectre対策が適用されています。
Linux: SpectreはKPTIによっては回避されないため、OSレベルの
パッチは別途提供されています。
Android: Googleはセキュリティパッチを配信していますが、実際の端末への適用はメーカーやキャリアの対応に依存します。
iOS: iOS 11.2.2でSpectre対策が適用されています。
Google Chrome: Chrome 64でJavaScriptエンジンへの対策が施されました。
Firefox: Firefox 57.0.4でperfomance.now()の精度低下やSharedArrayBufferの無効化による対策が行われています。
NVIDIA: GeForce GPUのデバイスドライバにパッチが適用されました。
シスコ: ルーターやアプライアンス製品、
ソフトウェアに
脆弱性があることを認めています。
まとめ
Spectreは、
マイクロプロセッサの投機的実行という機能を悪用した深刻なセキュリティ上の
脆弱性です。広範囲なプロセッサに影響を与え、OSやブラウザなど様々なレベルでの対策が必要とされます。根本的な解決にはプロセッサアーキテクチャの刷新が必要であると考えられています。