ChromeOS のリモート メモリ破損の脆弱性を発見

news

マイクロソフトは、リモートでトリガーできる ChromeOS コンポーネントにメモリ破損の脆弱性を発見しました。この脆弱性により、攻撃者はサービス拒否 (DoS) や、極端な場合にはリモート コード実行 (RCE) を実行できます。 Linux に焦点を当てたD-Bus ブログ投稿に続いて、D-Bus サービスとそのハンドラー コードを監査することにより、他のプラットフォームで同様の D-Bus パターンを検索しました。ローカル メモリの破損の問題を特定した後、オーディオ メタデータを操作することでリモートから脆弱性が引き起こされる可能性があることを発見しました。攻撃者は、ブラウザーまたはペアリングされた Bluetooth デバイスから単に新しい曲を再生するか、敵対者 (AiTM) 機能を利用して脆弱性をリモートで悪用するなどして、ユーザーをこれらの条件を満たすように仕向ける可能性があります。

その影響を慎重に検討した後、Microsoft のセキュリティ研究者は 2022 年 4 月に脆弱性を Google と共有し、 Chromium バグ追跡システムにも報告しました。 CVE-2022-2587として割り当てられ、Common Vulnerability Scoring System ( CVSS ) スコアが 9.8 (脆弱性を重大に分類) である脆弱性に対する修正プログラムがすぐにリリースされ、エンド ユーザーに正常に展開されました。 Google チームと Chromium コミュニティの専門的な解決策と共同作業に感謝いたします。

この調査は、さまざまなレガシー PC や Mac を Chromebook に変換できるChromeOS Flexの最近のリリースと相まって、ChromeOS を実行しているデバイスのセキュリティを分析および監視することの重要性を強調しています。さらに、最も強化されたオペレーティング システムにもセキュリティ バグが含まれている可能性があるため、すべてのクロスプラットフォーム デバイスとオペレーティング システムを強力に監視する必要性を強調しています。管理されていないデバイスを保護するための最善の方法は、 Microsoft Defender for Endpoint のデバイス検出機能を使用して、疑わしいトラフィックを監視し、そのようなデバイスでの攻撃者の活動を検出することです。

このブログ投稿では、脆弱性に関する情報を共有し、脆弱性がどのように引き起こされる可能性があるか、および考えられる影響を調べます。すべてのユーザーのセキュリティを継続的に改善する取り組みにおいて、クロスドメインの専門知識が新しい未知の脅威を発見するのにどのように役立つかを示すとともに、調査の詳細をより大きなセキュリティ コミュニティと共有して、プラットフォームとデバイスを保護するためのコラボレーションの重要性を強調します。

ChromeOS セキュリティの概要

D-Bus を使用する有名なオペレーティング システムの 1 つに ChromeOS があります。 ChromeOS は、Chromebook、Chromebox、Chromebit、Chromebase で動作する Google 独自の Linux ベースのオペレーティング システムです。 ChromeOS は、ChromiumOS から派生したオープンソース コンポーネントを備えたクローズド ソース システムであり、オペレーティング システムは Google 独自の Chrome ブラウザーを主要なユーザー インターフェイスとして使用します。

セキュリティに関しては、ChromeOS は十分に強化されています。 ChromeOS のセキュリティ機能には次のようなものがあります。

  • 強化されたサンドボックス (ミニジェイルと呼ばれる)
  • 確認済みの起動
  • ロックダウンされたファイルシステム ( noexecnosuidnodevでマウント) および dm-verity
  • root ユーザーの制限 (SECURE_NOROOT)
  • 開発モードに入ると、ローカルに保存されたすべてのデータが消去されます

他の最新のブラウザーと同様に、ChromeOS を悪用するには通常、脆弱性を連鎖させる必要があります。 ChromeOS の強化対策により、脆弱性の発見は特定のニッチになりました。そのため、公開されている脆弱性の数は、他のオペレーティング システムと比較してかなり少なくなっています。 ChromeOS の脆弱性は通常、次の 3 つのクラスのいずれかに分類されます。

  1. ChromeOS 固有のロジックの脆弱性
  2. ChromeOS 固有のメモリ破損の脆弱性
  3. Chrome ブラウザの脆弱性などの広範な脅威

この場合、発見された脆弱性は、2 番目のクラスである ChromeOS 固有のメモリ破損の脆弱性に分類されます。

バグハンティング

D-Bus について議論し、広範囲に調査した後、ChromeOS で提供される D-Bus サービスを列挙することで、この分析を続けました。一般に、D-Bus はデスクトップ プラットフォーム、特に Linux で一般的なプロセス間通信 (IPC) メカニズムです。

ChromeOS の開発者モードでは、D-bus 経由でメッセージを送信するためのdbus-sendユーティリティが提供されています。 ChromeOS では多くの D-Bus サービスが提供されているため (通常は「 org.chromium 」プレフィックスで識別されます)、プロセスを自動化し、 dbus-sendユーティリティを使用して、サービスの完全なツリーとエクスポートされたメソッドとシグナルを取得しました。

