3 分で学ぶ Meltdown と Spectre

本ブログ記事は Jon Masters による英語原文の翻訳です。

近頃、新たに発見されたセキュリティ脅威について報道されています。これは、私たちのコンピュータ、タブレット、スマートフォンや、その他のガジェットを動かす「モダン」なマイクロプロセッサ (チップ) の一般的な特徴を、攻撃者が悪用できるという脅威です。これらの攻撃は「Meltdown」と「Spectre」と呼ばれ、高い関心が寄せられています。人々が心配するのも無理のないことです。そしてもちろん、慎重に作成およびリリースされた必要なソフトウェア・アップデートをすべて適用することも極めて重要となります。現在、Red Hat を含むテクノロジー分野におけるリーダーが協力し、これらの脅威へ対応して潜在的な攻撃のリスクを最小化するために注力しています。

Red Hat では、業界における標準的なセキュリティ措置のもと、一般公開へ向けて目的を絞った小規模チームを展開し、「need to know の原則」(「情報は知る必要がある者にのみ伝え、知る必要のない者には伝えない」という原則) に基づいて、攻撃に関するリスク軽減のため注力してきました。Meltdown と Spectre は Google Project Zero のブログ記事で 1 月 3 日に公開された類似の攻撃のバリアント 1、2 および 3 としても知られています。幸運なことに、私は Red Hat における Meltdown と Spectre 対策の取り組みにおいて、共同リーダーとして関わることができました。Red Hat での取り組みにおいては、ラボで Meltdown (バリアント 3) を再現し、他のバリアントも精査するとともに、Red Hat の信頼あるハードウェア・パートナーの皆様と対策に注力しました。

Red Hat では、これらの脆弱性ついての適切な理解とその要因に関する現時点の分析ならびに潜在的な影響を軽減するためのパッチを有していますが、本件についてパートナーやお客様、研究者とのコラボレーションを継続していきます。また、Red Hat では、これらの複雑な問題に関して、理想的にはチップ設計業以外の方でも理解できる言葉を用いて、皆様が理解できるよう助けたいと考えています。より詳細な技術的情報をお探しの方向けには、オリジナルの調査報告書や関連する刊行物を http://meltdownattack.com/ および http://spectreattack.com/ で確認することが可能ですが、これらの脆弱性の発見に関わった人々の多くが学術的なコンピュータ・アーキテクチャ研究において高度な経歴を有するということも、念頭に置く価値があるでしょう。彼らのうち、少なくとも 1 人が昨年、関連分野で博士号を取得しています。そのため、技術的な詳細を咀嚼するまでに時間がかかったとしても、不思議なことではありません。上記は非常に複雑で詳しい情報です。

当面の対応として、まずは日常的なたとえ話を用いながら「投機的実行」という概念について、少し理解してみましょう。

たとえば、とあるカフェの常連客が、毎朝来店して同じコーヒーを注文しているとしましょう。次第にその常連客はバリスタとも顔見知りになり、バリスタは常連客の注文内容を覚えます。より良いサービスを提供しようと (また、大切な常連客が列に並んで待つ時間を減らせるようにと) 考え、バリスタはいずれ、その常連客がドアをくぐり手を振ってきた時点で、常連客のための飲み物を作り始めるようになります。しかし、ある日、常連客がいつもと違う注文をします。するとバリスタはあらかじめ作っておいたコーヒーを捨てて、常連客が頼んだものを新たに作ることになります。

このたとえ話をさらに詳しくするため、バリスタたちがこの常連客の名前も知っていて、飲み物のカップに注文者の名前を油性マーカーで書く習慣があるものとしましょう。バリスタが「投機的に」いつもの飲み物を用意する際には、カップに常連客の名前を書きます。もし常連客が違う注文をした場合、投機的に用意されたカップは、中身が入ったまま破棄されます。しかし、これを行う際、このカップに含まれる個人を識別可能な情報は、それを見ている誰の目に対しても、一時的に晒されることになります。

このカフェのシナリオでは「投機」が行われています。バリスタは、常連客が来店した時点では、注文がラテになるのかアメリカンになるのかわかりません。しかし、常連客が普段注文するものについての履歴的データがあるため、常連客を待たせずに済むよう、経験に基づいた推測を行います。同様の「投機」は、私たちの日常生活の至る場面で行われています。なぜなら、多くの場合そのような推測は正しく、結果として、同じ時間でより多くのことを行えるようになるためです。私たちが使っているコンピュータも、このように動いています。コンピュータは、この種の推測がしばしば時間の節約につながるという前提のもと、「投機的実行」と呼ばれるテクニックを使用し、一部の処理操作が実際に必要とされるか確定するよりも前に、あらかじめ実行します。

