Samsung Galaxy S6のグラフィックスドライバーのバグがGoogle Chromeタブデータをどのようにリークしたか

3月下旬に、GPUの信頼性のテストに特化した英国の新興企業が、WebページにアクセスしたときにQualcomm Snapdragon 845 Samsung Galaxy S9 / S9 +が再起動するGPUバグを発見しました。 GraphicsFuzzと呼ばれる会社は、私たちと協力して問題をQualcommとSamsungに報告しました。 読者の中には、 GraphicsFuzzのような会社がこれらの脆弱性をどのように見つけることができるかを知ることに興味があったので、会社と協力して古いGPUの脆弱性を発見した方法を紹介しました。 既にパッチが適用されているこの脆弱性により、攻撃者はSamsung Galaxy S6のGoogle Chromeブラウザタブのコンテンツをリモートで「スパイ」することができました。

このユーザーは、悪意のあるWebページにアクセスする前に銀行のWebサイトを表示していました。 コンテンツがキャプチャされ、リモートサーバーにアップロードされました。 ソース:GraphicsFuzz。

GraphicsFuzzがGPUバグを見つける方法

グラフィックスドライバーは、シェーダープログラムを取得し、それをGPUに送信して実行し、画像をレンダリングします。 GPUにシェーダーを送信する前に、グラフィックスドライバーはそれをGPUが理解できる形式に変換します。 翻訳に誤りがあると、レンダリングの失敗、プログラムまたはデバイスのクラッシュ、誤った画像、さらにはセキュリティの問題に至る可能性があります。 GraphicsFuzzには、一連の参照シェーダーに基づいてこれらのバグを見つけることができる自動テストスイートがあります。 ユーザーがテストを実行すると、結果の画像はすべて同じに見えるはずです。 異なる画像は、バグがあったことを意味します。

GraphicsFuzzテストスイートを実行しているいくつかの一般的なデバイスの結果。 これらのチャートには、Samsung Galaxy S6、Samsung Galaxy S7、Samsung Galaxy S8が含まれています。 ソース:GraphicsFuzz。

Samsung Galaxy S6の場合、 GraphicsFuzzは、ある行の画像が別のテーブルにあるはずの画像を表示していることを発見しました。 これは、以前のテストの画像が後のテストに漏れていたことを意味します。 その後、チームはGoogle Chromeでテストスイートを再実行し、Webページの一部が画像に表示されていることを発見しました。 さらに、別のタブを開くと、画像に他のタブの一部が表示されることがわかりました。 基本的に、このバグにより、1つのGoogle Chromeタブが別のChromeタブに関する情報を漏らすことができました。 GraphicsFuzzの背後にあるチームは、意図的にセキュリティバグを探していませんでしたが、テストの結果、バグを見つけました。 (チームは、Galaxy S6およびMozilla Firefoxの標準のSamsungブラウザーでバグを再現したことに注意してください。)

バグの仕組み

Samsung Galaxy S6で長時間実行されるバグをトリガーするために使用される画像。 ソース:GraphicsFuzz。

GraphicsFuzzによって作成された「悪意のある」Webページは、上記のようにWebGLを使用してキャンバス内に空間シーンを描画しようとします。 各ピクセルの色は、フラグメントシェーダーによって決定されます。フラグメントシェーダーは、GPUで実行するためにWebページによって提供されるプログラムです。 GraphicsFuzzフレームワークはフラグメントシェーダーを変更し、それが非常に長い間実行する原因になりました。 シェーダーの実行時間が長すぎると、ブラウザーまたはオペレーティングシステムは通常、レンダリングを中止します。 ただし、数ピクセルを描画した後、GPUはレンダリングを中止しましたが、GPUドライバーはこれをGoogle Chromeに報告しませんでした。 (ガベージビデオメモリを示す記事の上部の画像を見ると、実際には左上のスペースシーンの一部を見ることができます。)これは、中断前にレンダリングされたピクセルがそのまま残されることを意味します。つまり、最終的にレンダリングされる画像は、ほとんどがガベージビデオメモリです。 ビデオメモリは他のWebページのレンダリングに継続的に使用されるため、実際には「ガベージ」データには他のWebページの以前のレンダリングが含まれます。 したがって、他のWebページが「悪意のある」Webページに表示されることになります。 重要なのは、WebGLがWebページでレンダリングされているもののコンテンツをキャプチャできるようにすることです。 その後、このイメージはリモートサーバーにアップロードされます。

