数日間にわたって Intel 製プロセッサの重大な脆弱性に関する噂が流布していましたが、2018 年 1 月 3 日に公式発表があり、脆弱性「Meltdown」と「Spectre」の影響がどの程度のものか明らかになりました。要約すると、Meltdown と Spectre は両方とも、不正なコードが通常はアクセスできないメモリ領域にアクセスすることが可能になる脆弱性です。
これらの脆弱性によって、パスワードや暗号鍵など、基本的には感染した PC が処理しているすべての情報が窃取される可能性があります。不運なことに、パフォーマンス改善のための仕組みが、少なくとも Windows や Linux、macOS のような主要オペレーティングシステム(OS)に採用されている基本的なセキュリティの仕組みを大きく揺るがせています。両方の脆弱性について「Proof of Concept(概念実証型エクスプロイト、PoC)」が公開されていますが、実際の攻撃は確認されていません。
本記事では、これらの脆弱性の詳細と攻撃手法、および各ベンダの対策について解説します。
■アドレス空間分離の仕組み
メモリの仮想化は現行 OS の基本的なセキュリティの仕組みの1つです。これによって各ユーザアカウントが使用するメモリを分離し、別のユーザが使用するデータへのアクセスや修正を不可能にしています。今日ではこの仕組みはページング方式で実装されています。「Page Table(ページテーブル、PT)」と呼ばれる大きくて複雑なカーネルツリー構造が各プロセスに存在し、メモリの仮想アドレスと物理アドレスをマッピングした情報を格納し、アクセス権を定義しています。各 CPU の「Memory Management Unit(メモリ管理ユニット、MMU)」が可能な限り効率よくアドレスの変換を処理します。MMU 内のキャッシュには「Translation Lookaside Buffer(トランスレーション・ルックアサイド・バッファ、TLB)」と呼ばれるいくつかのレイヤがあり、アドレスの変換データを保持しています。TLB に変換データが存在しない「TLB ミス」が生じた場合、「ページ・フォールト・トラップ・ハンドラ」が PT を辿ってアドレスを変換します。この処理には時間がかかります。
Windows、Linux、macOS のような現在の OS は、Android や iOS のようなモバイル向けの派生バージョンも含めてすべて同じ仕組みを採用しています。当初、ユーザデータへのカーネルコードのアクセスを単純化するために、カーネル権限を持つコードとデータは各プロセスにおいて同一の仮想アドレスにマッピングすることが想定されていました。仮想アドレスのマッピングの変更、つまり PT の切り替えには、通常 TLB フラッシュが伴います。このようなマッピングの変更はコンテキストの切り替えに際して必ず発生します。また、カーネル空間とユーザの仮想空間をマッピングするのには、ユーザモードとカーネルモードを行き来するために仮想アドレスのマッピングを変更する際の TLB ミスを減らすというもう 1 つの理由があります。この方式は非常に一般的で、Intel はベストプラクティスとして推奨し、実際の PT へのポインタを保持するために 1 つのレジスタを割り当てています。このレジスタはコンテキストを切り替える際に書き込まれます。これとは対照的に、ARM アーキテクチャでは 2 つのレジスタが PT へのポインタ用に割り当てられています。
MMU のアクセス管理により、カーネルのコードやデータはユーザのコードから直接アクセスすることができないように保護されています。多くの攻撃で、権限昇格や PC の制御を可能にするためにカーネルコードの欠陥を突く方法が確認されています。このような攻撃を実行するためには、攻撃者は 2 つのことを知っている必要があります。1 つはその脆弱性がどのようなものであるか、もう 1 つは関連するカーネルコードとデータの両方またはいずれか一方についてです。
このような攻撃に対応するために、数年前、OS に「Address Space Layout Randomization(アドレス空間配置のランダム化、ASLR)」が実装されました。特に、カーネル空間の場合は「Kernel ASLR(KASLR)」と呼ばれています。この対策は、ユーザのプロセスからカーネル構造のアドレスを隠ぺいする仕組みになっています。KASLR を狙ったさまざまな攻撃が確認されており、その多くは、メモリにアクセスする際の TLB ミスと TLB ヒットとの統計的な差異を測定することによって行われます。これらの統計はハードウェアの MMU の実装に基づくため、秘匿が困難です。
■KAISERによる対応
2017 年 10 月、「Graz University of Technology(グラーツ工科大学)」がプロセスの PT を 2 つに分割する提案を公開しました。1 つの PT は本来の用途のようにプロセスがカーネルコードを実行する際に使用します。もう 1 つの PT は、ユーザのページと、コンテキストの切り替えやシステムコール、割り込みハンドラなどに必要なその他のカーネルページの部分的なコピーです。カーネル空間の残りの部分は見えないようになっており、ユーザ空間における処理の実行時にこの PT を使用します。この技術は「Kernel Address Isolation to have Side-channels Efficiently Removed(サイドチャネルを効率的に取り除くためのカーネルアドレスの分離、KAISER)」と呼ばれており、1% 未満のオーバーヘッドで既知のすべての KASLR 攻撃に対応することが可能です。
提案の公開からまもなく、KAISER を実装する作業が始まりました。Linux カーネルでは、2017 年 11 月に KAISER に基づく「Kernel Page Table Isolation(KPTI)」の実装が緊急かつ静かに開始されました。コードを記述する前に十分な時間をかけて議論が行われ、カーネルの当該部分が断続的に変更されました。言うまでもなく、KPTI の実装作業はその特異な性質からいくらかの関心を集めました。
カーネルの当該部分の変更はパフォーマンスに大きな影響を与える可能性があります。初期のテストではほとんどの場合5%の低下が確認されましたが、最悪の場合には50%にも及びました。最終的に Linux の KPTI は2017 年 12 月 29 日にカーネルに追加されました。11 月 16 日には Windows にも KAISER のような機能が実装されたことが明らかになっています。
■「Meltdown」と「Spectre」を狙った攻撃手法
KAISER が突然実装された理由はすぐに明らかになりました。脆弱性「Meltdown」への対策として有効だったからです。
Meltdown と Spectre は CPU の投機的実行におけるセキュリティ欠陥に基づく脆弱性です。最近の CPU は処理が高速なため、命令を 1 つずつ順番に実行してく場合、メモリへのアクセスのために数百クロックサイクル程度の待機時間が発生します。CPU はメモリの読み書きを待つ間、先に実行可能な命令を実行します。このようにして投機的に実行された結果が正しいかどうかは事後的に検証され、もしその結果が不要な場合 CPU の内部状態とメモリへの影響は削除されます。このような仕組みとして「投機的実行」と「アウト・オブ・オーダー実行」があります。
残念なことに、投機的実行にはローレベルにおけるCPUの状態に副作用をもたらします。例えば、メモリから 1 ワード長のデータをレジスタに移動する命令を投機的に実行し、その結果が不要となった場合、レジスタは元の値を保持していますが、キャッシュはリードサイクルで修正されます。Meltdown と Spectre を発見したリサーチャは、保護されているメモリ領域にアクセスするためにローレベルの CPU 状態を使用しました。
Meltdown(CVE-2017-5754)は、権限を持たないユーザが PC のカーネルメモリと物理メモリに完全にアクセスすることが可能になる脆弱性です。この脆弱性を狙う攻撃方法は比較的単純で、攻撃者は対象 PC 上で自身のプログラムを実行するだけです。逆に言えば、攻撃者がこの脆弱性を利用するためには、標的型メールなどの手段により攻撃対象の PC 上で不正プログラムを実行させる必要があるということです。さまざまな攻撃シナリオの中で最も可能性が高いのはクラウドサービスのような共有システムへの攻撃です。1 つの仮想マシンへのアクセス権を持つ攻撃者は Meltdown を利用することによって物理的に同一の PC で仮想マシンを利用する他のユーザの情報にアクセスすることが可能になります。Meltdown は Intel の CPU に固有の脆弱性のため、AMD や ARM の CPU は影響を受けません。
Spectre(CVE-2017-5753、 CVE-2017-5715)はより影響範囲の広い脆弱性です。Spectre を利用した攻撃は投機的実行に関する欠陥に基づいています。現状では、より多くの前提条件を満たす必要があるため、Spectre を利用する攻撃は Meltdown と比べてより複雑であり、実現のハードルは高いものとなっています。前提条件の 1 つは、攻撃者と対象が同じコードを共有していることです。Spectre を利用する攻撃のいくつかでは、分岐を予測する CPU のサブシステムが当該コードに実行を移すようにする必要があります。つまり、この攻撃はCPUのバージョンに強く依存します。何故なら、予測アルゴリズムと予測バッファの深さはベンダだけではなくCPUの世代によって異なるためです。Spectreには2つの亜種が知られています。1つは単一プロセス空間への攻撃に限定され、もう1つの攻撃にはスーパーユーザのアクセス権が必要です。Spectreの危険性を高めているのは、カーネルのインタープリタと、Linux eBPFのようなJITコンパイラを組み合わせている点です。これにより攻撃者は、投機的に実行するコードを作成しカーネルのコンテキスト内で直接実行することが可能になります。この攻撃の影響は Meltdownと同様です。
Spectre に関する真の難題はその緩和策です。OS の更新プログラムによって対応可能な Meltdown とは異なり、Spectre はハードウェア自体の変更を必要とします。回避策として、IntelのプラットフォームにおけるLFENCE命令のような同期基本命令を挿入するという方法があります。これにより投機的な実行を効果的に止めることが可能です。他にも、「Retpoline」と呼ばれるトランポリンを使用する回避策があります。この手法はコンパイラの修正と慎重な問題箇所の特定を必要とします。これは簡単ではなく人々の議論無しに容易に実行することはできない上、重大なパフォーマンスの低下をもたらす可能性もあります。
Intel、AMD および ARM の最近の x86 系 CPU がすべて Spectre の影響を受けると考えられます。そのため、Spectre への対策には高額な費用がかかり、技術業界全体にとって長期的な課題となっています。Spectre と投機的実行に関する問題が認識された今、パフォーマンスとセキュリティの維持および向上は CPU 製造業者にかかっています。
■被害に遭わないためには
ここまで述べてきたように、この脆弱性を攻撃に利用するためには条件があり、直ちにすべての環境に甚大な影響を与えるものではありません。ただし、「侵入を前提とした対策」の考えから、特に法人においては既にリリースされている Meltdown に対応する更新プログラムを計画的かつ確実に適用することが推奨されます。CPU ベンダはファームウェアの一部としてマイクロアーキテクチャの更新プログラムをリリースしています。OS ベンダはカーネルおよびコンパイラの更新プログラムをリリースしています。Spectre を狙った攻撃に対応するために各ブラウザにも更新プログラムが適用されるでしょう。ユーザおよびシステム管理者は攻撃のリスクを軽減するためにこれらの更新プログラムを迅速に適用してください。
近いうちにソフトウェアやファームウェアに対するより多くの更新プログラムのリリースが見込まれています。しかし残念なことに、攻撃の検出は非常に困難です。マイクロアーキテクチャレベルでの兆候や、異常に高いページフォールト発生率、低いキャッシュヒット率のようなパフォーマンスに関する統計情報以外には攻撃の目印がありません。Meltdown や Spectre を実際の攻撃に利用した不正コードのサンプルは確認されていませんが、PoC を修正した不正コードが直ぐに出てくることも十分考えられます。
Microsoft は Windows のサーバ版とクライアント版について以下の文書を公開しています。
- 投機実行サイド チャネル上の脆弱性から保護するための Windows Server ガイダンス
- 投機実行サイド チャネル上の脆弱性から保護するための IT プロフェッショナル向け Windows クライアントのガイダンス
Microsoft からの更新を自動的に適用するためには影響を受ける PC にレジストリキーを登録する必要があることに留意してください。詳細はこちらの記事を参照してください。
macOS については、2017 年 12 月の更新ですでに対応されています。上述のように、Meltdown のための更新プログラムが Linux のカーネルに反映されています。Linux の各ディストリビューションの更新は個々のベンダが行います。Debian や Red Hat、SUSE のようないくつかのベンダは必要に応じた告知と更新プログラムを公開しています。
実際の攻撃は確認されていませんが、利用可能な PoC (「TROJ64_CVE20175753.POC」として検出)がいくつか公開されています。
トレンドマイクロのサーバ向け総合セキュリティ製品「Trend Micro Deep Security™」および「Trend Micro Virtual Patch for Endpoint(旧 Trend Micro 脆弱性対策オプション)」をご利用のお客様は、以下の DPIルールによってこの脆弱性を利用する脅威から保護されています。
- Multiple CPU Spectre Attacks Detection (CVE-2017-5753 and CVE-2017-5715)
家庭用ルータを中心に構成されるホームネットワークを保護する「ウイルスバスター for Home Network」は Meltdown と Spectre を狙う攻撃を以下のシグネチャによって検出します。
- 1134349 WEB-CLIENT Multiple CPU Meltdown/Spectre Attacks Detection
参考記事:
- 「When Speculation Is Risky: Understanding Meltdown and Spectre」
by Vit Sembera
翻訳: 澤山 高士(Core Technology Marketing, TrendLabs)