コンピュータの場合、「A の場合、こうする。それ以外の場合、こうする」といったテストに直面した際に行うべきことを決定するために、投機的実行が用いられます。このようなテストは「条件」と呼ばれ、その結果として実行されるコードは「条件分岐」と呼ばれるものの一部です。「分岐」とは、条件の結果に応じて実行させることを選ぶプログラムの一部分のことを指します。モダン・コンピュータチップは洗練された「分岐予測器」を備えており、条件テストの計算中に複雑なアルゴリズムを使用して、得られる可能性の高い結果をあらかじめ特定します。そしてその間、最も実行される可能性が高いとみなされる分岐のコードを投機的に実行します。その推測が結果として正しかった場合、テストが完了するまで待機した場合よりもチップの実行速度が速くなるかのように見えます。推測が誤っていた場合、チップは投機的に得られた結果のすべてを破棄し、他の分岐を実行する必要があります。分岐予測器は、多くの場合 99% 以上の正確性で推測を行います。

ここまででわかる通り、チップが正しい分岐を投機的に実行する場合、優れたパフォーマンス上のメリットが得られます。実際、投機的実行は、過去数十年間にわたりコンピュータの劇的な加速の実現を助けてきた、さまざまな最適化手段のうちの 1 つです。正しく実装されれば、結果として得られるパフォーマンス上のメリットは大きなものとなります。新たに発見された問題の根源にあるものは、この投機的なプロセスが外部の観察者 (または悪意ある人々) からは全く見えないブラックボックスであるとみなしてさらに最適化を進めようとする、チップの設計上の試みです。

業界における従来の認識としては、この投機的プロセス (「投機的実行時間」) の間に起こったことはすべて、後から確定されてプログラムにより使用されるか、使用されず完全に破棄されるかのどちらかでした。しかし、実際には攻撃者が投機的実行時間中に起こることを覗き見て、その結果システムを操作することも可能だとわかりました。また、攻撃者は、通常なら決して実行されることのないような特定のコードの連なりが投機的に実行されるように、分岐予測器の挙動を操作することもできます。これらの脆弱性や、投機的実行の悪用を可能とする類似の欠陥を受けて、Red Hat では、セキュリティ上のリスクを持たない投機的実行の実現へ向けて、将来のチップ設計が根本的に変化することを予測しています。

さて、これらの攻撃について、より詳しく見ていきましょう。まずは、その影響範囲の広さから注目を浴びた Meltdown (バリアント 3) について説明します。この種類の攻撃では、チップを騙すことにより、後から不正な攻撃者が読み取ることのできる方法で、セキュリティ保護されたデータが投機的実行中に読み込まれます。この攻撃が拠り所とするのは、読み込まれるメモリ内のデータを、パーミッションを確認するプロセスから分離する、一般的かつ業界全体で用いられるプラクティスです。ここでも、業界における従来の認識は、投機的実行のプロセス全体が不可視であるという前提のもとに成立していたため、これらを分離することはリスクとみなされませんでした。

Meltdown という精巧に書かれたコードのブランチは、最初にいくらかの攻撃コードを投機的に実行させます。このコードは、通常ならばそのプログラムがアクセスすることのできない、何らかのセキュリティ保護されたデータを読み込ませます。これは投機的に実行されているため、このアクセスに対するパーミッションの確認は並列的に行われます (そして投機的実行時間が終了するまで、エラーは起こりません)。その結果、キャッシュと呼ばれる特別な内部チップメモリに、保護されたデータが読み込まれます。そして、精巧に構築された一連のコードにより、保護されたデータの価値に応じて、他のメモリ操作が行われます。通常は見ることのできるこれらの操作の結果も、投機的実行の後には見ることができず、最終的に破棄されることとなりますが、キャッシュに対するサイドチャネル攻撃と呼ばれるテクニックを使用することで、セキュリティ保護されたデータの価値を特定することが可能です。

Meltdown の軽減策としては、アプリケーション・ソフトウェアとオペレーティング・システムの間において、どのようにメモリが管理されているかを変更する必要があります。Red Hat は、KPTI (Kernel Page Table Isolation) と呼ばれる新しいテクノロジーを導入しています。これは、メモリを分離することで、ユーザーコードの実行中にセキュリティ保護されたデータがチップの内部キャッシュへと読み込まれることを防ぐテクノロジーです。アプリケーション・ソフトウェアがオペレーティング・システムに何かを代理実行するように要求 (「システムコール」) する度に毎回追加の手順を踏む結果、パフォーマンスの低下につながります。パフォーマンスがどの程度低下するかは、アプリケーションがこのようなオペレーティング・システムのサービスをどの程度の頻度で使用する必要があるかに、おおむね比例します。

Spectre 攻撃は、2 つの要素で構成されます。第 1 の要素 (バリアント 1) は、「バウンドチェック」を悪用するものです。繰り返しますが、コードを投機的に実行する際、チップは後で 2 つ目のデータを探すために使用する何らかのデータを読み込む場合があります。パフォーマンス最適化の一貫として、チップは 1 つ目のデータが定義範囲内の値であるかどうかを検証するよりも前に、2 つ目のデータを投機的に読み込む場合があります。このような場合、コードが投機的に実行され、本来なら読み取るべきでないシステムキャッシュ内のデータを読み取ったうえで、前述のサイドチャネル攻撃と類似の手法で抽出するような状況を作り出すことができます。