ほとんどの D-Bus サービスはorg.freedesktop.DBus.Introspectableインターフェイスをサポートしているため、ソース コードを読み取ったり、バイナリをリバース エンジニアリングしたりすることなく、エクスポートされたメソッドとシグナルを動的に取得できます。

エクスポートされたすべてのサービス名の取得は、次のコマンドを使用して実行できます。

dbus-send --system --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames

例としてorg.chromium.ResourceManagerを使用すると、次のコマンドを使用して、宣言されたメソッドとシグナルについて各サービスを列挙できます。

dbus-send --system --dest=org.chromium.ResourceManager --type=method_call --print-reply /org/chromium/ResourceManager org.freedesktop.DBus.Introspectable.Introspect

メソッドが受け取る入力が多いほど、セキュリティの問題が見つかる可能性が高くなることを考慮して、文字列や配列など、任意に大きな入力をエクスポートするメソッドに注目しました。ほどなくして興味深いサービスorg.chromium.crasが見つかりました。

脆弱性

org.chromium.cras D-Bus の名前は CRAS (ChromiumOS Audio Server) によって所有されており、ChromiumOS wiki ページの下に十分に文書化されたアーキテクチャがあります。本質的に、CRAS はオペレーティング システムと ALSA (Advanced Linux Sound Architecture) の間に存在するサーバーであり、USB スピーカーや Bluetooth ヘッドセットなど、新しく接続されたオーディオ対応周辺機器にオーディオをルーティングする手段です。

エクスポートされたメソッドを確認すると、特に興味深い処理関数を持つ 1 つのメソッドが見つかりました。それは、入力として 1 つの文字列 ( identityと呼ばれる引数) を取得するSetPlayerIdentityです。 ChromiumOS はオープンソースであるため、呼び出しの追跡は簡単です。

  1. cras_dbus_control.cではSetPlayerIdentity のハンドラー関数は handle_set_player_identityあり、D-Bus メッセージからID引数を抽出し、 cras_bt_player_update_identity関数を呼び出します。
  2. cras_bt_player.cでは、呼び出された関数cras_bt_player_update_identityが、 ID入力値が null ではなく、現在のプレーヤーID文字列 ( player.identityに保存されている) と異なることを確認します。その場合、C ライブラリ関数strcpyを使用して、 identity変数をplayer.identityにコピーします。 「player」はcras_bt_playerモジュールのグローバル変数であり、特にIDフィールドが含まれています。

経験豊富なセキュリティ エンジニアにとって、 strcpy関数について言及するとすぐに危険信号が発生します。 strcpy関数は、境界チェックを実行しないため、安全でないと見なされるため、さまざまなメモリ破損の脆弱性を引き起こすことが知られています。 strcpyを呼び出す前に、ユーザーが指定したID引数の境界チェックがないため (D-Bus メッセージのデフォルトのメッセージ長制限以外に)、ヒープベースのバッファー オーバーフローをトリガーできると確信していたため、メモリ破損の脆弱性がトリガーされました。

ヒープベースのバッファ オーバーフローは複数の脆弱性の原因となる可能性があり、最も悪名高いものは、さまざまな手段による任意のコードの実行につながります。これには、割り当てられたオブジェクトの関数コールバックのオーバーライドやチャンク メタデータのオーバーライドが含まれる可能性があり、プログラムの存続期間中に他の予期しない動作を引き起こす可能性があります。

player.identity文字列がどのように初期化されているかを確認すると、 malloc(128)の結果としてcras_bt_player_init関数に設定されていることがわかります。これは、ユーザーのヒープに 128 バイトが割り当てられていることを意味します。

strcpy 呼び出しを含む脆弱な関数を示すコード
図 1. strcpy呼び出しを含む脆弱な関数

したがって、以下のコード例に示すように、128 バイトを超えるIDユーザー制御の D-Bus 引数を送信することにより、単一のコマンド ラインを使用して脆弱性がトリガーされる可能性があります。

dbus-send --system --dest=org.chromium.cras --type=method_call --print-reply /org/chromium/cras org.chromium.cras.Control.SetPlayerIdentity 文字列:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

ほとんどのユーザーは ChromeOS の開発者モードを有効にする必要がなく、したがってdbus-sendユーティリティを使用できないため、次のタスクは、開発者モードを使用せずにバグをトリガーする方法を見つけることでした。

リモートでバグをトリガーする

ローカル メモリの破損の問題を発見したと考えて、バグを引き起こす方法をよりよく理解したいと考えました。関連する関数は D-Bus からのみトリガーされるため、 SetPlayerIdentity D-Bus メソッドをトリガーする関数を探しました。それらの引数に境界チェックがない場合、それらの関数を使用して脆弱性がトリガーされる可能性があります。

