Meltdown/Spectre

概要

1 月 3 日、Project Zero は、プロセスに属さないメモリを含む任意のメモリ(最悪でも)の読み取りに使用できる、最新の CPU の脆弱性を明らかにしました。この脆弱性を SpectreMeltdown と名付けました。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、テキスト ファイルがあります。ウェブサイトは、独自のドメインから、または permissive 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">)に戻りましょう。これは、ユーザーを自動的にログインさせる Cookie を yourbank.com が保存している場合にのみ機能します。Cookie は通常、Cookie を設定するウェブサイトに対するすべてのリクエストに対して送信されます。第三者によって <img> タグを使用してリクエストが行われた場合でも送信されます。SameSite Cookie は、同じサイトから発生したリクエストにのみ Cookie を関連付けることを指定する新しい属性です。そのため、この名前が付けられました。残念ながら、執筆時点でこの属性をサポートしているのは Chrome と Firefox 58 以降のみです

HTTPOnlydocument.cookie

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

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

高精度タイマー

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

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

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

V8

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

ウェブの安全性の確保

Spectre と Meltdown の発見とその影響については、多くの不確実性がありました。この記事が、Chrome チームと V8 チームがウェブ プラットフォームを安全に保つために行っていることと、ウェブ デベロッパーが既存のセキュリティ機能を使用してどのようにサポートできるかについて、少しでもお役に立てば幸いです。ご不明な点がございましたら、Twitter でお気軽にお問い合わせください。