カーネルのサイドチャネル攻撃 - CVE-2017-5754 CVE-2017-5753 CVE-2017-5715
この情報は役に立ちましたか?
Red Hat では、現代の多くのマイクロプロセッサーに影響する複数のマイクロアーキテクチャー (ハードウェア) の実装問題を認識しています。この問題では、Linuxカーネル、仮想化関連のコンポーネントの更新と、場合によってはマイクロコードの更新も必要となります。権限のない攻撃者はこの不具合を使って通常のメモリーセキュリティー制限を迂回し、本来はアクセスできない、権限を必要とするメモリーへの読み取りアクセスを取得することが可能になります。この問題では、Intel、AMD、および ARM アーキテクチャーとの組み合わせで 3 つの CVE があります。他のアーキテクチャーには別のエクスプロイトが存在することも分かっています。これには IBM System Z、POWER8 (ビッグエンディアンおよびリトルエンディアン) および POWER9 (リトルエンディアン) が含まれます。
背景情報
現代の多くのマイクロプロセッサーの設計で、 (パフォーマンスの最適化のために一般的に使用されている) 命令の投機的実行を実装する方法において、業界全体にわたる問題が発見されました。この問題では 3 つの主要なバリアントがあり、投機的実行が悪用される方法が異なります。これらは 3 つとも、高パフォーマンスマイクロプロセッサーが投機的実行を実装し、VIPT (Virtually Indexed, Physically Tagged) レベル 1 データキャッシュを利用するという点に依存しています。このデータキャッシュは、予測中にカーネルの仮想アドレス空間にデータと割り当てられます。
最初の 2 つのバリアントは投機的実行を悪用してバウンドチェックバイパス (CVE-2017-5753) を実行するか、分岐ターゲットインジェクション (CVE-2017-5715) を利用して、攻撃者の制御下にあるアドレスのカーネルコードが推測によって実行するようにします。これら 2 つのバリアントは、合わせて「Spectre」と呼ばれています。これらのバリアントは両方とも、権限を必要とするコード内の正確に定義された命令手順の存在と、実際にはコミットしない (リタイアする) 予測によって実行される命令でも、メモリーアクセスによりマイクロプロセッサーのレベル 1 データキャッシュへの割り当てが発生するという点に依存しています。このため、権限のない攻撃者は、これらの不具合を使って、ターゲット化されたキャッシュのサイドチャネル攻撃により、権限を必要とするメモリーへの読み取りアクセスを取得することが可能になります。これらのバリアントは、syscall の境界だけでなく (バリアント 1 およびバリアント 2)、ゲスト/ホストの境界も超えることができます (バリアント 2)。
3 つ目のバリアント (CVE-2017-5754) は、影響を受けるマイクロプロセッサー上での命令パーミッション違反の投機的実行中に、違反アクセスで開始される例外生成が命令ブロック全体のリタイアまで抑制されるという点に依存してます。このエクスプロイトは「Meltdown」と呼ばれています。この後のメモリーアクセスでは、本来はアクセスできないメモリーの場所を参照する場合でも、L1 データキャッシュへの割り当てが発生します。このため、権限のないローカル攻撃者は、ターゲット化されたキャッシュのサイドチャネル攻撃を実行することで、権限を必要とする (カーネルスペース) メモリー (ホスト上の任意の物理メモリーの場所を含む) を読み取ることが可能になります。
謝辞
Red Hat は、この問題の報告について Google Project Zero に謝意を表します。
追加の参考資料
https://googleprojectzero.blogspot.ca/2018/01/reading-privileged-memory-with-side.html
Options to address CVE-2017-5753 on XEN platform
Impacts of CVE-2017-5754, CVE-2017-5753, and CVE-2017-5715 to Red Hat Virtualization products
影響を受ける製品
Red Hat Product セキュリティーチームは、本件によるセキュリティー上の影響度を重要と評価しています。
以下の Red Hat 製品バージョンが影響を受けます。
Red Hat Enterprise Linux 5
Red Hat Enterprise Linux 6
Red Hat Enterprise Linux 7
Red Hat Atomic Host
Red Hat Enterprise MRG 2
Red Hat OpenShift Online v2
Red Hat OpenShift Online v3
Red Hat Virtualization (RHEV-H/RHV-H)
Red Hat OpenStack (OSP) 6
Red Hat OpenStack (OSP) 7
Red Hat OpenStack (OSP) 8
Red Hat OpenStack (OSP) 9
Red Hat OpenStack (OSP) 10
Red Hat OpenStack (OSP) 11
Red Hat OpenStack (OSP) 12
Red Hat Linux コンテナーはカーネル問題の影響を直接受けませんが、そのセキュリティーはホストカーネル環境の整合性に依存しています。Red Hat では最新バージョンのコンテナーイメージを使用することを推奨します。Red Hat Container Catalog の一部である Container Health Index を使用すると、常に Red Hat コンテナーのセキュリティー状態を確認できます。使用中のコンテナーのプライバシーを保護するには、これらの攻撃に対してコンテナーホストを更新する必要があります。Red Hat では、このユースケース用に更新済み Atomic Host をリリースしています。
攻撃の詳細と影響
この記事で説明している攻撃は、高パフォーマンスマイクロプロセッサーの投機的実行機能を悪用します。現代のマイクロプロセッサーは「アウトオブオーダー」(OoO) 実行と呼ばれるデザイン最適化を実装しており、常にプログラマーがアプリケーションバイナリーで提供する順番ではなく、個別の命令のデータ依存関係が利用可能になるとすぐに (「データフロー」モデルと呼ぶ) 実行されます。実行が順次行われているように見えるのは、プロセッサーのこれら中間実行状態をバッファリングして順序立った結果を表示する内部の各種並び替え構造によるものです。「アウトオブオーダー」(OoO) 実行は元々、1967 年に Robert Tomasulo 氏が初期の IBM メインフレームシステム向けに考案したものです。その後、ほとんどすべてのマイクロプロセッサーの標準機能となりました。
アウトオブオーダー実行モデルの拡張により、高度に洗練された分岐予測アルゴリズムがもたらされ、ソフトウェアの特定のパス (分岐) を実行するかどうかを予測するようになりました。分岐は、“if this, then do A, otherwise do B” のフォームにある “if” ステートメントに対して、プロセッサーが実行中の命令のフローを変更するものと考えられます。分岐するまたは分岐しないことを決定する条件は、すぐには利用可能とならないデータに依存することが多くあります (たとえば、遅い RAM から内部マイクロプロセッサーキャッシュの階層への読み取りが必要な場合など)。分岐条件がすぐに利用可能でないため、プロセッサーは分岐予測からの入力に基づいて、最も可能性の高いパスを推測によって実行し始めます。この実行による結果は、予測した分岐方向が後で間違ったことが分かった場合には、パス全体を破棄できる方法で保存されます。このため、投機的実行は通常、プログラマーや同一システムの他のユーザーにはまったく見えないようになっています。
この記事で説明している攻撃は、投機的実行中のマイクロプロセッサーの内部状態というブラックボックスを開くことに依存しています。特に、キャッシュのサイドチャネル分析というテクニックに依存しています。プロセッサーは投機的実行中に、プログラマーや他のプロセッサー、他の実行中のアプリケーションに対して、メモリーやレジスターにおいてその結果を即座に利用可能としません。ただし、予測されるコードパス内のメモリーにアクセスするには、データをプロセッサーキャッシュに持ち込む必要があります。サイドチャネル分析を使用すると、攻撃者はシステムキャッシュへの予測された割り当て (読み込み) を監視することが可能になります。これには、結局は破棄されることになる実行パスからの割り当ても含まれます。この場合、特別なプログラムにより、権限を必要とするメモリーの場所からのキャッシュを予測によって読み込み、その結果を監視できるようになり、その結果を使用して権限を必要とするメモリーのコンテンツを推測することが可能になります。
CPU の投機的実行を開始するトリガーの 1 つは分岐です。攻撃者は、カーネルコード内で特定の分岐がよく分岐する (または分岐しない) ように分岐予測を訓練し始めます。次に分岐が実行されると、プロセッサーは、攻撃者が選択した方向にコードを実行し始めます。メモリーから値を読み込むパスを攻撃者が選択した場合、その読み込みは推測によって実行されます。(影響を受けるマイクロプロセッサー実装のいくつかでは) 分岐予測に対する攻撃はカーネル/ハイパーバイザーの境界を超えることが可能で、権限のないゲストオペレーティングシステムがハイパーバイザーに対して影響力を持つようになり、サイドチャネル分析を一緒に用いることで、ハイパーバイザーの秘密メモリーを抽出できるようになります。
投機的実行の影響は、これだけにとどまりません。マイクロプロセッサーの内部状態はプログラマーや他のユーザー、システム上で実行中のアプリケーションには見えないため、推測によるデータアクセスが許可されるかどうかをチェックする前に、プロセッサーがこのデータアクセスを実行する場合があります。パーミッションのチェックは同時並行で行われ、予測された命令をリタイアする前に、最終的に予測の中止がトリガーされ、実行結果がプロセッサーの外に見えるようになります。パーミッションのチェック前にプロセッサーが推測によってメモリーからキャッシュ済みデータを使用すると、その後に続くメモリーアクセスでそのデータを使用することで、データを監視できるようになります。
パーミッションチェックの一例にメモリー管理ユニット (MMU) からのページアクセスチェックがあります。仮想メモリーとも呼ばれるページングは、高パフォーマンスマイクロプロセッサーの一般的機能です。システム RAM の物理アドレスへの仮想アドレスのマッピングをオペレーティングシステムが制御できるようにし、アクセス制御で仮想アドレスへのアクセスも制限します。たとえば、(書き込みによってページフォールト例外が発生するように) ページを「読み取り専用」とマークしたり、(ユーザーモードアクセスによってページフォールト例外が発生するように) 「カーネルメモリー」とマークすることができます。
プロセッサーのパーミッションチェックにより、ユーザーアプリケーションはカーネルメモリーにアクセスできないため、オペレーティングシステムカーネル (Linux を含む) がカーネル仮想メモリーアドレスをユーザーアプリケーションと同じアドレス空間にマッピングすることは、業界の標準プラクティスとなっています。。アプリケーションはカーネルが提供するシステムコールを頻繁に使用し、各システムコール中のアドレス空間の切り替えにより多大なパフォーマンスのオーバーヘッドが発生するので、この方法ではパフォーマンスが大幅に向上します。切り替えでは、多くの内部 CPU 構造のコンテンツをフラッシュ (無効にする) 必要があります。これには、仮想から物理メモリーへの変換をキャッシュし、仮想メモリーの使用を加速する TLB (トランスレーションルックアサイドバッファ) などがあります。
ただし、カーネルとユーザーアプリケーション間でページテーブルを共有することで、投機的実行に対して別の攻撃が可能となります。この場合、準備段階で攻撃者は、カーネルに「興味のある」仮想アドレスをプロセッサーのレベル 1 (L1) データキャッシュに読み込ませます。L1 データキャッシュは通常、VIPT (Virtually Indexed, Physically Tagged) と呼ばれるテクニックで構造化されており、これは仮想から物理へのアドレス変換とパーミッションチェックをアクセスと並行して行います。共有の仮想アドレス空間があると、カーネルの権限がある仮想アドレスには、投機的実行中に信頼されないユーザーコードが L1 キャッシュを使って推測によってアクセスできるようになります。また、読み込まれた値を、推測によって実行されたパスでさらに使用することが可能となります。このため、2 回目の推測によるメモリーアクセスでは、権限を必要とするメモリーコンテンツに依存した方法でキャッシュを満たし、それらのコンテンツを引き出すことが可能になります。
このようなマイクロプロセッサーのサイドチャネル攻撃では、マシンにアクセスのある信頼できないユーザーが、権限を必要とするカーネルやハイパーバイザーメモリー、同一システムで実行中の他のアプリケーションや仮想マシンから秘密情報を引き出せるようになります。この脆弱性を軽減するには多くの別々のステップが必要となります。マイクロプロセッサーのメーカーやモデルによって、これらの一部またはすべてが必要になる場合があります。各マイクロプロセッサーの脆弱性は、それぞれのバリアントに対して異なる範囲である可能性があります。
カーネルとユーザー仮想アドレス空間を分離する: これを実行するには、KPTI (Kernel Page Table Isolation) と呼ばれるオペレーティングシステムのカーネルへの設計変更を用います。KPTI は 「KAISER」と呼ばれることもあります。カーネルまたはハイパーバイザーへのエントリーの際に、間接的な分岐予測を無効にします。マイクロコードやミリコード、ファームウェア、その他のアップデートによって、業界全体にわたり多くのマイクロプロセッサーに新機能が追加されてきました。これらの新機能は、それらの使用を管理する Red Hat Enterprise Linux への更新によって活用されます。
特定メモリーの場所の推測による読み込みのフェンシング: このような読み込みは、Linux カーネルへの小さな変更で注釈を付ける必要があり、これは Red Hat 更新に統合されています。
これらのソフトウェアの解決策は、マイクロコードやミリコード、ファームウェアの更新を合わせることで、本記事に記載の攻撃を軽減することができますが、システムのパフォーマンスにマイナスの影響が出ます。特定のシステム、マイクロプロセッサーのメーカーやモデル、さらにはワークロードの性質によって、パフォーマンスへの影響は多大なものになる場合があります。Red Hat では、ユーザーがそれぞれの環境を評価して、選択的に各種の軽減策を有効または無効にできるようにすることで柔軟に適切な妥協点を見つけられるようにする一方、パフォーマンスよりもセキュリティーを優先するプロアクティブな立場を採用しています。
Red Hat Performance Engineering チームでは Knowledgebase article で、各種のワークロードで観測されたパフォーマンスへの影響をお知らせしています。また、お客様のコンピューターが間違いなく物理的に分離されている場合に、望ましいパフォーマンスレベルに戻すために、セキュリティーフィクスの一部を無効にするオプションについても説明しています。追加のパフォーマンスデータは、本件の進展に従って公表していきます。
検出 & 診断
Red Hat では、今回の問題がお客様のシステムにもたらす影響を理解できるようにする複数のスクリプトの開発を進めています。
Red Hat Virtualization 製品をお使いの場合は、Knowledgebase article を参照して OEM 提供のマイクロコード/ファームウェアが適用されているか確認してください。
対処方法
影響を受けるバージョンの Red Hat 製品をご使用のお客様は、エラータが利用可能になり次第、更新を行うことが強く推奨されます。適切な更新を早急に適用することが求められます。影響を受ける製品ではすべて、CVE-2017-5753 (バリアント 1) および CVE-2017-5754 (バリアント 3) を軽減するためのにフィクスを適用してください。CVE-2017-5715 (バリアント 2) は、ローカルおよび仮想化ゲストの境界を超えた悪用が可能です。
必要となる変更の性質上、Red Hat Enterprise Linux 7.2 以降を実行しているお客様は、kpatch を利用できません。
影響を受ける製品の更新
| 製品 | 対象バリアント | パッケージ | アドバイザリー/更新 |
| Red Hat Enterprise Linux 7 | 1、2、3 | kernel | RHSA-2018:0007 |
| Red Hat Enterprise Linux 7 | 1、2、3 | kernel-rt | RHSA-2018:0016 |
| Red Hat Enterprise Linux 7 | 2 | libvirt | 保留中 |
| Red Hat Enterprise Linux 7 | 2 | qemu-kvm | 保留中 |
| Red Hat Enterprise Linux 7 | 2 | dracut | 保留中 |
| Red Hat Enterprise Linux 7***** | 2 | microcode_ctl | RHSA-2018:0012 |
| Red Hat Enterprise Linux 7***** | 2 | linux_firmware | RHSA-2018:0014 |
| Red Hat Enterprise Linux 7.3 Extended Update Support* | 1、2、3 | kernel | RHSA-2018:0009 |
| Red Hat Enterprise Linux 7.3 Extended Update Support* | 2 | libvirt | 保留中 |
| Red Hat Enterprise Linux 7.3 Extended Update Support* | 2 | qemu-kvm | 保留中 |
| Red Hat Enterprise Linux 7.3 Extended Update Support* | 2 | dracut | 保留中 |
| Red Hat Enterprise Linux 7.3 Extended Update Support*,***** | 2 | microcode_ctl | 保留中 |
| Red Hat Enterprise Linux 7.3 Extended Update Support*,***** | 2 | linux_firmware | RHSA-2018:0015 |
| Red Hat Enterprise Linux 7.2 Advanced Update Support* | 1、2、3 | kernel | RHSA-2018:0010 |
| Red Hat Enterprise Linux 7.2 Advanced Update Support** | 2 | libvirt | 保留中 |
| Red Hat Enterprise Linux 7.2 Advanced Update Support** | 2 | qemu-kvm | 保留中 |
| Red Hat Enterprise Linux 7.2 Advanced Update Support** | 2 | dracut | 保留中 |
| Red Hat Enterprise Linux 7.2 Advanced Update Support**,***** | 2 | microcode_ctl | 保留中 |
| Red Hat Enterprise Linux 7.2 Advanced Update Support**,***** | 2 | linux_firmware | 保留中 |
| Red Hat Enterprise Linux 6 | 1、2、3 | kernel | RHSA-2018:0008 |
| Red Hat Enterprise Linux 6 | 2 | libvirt | 保留中 |
| Red Hat Enterprise Linux 6 | 2 | qemu-kvm | 保留中 |
| Red Hat Enterprise Linux 6***** | 2 | microcode_ctl | RHSA-2018:0013 |
| Red Hat Enterprise Linux 6.7 Extended Update Support* | 1、2、3 | kernel | RHSA-2018:0011 |
| Red Hat Enterprise Linux 6.7 Extended Update Support* | 2 | libvirt | 保留中 |
| Red Hat Enterprise Linux 6.7 Extended Update Support* | 2 | qemu-kvm | 保留中 |
| Red Hat Enterprise Linux 6.7 Extended Update Support*,***** | 2 | microcode_ctl | 保留中 |
| Red Hat Enterprise Linux 6.6 Advanced Update Support* | 1、2、3 | kernel | RHSA-2018:0017 |
| Red Hat Enterprise Linux 6.6 Advanced Update Support* | 2 | libvirt | 保留中 |
| Red Hat Enterprise Linux 6.6 Advanced Update Support* | 2 | qemu-kvm | 保留中 |
| Red Hat Enterprise Linux 6.6 Advanced Update Support*,***** | 2 | microcode_ctl | 保留中 |
| Red Hat Enterprise Linux 6.5 Advanced Update Support** | 1、2、3 | kernel | 保留中 |
| Red Hat Enterprise Linux 6.5 Advanced Update Support** | 2 | libvirt | 保留中 |
| Red Hat Enterprise Linux 6.5 Advanced Update Support** | 2 | qemu-kvm | 保留中 |
| Red Hat Enterprise Linux 6.5 Advanced Update Support**,***** | 2 | microcode_ctl | 保留中 |
| Red Hat Enterprise Linux 6.4 Advanced Update Support** | 1、2、3 | kernel | RHSA-2018:0018 |
| Red Hat Enterprise Linux 6.4 Advanced Update Support** | 2 | libvirt | 保留中 |
| Red Hat Enterprise Linux 6.4 Advanced Update Support** | 2 | qemu-kvm | 保留中 |
| Red Hat Enterprise Linux 6.4 Advanced Update Support**,***** | 2 | microcode_ctl | 保留中 |
| Red Hat Enterprise Linux 6.2 Advanced Update Support** | 1、2、3 | kernel | 保留中 |
| Red Hat Enterprise Linux 6.2 Advanced Update Support** | 2 | libvirt | 保留中 |
| Red Hat Enterprise Linux 6.2 Advanced Update Support** | 2 | qemu-kvm | 保留中 |
| Red Hat Enterprise Linux 6.2 Advanced Update Support**,***** | 2 | microcode_ctl | 保留中 |
| Red Hat Enterprise Linux 5 Extended Lifecycle Support* | 1、2、3 | kernel | 保留中 |
| Red Hat Enterprise Linux 5 Extended Lifecycle Support* | 2 | libvirt | 保留中 |
| Red Hat Enterprise Linux 5 Extended Lifecycle Support* | 2 | qemu-kvm | 保留中 |
| Red Hat Enterprise Linux 5 Extended Lifecycle Support*, **** | 2 | microcode_ctl | 保留中 |
| Red Hat Enterprise Linux 5.9 Advanced Update Support*** | 1、2、3 | kernel | 保留中 |
| Red Hat Enterprise Linux 5.9 Advanced Update Support*** | 2 | libvirt | 保留中 |
| Red Hat Enterprise Linux 5.9 Advanced Update Support*** | 2 | qemu-kvm | 保留中 |
| Red Hat Enterprise Linux 5.9 Advanced Update Support***,***** | 2 | microcode_ctl | 保留中 |
| RHEL Atomic Host | 1、2、3 | kernel | リスピン保留中 |
| Red Hat Enterprise MRG 2 | 1、2、3 | kernel-rt | 保留中 |
| Red Hat Virtualization (RHEV-H/RHV-H) | 1、2、3 | kernel | 保留中 |
| Red Hat Virtualization (RHEV-H/RHV-H) | 2 | qemu-kvm-rhev | 保留中 |
| Red Hat OpenStack v6 | 2 | qemu-kvm-rhev | 保留中 |
| Red Hat OpenStack v7 | 2 | qemu-kvm-rhev | 保留中 |
| Red Hat OpenStack v8 | 2 | qemu-kvm-rhev | 保留中 |
| Red Hat OpenStack v9 | 2 | qemu-kvm-rhev | 保留中 |
| Red Hat OpenStack v10 | 2 | qemu-kvm-rhev | 保留中 |
| Red Hat OpenStack v11 | 2 | qemu-kvm-rhev | 保留中 |
| Red Hat OpenStack v12 | 2 | qemu-kvm-rhev | 保留中 |
*このパッチを取得するには、有効な ELS サブスクリプションが必要です。
使用しているアカウントに有効な ELS サブスクリプションがない場合は、Red Hat または他社の営業担当者にお問い合わせください。
** このパッチを取得するには、有効な EUS サブスクリプションが必要です。
お持ちのアカウントに有効な EUS サブスクリプションがない場合は、Red Hat 営業部門または営業の担当者にお問い合わせください。
Red Hat Enterprise Linux Extended Update Support サブスクリプションとは何ですか?
*** RHEL AUS のパッチを入手するには、有効な AUS サブスクリプションが必要です。
****RHEL TUS のパッチを入手するには、有効な TUS サブスクリプションが必要です。
***** ハードウェア OEM に連絡して、最新バージョンの CPU マイクロコード/ファームウェアを入手してください。
軽減策
既知の軽減策はありません。Red Hat のお客様は、ベンダーの解決策を CPU に適用し、パッチが利用可能になり次第、カーネルを更新してください。
この問題を軽減するには、リスクベースのアプローチを適用することが推奨されます。高レベルのセキュリティーと信頼を必要とするシステムに最初に対処し、他の信頼できないシステムにエクスプロイトのリスクを低減する対処法が適用されるまで、これらのシステムから高レベルのセキュリティーと信頼を必要とするシステムを分離してください。
Xen ハイパーバイザーを使用しているお客様は、このソフトウェアではバリアント 2 エクスプロイトを完全に除外できず、準仮想化ゲスト上ではバリアント 3 エクスプロイトを除外できないという、技術的制限に注意してください。Red Hat では、Knowledgebase article で Xen の状況と Xen ハイパーバイザーユーザーが利用可能なオプションについて説明しています。
Comments