Spectre の第 1 要素に関する軽減策としては、「ロードフェンス」と呼ばれるものをカーネルの全体に追加します。ロードフェンスは、投機的実行を行うハードウェアが 1 つ目に読み込まれたデータに基づいて 2 つ目の読み込みを実行することを防ぎます。ロードフェンスを追加するためには、カーネルのソース全体にわたり、小規模のちょっとした、パフォーマンスへの影響もさほど大きくない程度の変更が必要となります。Red Hat のツールチェーン・チームでは、ツールの開発を行ったほか、他の関係者と協力しながら、これらのロードフェンスを配置するべき場所の特定を支援しました。

Spectre の第 2 の要素 (バリアント 2) は、ある側面において極めて興味深いものです。これは、分岐予測器を「訓練」することで、投機的に実行されるコードを、実際に実行すべきコード群よりも優先させます。一般的なハードウェア最適化の手段として、特定の分岐を、その分岐のコード自体が存在するメモリ内の場所に基づき動作させる方法があります。しかし、このようなメモリ内の場所は、アプリケーションとオペレーティング・システムのカーネルの間で一意に保存されるものではありません。そのため、予測器を訓練することで、攻撃者が実行したいと望むあらゆるコードを、投機的に実行することが可能となります。「ガジェット」(保護されたデータへアクセスすることが可能な、カーネル内の既存コード) を慎重に選ぶことにより、攻撃者は、機密データをチップのキャッシュに読み込ませ、同種のサイドチャネル攻撃によって抽出することができます。

Spectre の第 2 要素から生じる最も深刻な問題の 1 つは、オペレーティング・システムのカーネルとハイパーバイザーの間、あるいは同一のハードウェア上で稼働する複数の仮想マシンの間の境界を攻撃しうる潜在能力です。分岐予測器を仮想マシンにより訓練することで、ハイパーバイザー内 (あるいは他の仮想マシンのインスタンス上) の保護されたコードが信頼されたハイパーバイザーのデータにアクセスするように仕向け、そのデータをサイドチャネルにより抽出することが可能となります。このことは、パッチの適用されていないサーバーを稼働中のプライベートおよびパブリッククラウド環境に対して、大きなリスクをもたらします。

Spectre の第 2 要素の軽減策としては、プログラムがハイパーバイザーまたはオペレーティング・システムのサービスを要求 (システムコール) する都度、オペレーティング・システムが (選択的に) 分岐予測器のハードウェアを無効化する必要があります。これにより、有害なコードが予測器を訓練しようと試みても、オペレーティング・システムのカーネルやハイパーバイザー、または同一サーバー上で稼働する複数の信頼されていない仮想マシン間に持ち越されることを防げます。この手法は効果的であるものの、少なからぬパフォーマンス低下を伴います。Red Hat のパッチは、デフォルトではセキュリティ上の変更を適用し、パフォーマンスへの影響を許容しますが、システム管理者は、この設定 (および、すべての適用済みの設定) をオン・オフできるようになっています。また、Red Hat は、より広範な Linux コミュニティと連携し、分岐予測の無効化以外の選択肢を検討することで、長期的にこの影響を軽減できるよう注力しています。代替策となりうるものの 1 つとして、「retpoline」が存在します。これは、オペレーティング・システム・カーネルのコードを実行するための特別な方法で、誤った分岐投機を防ぐものです。

これらの高度に洗練された攻撃についての理解を深めるうえで、本ブログ記事が助けになったようでしたら幸いです。これらの攻撃は決して単純ではないものの、軽減措置が可能です。そして、現在 Meltdown (バリアント 3) のサンプルがインターネット上で提供されていますが、Red Hat などの大手ベンダーによるアップデートのリリースを通じてパッチも提供されています。今後も、その他の関連する脆弱性が発見され、これらのコードの無効化手段を発見するため、サンプルコードがインターネット上に投稿されることでしょう。そのため、セキュリティ修正パッチがリリースされたら速やかに適用することが重要です。

また、現在私達が経験しているのは、全く新しい種類のシステムセキュリティ脆弱性が発見されて間もない時期であり、軽減策やベストプラクティスに関する助言などは今後変わっていく可能性があるということも、認識しておくことが重要です。Red Hat は、引き続き業界のリーダーやオープンソース・コミュニティと協業し、これらの脆弱性やその他の既知の脆弱性から保護するため、そして Meltdown や Spectre のような攻撃に対する Linux の堅牢性をますます強化していくために尽力します。今後の数ヶ月にわたり、Red Hat ではこの取り組みに関する記事をさらに投稿していくとともに、Red Hat 製品に関するガイダンスについても、お客様に最新情報をお届けします。詳細は、以下にてご確認ください。 https://access.redhat.com/security/vulnerabilities/speculativeexecution