Meltdown/Spectre

概要

1 月 3 日、Project Zero は、プロセスが任意のプロセスに属していないメモリを含む(最悪の場合)任意のメモリを読み取るために使用できる最新の CPU の脆弱性を明らかにしました。これらの脆弱性は、Spectre およびメルトダウンという名前になっています。Chrome はウェブの安全性を維持するために何を行っているか?また、ウェブ デベロッパーは自社のサイトに対してどのような対策を講じるべきか?

要約

ウェブをブラウジングするユーザーは、オペレーティング システムとブラウザを常に最新の状態にしておく必要があります。また、Chrome をご利用の場合は、サイト分離を有効にすることもご検討ください。

ウェブ デベロッパーの方は、Chrome チームから以下のアドバイスを受けることをおすすめします。

  • 可能な限り、SameSite および HTTPOnly Cookie 属性を使用し、document.cookie からの読み取りを回避することで、Cookie がレンダラ プロセスのメモリに挿入されないようにします。
  • サイト分離を有効にしているユーザーに対してクロスオリジン読み取りブロックを最大限に活用するため、MIME タイプが正しいことを確認し、ユーザー固有のコンテンツや機密性の高いコンテンツを含む URL に X-Content-Type-Options: nosniff ヘッダーを指定します。
  • サイト分離を有効にして、サイトで問題が生じる場合は Chrome チームにお知らせください

これらのステップが役立つ理由については、以下をお読みください。

リスク

これらの脆弱性については多種多様な説明が寄せられているため、ここではこれ以上説明しません。これらの脆弱性がどのように悪用されるかにご興味がある場合は、Google Cloud チームの同僚によるブログ投稿をご覧ください。

Meltdown と Spectre はどちらも、あるプロセスが本来はできないメモリを読み取ることができる可能性があります。異なるサイトの複数のドキュメントが Chrome でプロセスを共有する場合もありますこれは、一方が window.open<a href="..." target="_blank">、または iframe を使用して他方を開いたときに発生することがあります。ウェブサイトにユーザー固有のデータが含まれている場合、別のサイトでこれらの新しい脆弱性を利用して、ユーザーデータが読み取られる可能性があります。

リスクの軽減

Chrome と V8 のエンジニアリング チームは、この脅威を軽減するためにさまざまな取り組みを行っています。

サイト分離

機密データが攻撃者の管理コードとプロセスを共有するのを防ぐことで、Spectre が悪用された場合の影響を大幅に軽減できます。Chrome チームでは、「サイト分離」と呼ばれる機能の開発に取り組んでいます。

既知の問題がいくつかあり、Chrome チームはできる限り多くのフィールド テストを行いたいと考えているため、サイト分離はデフォルトで有効になっていません。ウェブ デベロッパーは、サイト分離を有効にして、サイトが引き続き機能するかどうかを確認する必要があります。今すぐ有効にする場合は、chrome://flags#enable-site-per-process を有効にしてください。動作しないサイトを見つけた場合は、バグを報告し、サイト分離が有効になっていることをお伝えください。

クロスサイト ドキュメントのブロック

すべてのクロスサイト ページを個別のプロセスに配置している場合でも、画像や JavaScript などの一部のクロスサイト サブリソースについては、正当にリクエストできます。こうした情報が機密情報の漏洩を防ぐため、サイト分離には、レンダラ プロセスに配信されるネットワーク レスポンスを制限する「クロスサイト ドキュメント ブロック」機能があります。

ウェブサイトは、「ドキュメント」と「リソース」という 2 種類のデータをサーバーにリクエストできます。ここでいうドキュメントとは、HTML、XML、JSON、テキスト ファイルです。ウェブサイトは、自身のドメインまたは制限の緩い CORS ヘッダーを持つ他のドメインからドキュメントを受信できます。リソースには画像、JavaScript、CSS、 フォントなどが含まれますリソースはどのサイトからでも含めることができます。

クロスサイト ドキュメント ブロック ポリシーでは、次の場合にプロセスが他の送信元から「ドキュメント」を受信できないようにします。

  1. HTML、XML、JSON、text/plain MIME タイプのいずれかである。
  2. X-Content-Type-Options: nosniff HTTP レスポンス ヘッダーがあるか、簡単なコンテンツ分析(「スニッフィング」)によってタイプが正しいことを確認します。
  3. CORS がドキュメントへのアクセスを明示的に許可しない

このポリシーでブロックしたドキュメントは、空としてプロセスに提示されますが、リクエストは引き続きバックグラウンドで行われます。

