メルトダウンとスペクターの脆弱性からサーバーを保護する方法
MeltdownとSpectreとは何ですか?
2018年1月4日、最新のCPUの設計における複数の脆弱性が明らかになりました。 MeltdownおよびSpectreという名前のこれらの脆弱性は、特定のプロセッサパフォーマンスの最適化を利用して、攻撃者が正しく操作されたときにシステムとアプリケーションメモリの内容を明らかにするようにアプリケーションを強制することを可能にします。 これらの攻撃が機能するのは、プロセッサ内の通常の特権チェック動作が、投機的実行、分岐予測、アウトオブオーダー実行、キャッシングなどの機能の相互作用によって破壊されるためです。
Meltdownは、CVE-2017-5754で公開されました。 Spectreは、CVE-2017-5753およびCVE-2017-5715で公開されました。
詳細については、以下のメルトダウンの仕組みとスペクターの仕組みのセクションをご覧ください。
MeltdownとSpectreの影響を受けますか?
MeltdownとSpectreは、最新のプロセッサの大部分に影響を与えます。 これらの脆弱性で使用されるプロセッサの最適化は、ほとんどのCPUのコア設計機能です。つまり、ほとんどのシステムは、特別にパッチが適用されるまで脆弱です。 これには、デスクトップコンピューター、サーバー、およびクラウド環境で動作するコンピューティングインスタンスが含まれます。
Meltdownから保護するためのパッチが、オペレーティングシステムベンダーからリリースされています。 Spectreのアップデートもリリースされていますが、これは脆弱性のクラス全体を表しているため、より広範な継続的な修復が必要になる可能性があります。
クラウドおよび仮想化環境では、プロバイダーはゲストを保護するために基盤となるインフラストラクチャを更新する必要があります。 ユーザーは、ゲストオペレーティングシステム内の影響を軽減するためにサーバーを更新する必要があります。
どうすれば自分を守ることができますか?
このクラスの脆弱性に対する完全な保護には、CPU設計の変更が必要になる可能性があります。 暫定的に、ソフトウェアアップデートは、これらの脆弱性につながる最適化された動作の一部を無効にするか回避することにより、エクスプロイトに対する軽減を提供できます。
残念ながら、これらのパッチはプロセッサ内の最適化ルーチンに影響を与えるため、緩和パッチはサーバーのパフォーマンスを低下させる可能性があります。 速度低下の程度は、実行されている作業のタイプに大きく依存し、I/Oを多用するプロセスが最大の影響を受けます。
現在の緩和パッチステータス
執筆時点(2018年1月9日)で、Linuxディストリビューションはパッチの配布を開始しましたが、完全にパッチが適用されているディストリビューションはまだありません。
部分的緩和(SpectreのMeltdown AND バリアント1用にパッチが適用されています)を使用してカーネルアップデートをリリースしたディストリビューションには、次のものがあります。
- CentOS 7:カーネル3.10.0-693.11.6
- CentOS 6:カーネル2.6.32-696.18.7
部分的緩和(メルトダウン用にパッチが適用されている)を使用してカーネルアップデートをリリースしたディストリビューションには、次のものがあります。
- Fedora 27:カーネル4.14.11-300
- Fedora 26:カーネル4.14.11-200
- Ubuntu 17.10:カーネル4.13.0-25-generic
- Ubuntu 16.04:カーネル4.4.0-109-generic
- Ubuntu 14.04:カーネル3.13.0-139-generic
- Debian 9:カーネル4.9.0-5-amd64
- Debian 8:カーネル3.16.0-5-amd64
- Debian 7:カーネル3.2.0-5-amd64
- Fedora 27 Atomic:カーネル4.14.11-300.fc27.x86_64
- CoreOS:カーネル4.14.11-coreos
カーネルが少なくとも上記に対応するバージョンに更新されている場合、いくつかの更新が適用されています。
軽減機能付きのカーネルがまだリリースされていないオペレーティングシステムには、次のものがあります。
- FreeBSD 11.x
- FreeBSD 10.x
2018年1月13日にサポートが終了するUbuntu17.04は、パッチを受け取りません。 ユーザーは、更新または移行することを強くお勧めします。
警告:保守終了に達したリリースを更新または移行することを強くお勧めします。 これらのリリース
この脆弱性の重大性のため、完全なパッチセットを待つのではなく、利用可能になったときに更新を適用することをお勧めします。 これには、カーネルをアップグレードして、今後数日および数週間に複数回再起動する必要がある場合があります。
更新を適用するにはどうすればよいですか?
サーバーを更新するには、配布用のパッチが利用可能になったら、システムソフトウェアを更新する必要があります。 通常のパッケージマネージャーを実行して最新のカーネルバージョンをダウンロードし、サーバーを再起動してパッチを適用したコードに切り替えることで、更新できます。
注:この記事は、一般的に適用可能で、プラットフォームに依存しないように書かれています。 ホスティングプロバイダーとしてDigitalOceanを使用していて、古いDropletを実行している場合は、開始する前に追加の手順を実行する必要がある場合があります。
DigitalOceanのレガシーカーネル管理システムは、コントロールパネルで変更できる外部管理カーネルを使用していました。 ドロップレットがこのシステムを使用する場合は、続行する前に内部カーネル管理を使用するように構成する必要があります(新しいドロップレットはこのシステムを自動的に使用します)。 内部カーネルに更新する必要があるかどうかを確認し、切り替え方法を学ぶには、DigitalOceanサーバーのカーネルを更新する方法の記事をお読みください。
UbuntuおよびDebianサーバーの場合、ローカルパッケージインデックスを更新してからシステムソフトウェアをアップグレードすることにより、システムソフトウェアを更新できます。
- sudo apt-get update
- sudo apt-get dist-upgrade
CentOS サーバーの場合、次のように入力して、更新されたソフトウェアをダウンロードしてインストールできます。
- sudo yum update
Fedora サーバーの場合は、 dnf
代わりにツール:
- sudo dnf update
オペレーティングシステムに関係なく、更新が適用されたら、サーバーを再起動して新しいカーネルに切り替えます。
- sudo reboot
サーバーがオンラインに戻ったら、ログインしてアクティブなカーネルを上記のリストと照合し、カーネルがアップグレードされていることを確認します。 新しいアップデートを頻繁にチェックして、パッチが利用可能になったときにさらにパッチを受け取るようにします。
追加のコンテキスト
MeltdownおよびSpectreファミリーの脆弱性は、最新のプロセッサー内のパフォーマンス向上機能を悪用します。 投機的実行、特権チェック、アウトオブオーダー実行、CPUキャッシングなどのプロセッサ機能の組み合わせにより、アウトオブバウンズである必要のあるメモリ位置への読み取りアクセスが可能になります。 その結果、非特権プログラムは、メモリから機密データを明らかにしたり、カーネルや他のアプリケーションから特権メモリにアクセスしたりするように強制される可能性があります。
メルトダウンはどのように機能しますか?
Meltdownの脆弱性は、投機的実行と呼ばれるCPU最適化の欠陥を利用して、プロセッサをだまして範囲外のメモリ位置を読み取らせることで機能します。 一般的な考え方は次のように機能します。
- 不正なメモリ位置が要求されました。
- 条件付きで有効なメモリ位置を読み取るために2番目の要求が行われます最初の要求に特定の値が含まれている場合。
- 投機的実行を使用して、プロセッサは最初の要求が無効であることを確認する前に、両方の要求のバックグラウンド作業を完了します。 プロセッサは、要求に範囲外のメモリが含まれていることを理解すると、両方の要求を正しく拒否します。 特権チェックコードがメモリアクセスを無効として識別した後、結果はプロセッサによって返されませんが、アクセスされた場所は両方ともプロセッサのキャッシュに残ります。
- これで、有効なメモリ位置に対して新しい要求が行われます。 すぐに戻る場合は、その場所はすでにCPUキャッシュにあり、以前に条件付き要求が実行されたことを示しています。 これらの条件を繰り返し使用すると、範囲外のメモリ位置の値を理解できます。
Meltdownは、パッチを適用できる特定の脆弱性を表しています。
スペクターはどのように機能しますか?
Spectreは、プロセッサをだまして投機的実行を悪用し、制限された値を読み取ることによっても機能します。 開示通知には、複雑さと影響のレベルが異なる2つのバリアントが記載されています。
Spectreのバリアント1の場合、境界チェックが実施される前に、プロセッサがだまされて読み取りを投機的に実行します。 まず、攻撃者はプロセッサに、有効な境界を超えたメモリ位置に投機的に到達するように促します。 次に、Meltdownと同様に、追加の命令が範囲外の値に基づいて正当なアドレスを条件付きでキャッシュにロードします。 その後、有効なアドレスを取得するのにかかる時間を計ると、それがキャッシュにロードされたかどうかがわかります。 これにより、範囲外のメモリ位置の値が明らかになります。
SpectreのVariant2 は、悪用と軽減の両方で最も複雑です。 プロセッサは、まだ評価できない条件文に遭遇した場合でも、投機的に命令を実行することがよくあります。 彼らは、分岐予測と呼ばれるメカニズムを使用して、条件付きの最も可能性の高い結果を推測することによってこれを行います。
分岐予測は、コードパスを介した以前の実行の履歴を使用して、投機的に実行するパスを選択します。 これは、攻撃者がプロセッサをプライミングして誤った投機的決定を行うために使用される可能性があります。 ブランチ選択履歴には決定への絶対参照が格納されないため、プロセッサは、別の部分でトレーニングされている場合でも、コードの一部でブランチを選択するようにだまされる可能性があります。 これを利用して、許容範囲外のメモリ値を明らかにすることができます。
結論
SpectreとMeltdownは、深刻なセキュリティの脆弱性を表しています。 それらの考えられる影響の完全な可能性はまだ発展途上です。
自分自身を保護するために、ベンダーからパッチがリリースされているため、オペレーティングシステムソフトウェアの更新に注意し、MeltdownおよびSpectreの脆弱性に関連する通信を引き続き監視してください。