オープンソースの ChromiumOS リポジトリを調べると、CRAS オーディオ クライアントがSetPlayerIdentityメソッドを呼び出す (そして同じ名前の関数をエクスポートする) ことがわかりました。次に、曲のタイトルを表すメタデータ構造からIDを抽出する CRAS オーディオ ハンドラ コンポーネントのメソッドMediaSessionMetadataChangedによって呼び出されます。

メタデータの変更によってトリガーされる SetPlayerIdentity を示すコード
図 2. メタデータの変更によってトリガーされる SetPlayerIdentity

この時点で、音声メタデータの変更によって脆弱性が引き起こされる可能性があることは明らかでした。 MediaSessionMetadataChanged呼び出しを検索すると、両方ともリモートでトリガーされる可能性がある 2 つの興味深いケースが明らかになりました。

  1. ブラウザーから: ブラウザーで新しい曲を再生するときなど、メタデータが変更されると、ブラウザーのメディア コンポーネントが関数を呼び出します。
  2. Bluetooth から: オペレーティング システムのメディア セッション サービスは、曲のメタデータが変更されたときに関数を呼び出します。これは、ペアリングされた Bluetooth デバイスから新しい曲を再生するときに発生する可能性があります。
ブラウザーまたは Bluetooth デバイスがどのように MediaSessionMetadataChanged をトリガーし、次に SetPlayerIdentity を D-Bus 経由で送信し、handle_control_message をトリガーし、次に handle_set_player_identity をトリガーし、最後に脆弱な関数 cras_bt_player_update_identity をトリガーする方法を示すコール ツリー。
図 3. ブラウザーまたは Bluetooth メディア メタデータの変更が最終的に脆弱な機能をトリガーする方法を示すコール ツリー

影響と報告

この脆弱性は 2022 年 4 月に Chromium バグ追跡システムの一部として Google に報告され、問題 1320917が割り当てられ、すぐに優先度 1 のセキュリティ バグとして割り当てられました。並行して、 Microsoft Security Vulnerability Research (MSVR) でこの問題を社内で追跡し、 OSINTを使用してその脆弱性が実際に使用されている兆候を探しました。野生での搾取の兆候は見つかりませんでした。

ヒープベースのバッファ オーバーフローの影響は、単純な DoS から本格的な RCE までさまざまです。メディア メタデータの操作によってチャンクを割り当てて解放することは可能ですが、この場合、正確なヒープ グルーミングを実行することは簡単ではなく、攻撃者はエクスプロイトを他の脆弱性と連鎖させて、任意のコードを正常に実行する必要があります。脆弱性の潜在的な影響と、それがリモートでトリガーされる可能性があるという事実を考えると、バグの優先順位と修正プログラムが発行された速さを正当化するのはセキュリティ リスクです。

修正のスピードとプロセス全体の有効性に感銘を受けました。 1 週間以内にコードがコミットされ、数回のマージの後、一般にユーザーが利用できるようになりました。 Google チームと Chromium コミュニティがこの問題に対処してくれたことに感謝します。

調査と脅威インテリジェンスの共有を通じて、すべての人のセキュリティを向上させる

脅威とコンピューティング環境が進化し続ける中、Microsoft は、使用しているデバイスやプラットフォームに関係なく、調査に基づく保護と、顧客、パートナー、および業界の専門家とのコラボレーションを通じて、すべてのセキュリティを継続的に改善するよう努めています。

進化する脅威ランドスケープを防御するために、組織は、管理されていないデバイスを含め、プラットフォーム全体ですべてのデバイスとオペレーティング システムを綿密に監視する必要があります。管理されていないデバイスは、参加時にセキュリティ チームによって無視されたり見落とされたりすることがあり、侵害、横移動の実行、ネットワーク境界のジャンプ、およびより広範な攻撃を開始するための持続性の達成のための魅力的なターゲットになります。 Microsoft Defender for Endpoint のデバイス検出機能は、組織が ChromeOS を実行しているデバイスを含む特定の管理されていないデバイスを見つけるのに役立ち、攻撃者がサーバーやその他の管理対象デバイスとのネットワーク対話を開始したときに、攻撃者によって操作されているかどうかを検出できます。

マイクロソフトのセキュリティ研究者は、新しい脆弱性と脅威を発見するために継続的に取り組み、さまざまな広範な問題に関する知識を改善されたソリューションに変えて、プラットフォーム全体でユーザーと組織を毎日保護しています。このケースは、問題を効果的に軽減し、現在および将来の脅威からユーザーを保護するために、脆弱性の開示と脅威インテリジェンスの共有がいかに重要であるかを示しています。さらに、以前の調査を拡張することで、現在直接サポートしていないプラットフォームであっても、世界中のデバイスの全体的なセキュリティに積極的に貢献し続けることができます.

ジョナサン・バー・オア

Microsoft 365 Defender 研究チーム

参考: https ://www.microsoft.com/en-us/security/blog/2022/08/19/uncovering-a-chromeos-remote-memory-corruption-vulnerability/

Comments

タイトルとURLをコピーしました