Chromeタブのデータが「リーク」する原因となる長時間実行されるGPUバグを説明する図。出典:GraphicsFuzz。

Google Chromeは複数のプロセスを使用するため、異なるタブが分離されることが多く、この悪用は表面上は不可能に思えます。 ただし、Chromeは単一の「GPUプロセス」を使用してGPUと対話します。つまり、すべてのタブが同じGPUメモリを共有するため、このエクスプロイトが機能します。 上の図は、これをより詳細に示しています。

このビデオでは、最初の22秒間にバグが示されています。 GraphicsFuzzで見つかったその他のセキュリティ問題も示されています。

学ぶべき教訓

WebGLでは悪意のあるWebページがGPUにコードを送信して実行できるため、GPUの誤動作により、Google ChromeとAndroidのセキュリティ対策がすべてバイパスされる可能性があります。 Googleはハードウェアとドライバーを制御していないため、 GPUのバグを修正できません 。 この場合、バグを修正するのはGPUベンダー(この場合はARM)であり、修正プログラムを更新プログラムに統合するのは、デバイスが影響を受けるOEM(この場合はSamsung)です。 キャリアをミックスに追加すると、このようなバグの修正に非常に長い時間がかかることが簡単にわかります。ほとんどのSamsung Galaxy S6ユーザーがパッチを受け取るには少なくとも5か月かかりました

GraphicsFuzzは、GPUベンダーが誤ったコードを生成してGPUで実行する原因となる、誤コンパイルバグなどの検出が難しいバグを見つけるのに役立ちます。 自動化されたテストフレームワークにより、この記事で紹介したようなバグを見つけることができます。 「悪意のある」Webページによって引き起こされる長時間のループは、HTC One M7や最近ではSamsung Galaxy S9などの他のデバイスでも問題を引き起こすことが示されています。 GraphicsFuzzは主力スマートフォンをテストし、テストのサブセットでのパフォーマンスに基づいてこれらのデバイスをランク付けする結果テーブルを公開します。 テスト中に数百のクラッシュとレンダリングエラーが見つかりましたが、ほとんどはセキュリティの脅威をもたらすかどうかを調べるために調査されていません。 ただし、このエクスプロイトが示すように、GPUの誤動作はセキュリティリスクであり、1つ以上の重大なセキュリティ脆弱性が発見されるのを待っている可能性があります。 GraphicsFuzzは、GPUベンダーが将来のドライバー品質の改善を優先することを望んでいます。

総問題数でソートされたグラフィックスドライバーの信頼性の比較。 ソース:GraphicsFuzz。

開示タイムライン

  • 2016年12月、 GraphicsFuzzはChrome報酬プログラムの対象であったため、Google Chromiumバグトラッカーにバグを報告しました。 GraphicsFuzzがGoogle Chromiumバグトラッカーにバグを送信した後、バグはGoogleに受け入れられ、パッチを適用するためにARMおよびSamsungに転送されました。
  • GoogleはARMとSamsungの連絡先にレポートを転送しました。
  • Samsungは、2017年3月から6月にリリースされたAndroid 7.0 Nougat更新プログラムでサイレントにバグにパッチを適用し、修正を公開しました。Samsung、Google、またはARMによって作成されたCVEはなく、 、 GraphicsFuzzは適切なプロセスを介してバグを報告しなかったことに注意してください。
  • その後、 GraphicsFuzzは、SamsungとARMの両方がレポートを見たこと、およびARMがレポートのために問題を修正できたことを確認できました。
  • 2017年8月、 GraphicsFuzzはバグレポートに対してGoogleから2, 000ドルの報酬を受け取りました。
  • 2017年11月に、バグレポートが公開されました。