たとえば、攻撃者が <img src="https://yourbank.com/balance.json"> などの機密データを含む JSON ファイルを含む <img> タグを作成するとします。サイト分離を使用しない場合、JSON ファイルのコンテンツはレンダラ プロセスのメモリに到達し、その時点でレンダラは有効な画像形式ではないことに気づき、画像をレンダリングしません。ただし、Spectre では、そのメモリチャンクを読み取る方法が用意されています。クロスサイト ドキュメント ブロックでは、MIME タイプがクロスサイト ドキュメント ブロックによってブロックされるため、このファイルの内容がレンダラが実行されているプロセスのメモリに入ることがなくなります。

ユーザーに関する指標によると、text/html または text/plain MIME タイプで配信される JavaScript ファイルと CSS ファイルは多数あります。誤ってドキュメントとしてマークされたリソースがブロックされないように、Chrome はレスポンスのスニッフィングを行って MIME タイプが正しいことを確認します。このスニッフィングは完全ではないため、ウェブサイトに正しい Content-Type ヘッダーを設定している場合、Chrome チームはすべてのレスポンスに X-Content-Type-Options: nosniff ヘッダーを追加することをおすすめします。

クロスサイト ドキュメント ブロックを試す場合は、上記の手順に沿ってサイト分離にオプトインします。

Cookie の数: SameSite

上記の例 <img src="https://yourbank.com/balance.json"> に戻ってみましょう。この方法は、yourbank.com がユーザーを自動的にログインさせる Cookie を保存している場合にのみ有効です。通常、Cookie を設定したウェブサイトに対するすべてのリクエストで送信されます。これは、<img> タグを使用して第三者がリクエストを行った場合でも同様です。SameSite Cookie は、同じサイトから発信されたリクエストにのみ Cookie を関連付けることを指定する新しい属性です。残念ながら、現時点では、この属性をサポートしているのは Chrome と Firefox 58 以降のみです

HTTPOnlydocument.cookie

サイトの Cookie がクライアント JavaScript ではなくサーバーサイドでのみ使用される場合、Cookie データがレンダラ プロセスに転送されないようにする方法がいくつかあります。HTTPOnly Cookie 属性を設定して、Chrome などのサポートされているブラウザでクライアント側のスクリプトから Cookie にアクセスすることを明示的に防止できます。HTTPOnly を設定できない場合は、どうしても必要な場合を除き、document.cookie を読み取らないようにすることで、読み込みの Cookie データがレンダリングされるプロセスにさらされるのを制限できます。

target="_blank" を使用して別のページにリンクすると、開いたページは window オブジェクトにアクセスし、ページを別の URL に移動できます。サイト分離を使用しないと、ページと同じプロセスになります。ページの保護を強化するには、新しいウィンドウで開く外部ページへのリンクに必ず rel="noopener" を指定してください。

高解像度タイマー

攻撃者は Meltdown または Spectre を悪用するために、メモリから特定の値を読み取るのにかかる時間を測定する必要があります。そのためには、信頼性の高い正確なタイマーが必要です。

ウェブ プラットフォームが提供する API の 1 つに、5 マイクロ秒の精度を持つ performance.now() があります。緩和策として、すべての主要なブラウザで performance.now() の解像度を下げ、攻撃を阻止しやすくしています。

高解像度タイマーを取得するもう 1 つの方法は、SharedArrayBuffer を使用することです。バッファは、カウンタをインクリメントするために専用のワーカーによって使用されます。メインスレッドはこのカウンタを読み取り、タイマーとして使用します。当面の間、ブラウザは他の緩和策が適用されるまで SharedArrayBuffer を無効にすることに決定しました。

V8

Spectre を利用するためには、特別に細工された一連の CPU 命令が必要です。V8 チームは、既知の攻撃の概念実証の緩和策を実装し、これらの攻撃がトリガーされても、生成されたコードを安全に保つ、最適化コンパイラである TurboFan に対する変更にも取り組んでいます。ただし、これらのコード生成の変更により、パフォーマンスが低下する可能性があります。

ウェブの安全性の確保

スペクターとメルトダウンの発見とその意味については、多くの不確実性がありました。この記事が、ウェブ プラットフォームを安全に保つために Chrome チームと V8 チームが行っている取り組み、そしてウェブ デベロッパーが既存のセキュリティ機能を使ってどのように支援できるかについて、皆様のお役に立つことを願っています。ご不明な点がございましたら、Twitter でお気軽にお問い合わせください。