macOS アプリ サンドボックス エスケープの脆弱性の発見: CVE-2022-26706 の詳細

news

Microsoft は、特別に細工されたコードがアプリ サンドボックスを回避し、システム上で無制限に実行される可能性がある macOS の脆弱性を発見しました。これらの調査結果は、2021 年 10 月にMicrosoft Security Vulnerability Research ( MSVR ) によるCoordinated Vulnerability Disclosure (CVD) を通じて Apple と共有しました。 2022 年 5 月 16 日。Microsoft は、同様の手法を独自に発見した別の研究者、Arsenii Kostromin (0x3c3e) と脆弱性開示クレジットを共有しています。

macOS ユーザーには、これらのセキュリティ更新プログラムをできるだけ早くインストールすることをお勧めします。また、この問題の修正に迅速に対応してくれた Apple 製品セキュリティ チームにも感謝します。

App Sandbox は、アプリケーション開発者が Mac App Store を通じてアプリケーションを配布するために採用する必要がある Apple のアクセス制御テクノロジです。基本的に、アプリのプロセスは、特定のファイルを読み書きする機能など、カスタマイズ可能なルールで適用されます。また、アプリ サンドボックスは、システム リソースとユーザー データへのプロセスのアクセスを制限して、アプリが侵害された場合の影響や損害を最小限に抑えます。しかし、特別に細工されたコードがこれらのルールを回避できることがわかりました。攻撃者は、このサンドボックス エスケープの脆弱性を利用して、影響を受けるデバイスで昇格された権限を取得したり、追加のペイロードをインストールするなどの悪意のあるコマンドを実行したりする可能性があります。

この脆弱性は、macOS 上の Microsoft Office で悪意のあるマクロを実行および検出する潜在的な方法を調査しているときに発見されました。後方互換性のために、Microsoft Word は「~$」接頭辞が付いたファイルを読み書きできます。私たちの調査結果では、macOS の Launch Services を利用して、上記のプレフィックスを持つ特別に細工された Python ファイルに対してopen –stdinコマンドを実行することで、サンドボックスを回避できることが明らかになりました。

私たちの調査によると、macOS に組み込まれている基本的なセキュリティ機能でさえバイパスされ、システムやユーザーのデータが危険にさらされる可能性があります。したがって、脆弱性の研究者、ソフトウェア ベンダー、およびより大きなセキュリティ コミュニティの間の協力は、全体的なユーザー エクスペリエンスを保護する上で依然として重要です。これには、責任を持ってベンダーに脆弱性を開示することが含まれます。

さらに、このケース スタディからの洞察は、 Microsoft Defender for Endpointなどの保護テクノロジを強化するだけでなく、ソフトウェア ベンダーのセキュリティ戦略とコンピューティング ランドスケープ全体を強化するのにも役立ちます。したがって、このブログ投稿では、私たちの調査の詳細と、分析を強化するのに役立つ他のセキュリティ研究者によって報告された同様のサンドボックス エスケープ脆弱性の概要を提供します。

macOS アプリ サンドボックスのしくみ

簡単に言うと、macOS アプリは、オペレーティング システムが自身に適用するサンドボックス ルールを指定できます。アプリ サンドボックスは、システム コールを許可されたサブセットに制限します。システム コールは、ファイル、オブジェクト、および引数に基づいて許可または禁止できます。簡単に言うと、サンドボックス ルールは、アプリケーションを実行しているユーザーの種類に関係なく、アプリケーションが実行できる操作と実行できない操作の種類を決定する多層防御メカニズムです。このような操作の例は次のとおりです。

  • アプリケーションが読み書きできる、またはできないファイルの種類。
  • アプリケーションがカメラやマイクなどの特定のリソースにアクセスできるかどうか。
  • アプリケーションがインバウンドまたはアウトバウンドのネットワーク接続を実行できるかどうか。
アプリ サンドボックスを使用する場合と使用しない場合で、ユーザー データとシステム リソースがアプリにアクセスする方法を比較した図。アプリ サンドボックスがないと、すべてのユーザー データとシステム リソースがアプリに無制限にアクセスできます。アプリ サンドボックスを使用すると、サンドボックス内に閉じ込められたデータとリソースのみがアプリに無制限にアクセスできます。他のすべてのユーザー データとリソースにはアクセスできません。
図 1. App Sandbox のドキュメントからのサンドボックス化されたアプリの図 (写真提供: Apple)

そのため、アプリ サンドボックスは、すべての macOS 開発者にとって、特に攻撃面が大きく、ユーザー提供のコードを実行するアプリケーションにベースライン セキュリティを提供するのに役立つツールです。これらのアプリケーションの一例は、Microsoft Office です。

macOS での Microsoft Office のサンドボックス化

攻撃者は、デバイスやネットワークへの足がかりを得ようとして、Microsoft Office を標的にしています。彼らの手法の 1 つは Office マクロを悪用することで、これをソーシャル エンジニアリング攻撃で使用して、ユーザーをだましてマルウェアやその他のペイロードをダウンロードさせます。

Windows システムでは、 Microsoft Defender Application Guard for Officeは、Hyper-V を使用してホスト環境を分離することにより、このようなマクロの悪用から Microsoft Office を保護するのに役立ちます。この機能を有効にすると、攻撃者は最初に、 Hyper-V のゲストからホストへの脆弱性を備えてホスト システムに影響を与える必要があります。これは、単純にマクロを実行する場合に比べて非常に高いハードルです。 macOS に同様の分離テクノロジと既定の設定がない場合、Office はオペレーティング システムの既存の軽減戦略に依存する必要があります。現在、最も有望なテクノロジーは macOS App Sandbox です。

Microsoft サンドボックス ルールの表示は、コードサインユーティリティを使用すると非常に簡単です。以下の図 2 は、切り捨てられた Microsoft Word のサンドボックス ルールを示しています。

macOS の Microsoft Word のアプリ サンドボックス ルールに関連するさまざまなキーと値を示すコマンド ライン インターフェースの部分的なスクリーンショット。
図 2. codesign ユーティリティを使用して Microsoft Word サンドボックス ルールを表示する

ルールの 1 つは、アプリケーションが読み取りまたは書き込みを許可されるファイルの種類を決定します。以下の構文のスクリーンショットに示されているように、Word は、”~$” プレフィックスで始まるファイル名を持つファイルの読み取りまたは書き込みを許可されています。このルールの理由は、Office が内部的に動作する方法に根ざしており、下位互換性のためにそのまま残されています。

macOS での Microsoft Word の読み取り/書き込みアプリ サンドボックス ルールを示すコマンド ライン インターフェースの部分的なスクリーンショット。
図 3. Microsoft Word のファイル読み取りおよび書き込みサンドボックス ルール

アプリ サンドボックスのルールによってアプリケーションに課せられるセキュリティ制限にもかかわらず、攻撃者が前述のルールをバイパスし、悪意のあるコードがサンドボックスを「エスケープ」して、影響を受けるデバイスで任意のコマンドを実行する可能性があります。これらのコードは、特別に細工された Word マクロに隠されている可能性があります。これは、前述のように、攻撃者が好むエントリ ポイントの 1 つです。

以前に報告された Office 固有のサンドボックス エスケープの脆弱性

たとえば、2018 年にMDSec は、攻撃者がアプリ サンドボックスをバイパスする可能性がある macOS 上の Microsoft Office の脆弱性を報告しました。 MDSec のブログ投稿で説明されているように、MDSec の概念実証 (POC) エクスプロイトは、Word が任意のコンテンツを含むファイルを (従来のアクセス許可チェックを通過した後でも) 任意のディレクトリにドロップできるという事実を利用しました。 「~$」プレフィックスを付けます。このバイパスは比較的単純で、特別に細工されたマクロを使用して、ユーザーのLaunchAgentsディレクトリに.plistファイルをドロップします。

LaunchAgentsディレクトリは、macOS のよく知られた永続化メカニズムです。特定の構造に準拠する PLIST ファイルは、ユーザーのサインイン時にlaunchdプロセスによって開始される macOS起動エージェントを記述します (つまり、メタデータを含みます)。これらの起動エージェントlaunchdの子になるため、サンドボックスを継承しません。ルールが Word に適用されるため、Office サンドボックスから除外されます。

上記の脆弱性が報告された直後に、Microsoft は、 LaunchAgentsディレクトリおよびその他のフォルダへのファイル書き込みを拒否する修正を展開しました。上記の開示により、Microsoft Word やその他のアプリケーションで考えられるさまざまなサンドボックス エスケープも調査するようになりました。

サンドボックスから逃れる手段として Launch Services を探る

2020 年、複数のブログ投稿で、macOS の/usr/bin/openユーティリティに一般的なサンドボックス エスケープの脆弱性が記載されました。このユーティリティは、ファイル、フォルダー、およびアプリケーションをユーザーがダブルクリックしたかのように起動するために一般的に使用されるコマンドです。 openは便利なコマンドですが、それ自体では子プロセスを作成しません。代わりに、 launchdプロセスのコンテキストでロジックが実装されている macOS Launch Services とのプロセス間通信 (IPC) を実行します。その後、Launch Services は、ハンドラーを解決して適切なアプリを起動することで、面倒な作業を実行します。 launchdがプロセスを作成するため、2018 年に MDSec の POC エクスプロイトがどのように機能したかと同様に、呼び出し元のサンドボックスによって制限されません。

ただし、サンドボックス エスケープの目的でopenを使用することは簡単ではありません。これは、宛先アプリを Launch Services 内に登録する必要があるためです。これは、たとえば、 openを使用してサンドボックスの外でosascriptのようなファイルを実行できないことを意味します。そのため、社内の攻撃的なセキュリティ チームは、オープンユーティリティをサンドボックス エスケープの目的で再評価し、より大規模なエンド ツー エンドの攻撃シミュレーションで使用することにしました。

POC エクスプロイトを作成する際の明らかに最初の試みは、ターミナル アプリでシェル スクリプトを起動するマクロを作成することでした。驚いたことに、サンドボックス化された Word アプリ内からドロップされたファイルには自動的に拡張属性com.apple.quarantineが与えられたため、POC は機能しませんでした (インターネットでダウンロードされたファイルを追跡するために Safari で使用されるものと同じものと同様に、ゲートキーパーが悪意のあるファイルの実行をブロックします)、ターミナルは単にその属性を持つファイルの実行を拒否しました。また、Python スクリプトを使用してみましたが、Python アプリでも、前述の属性を持つファイルを実行すると同様の問題が発生しました。

2 番目の試みは、アプリケーション拡張機能を使用することでした。たとえば、ターミナルはデフォルトの macOS シェル ( zsh ) を実行し、独自のコマンド ラインを実行する前に~/.zshenvなどのファイルから任意のコマンドを実行します。これは、ユーザーのホーム ディレクトリに.zshenvファイルをドロップしてターミナル アプリを起動すると、サンドボックス エスケープが発生することを意味していました。ただし、Word のサンドボックス ルールにより、 .zshenvファイルの削除は簡単ではありませんでした。ルールでは、アプリケーションは「~$」プレフィックスで始まるファイルにしか書き込みを許可されていませんでした。

ただし、そのようなファイルを間接的に書き込む興味深い方法があります。 macOS には、アーカイブ ファイル (ZIP ファイルなど) の抽出を担当するアーカイブ ユーティリティと呼ばれるアプリケーションが付属しています。このようなアーカイブはユーザーの操作なしで抽出され、アーカイブ内のファイルはアーカイブ自体と同じディレクトリに抽出されました。したがって、2 番目の POC は次のように機能しました。

  1. 任意のコマンドで.zshenvファイルを作成し、それを ZIP ファイルに配置して、ペイロードを準備します。 ZIPfile の内容を Word マクロでエンコードし、それらの内容をユーザーのホーム ディレクトリにあるファイル「~$exploit.zip」にドロップします。
  2. 「~$exploit.zip」ファイルに対してopenコマンドを使用して Archive Utility を起動します。 Archive Utility はサンドボックスの外で実行され ( /usr/bin/openの子プロセスであるため)、任意の名前でファイルを作成することが許可されていました。デフォルトでは、Archive Utility はアーカイブ自体 (この場合はユーザーのホーム ディレクトリ) の隣にあるファイルを抽出しました。したがって、この手順により、ユーザーのホーム ディレクトリに任意の内容の.zshenvファイルが正常に作成されました。
  3. openコマンドでターミナル アプリを起動します。ターミナルはzshをホストし、 zsh.zshenvファイルからコマンドを実行したため、このファイルは Word サンドボックスを正常にエスケープできました。
概念実証のエクスプロイト コードを示すコマンド ライン インターフェースのスクリーンショット。
図 4. レッド チームの内部操作用にサンドボックス エスケープを使用して Word マクロを準備する

Perception Point の CVE-2021-30864

2021 年 10 月、Perception Point は、同様の調査結果 (そして、私たちの意見ではより洗練されたもの) について議論するブログ投稿を公開しました。上記の投稿で、Perception Point はサンドボックス エスケープ (現在はCVE-2021-30864として特定されています) に関する詳細を公開しました。これには、次の事実が使用されています。

  1. サンドボックス化されたすべてのプロセスには、「スクラッチ スペース」として使用される独自のコンテナー ディレクトリがありました。サンドボックス化されたプロセスは、任意のファイル名を含む任意のファイルをそのディレクトリに無制限に書き込むことができました。
  2. openコマンドには、起動したアプリの任意の環境変数を設定または上書きできる興味深い–envオプションがありました。

したがって、Perception Point の POC エクスプロイトは巧妙に単純でした。

  1. コンテナー ディレクトリに.zshenvファイルをドロップします。これは、そのディレクトリにサンドボックス ルールが適用されていなかったため、許可されました。
  2. openコマンドでターミナルを起動しますが、 –envオプションを使用してHOME環境変数を上書きし、コンテナー ディレクトリを指すようにします。これにより、 zshはユーザーのホーム ディレクトリをコンテナー ディレクトリと見なし、植え付けられた.zshenvファイルからコマンドを実行しました。

Apple はその後、最新バージョンの macOS である Monterey で報告された Perception Point の脆弱性にパッチを適用しました。ユーザーのホーム ディレクトリに「~$exploit.zip」ファイルを作成することはできますが、 openを使用して ZIP ファイルのArchive Utilityを起動すると、ZIP ファイルが Downloads フォルダに抽出されます。これは興味深い動作ですが、サンドボックス エスケープの目的では使用できなくなりました。

最終的なエクスプロイトの試み: 「open」コマンドの再検討

Apple が .zshenv を悪用する両方の亜種を修正したことを発見した後、 openコマンドのすべてのコマンド ライン オプションを調べることにしました。その後すぐに、次のことがわかりました。

次のテキストを含むコマンド ライン インターフェイスのスクリーンショット: --stdin PATH stdin を PATH に接続してアプリケーションを起動します。
図 5. open ユーティリティの–stdinオプション (手動エントリで表示)

前述のように、Python は「 com.apple.quarantine 」拡張属性を持つファイルの実行を拒否するため、ドロップされた.pyファイルで Python を実行することはできませんでした。 PYTHONSTARTUP環境変数の悪用も検討しましたが、CVE-2021-30864 に対する Apple の修正により、そのオプションも妨げられたようです。ただし、 –stdinは「 com.apple.quarantine 」拡張属性の制限を回避しました。これは、標準入力の内容が隔離されたファイルからのものであることを Python が認識する方法がなかったためです。

したがって、私たちのPOCエクスプロイトは次のように単純になりました。

  1. 任意の Python コマンドを含む「~$exploit.py」ファイルをドロップします。
  2. open –stdin=’~$exploit.py’ -a Pythonを実行します。これにより、ドロップしたファイルが標準入力として機能する Python アプリが実行されます。 Python は問題なくコードを実行します。これはlaunchdの子プロセスであるため、Word のサンドボックス ルールに拘束されません。
概念実証のエクスプロイト コードのスクリーンショット。
図 6. 最小限の POC エクスプロイト コードのサンプル

また、Twitter に投稿できるほど短いバージョンも用意しました。

概念実証のエクスプロイト コードのスクリーンショット。
図 7.「Tweetable」POC エクスプロイト

Microsoft Defender for Endpoint を使用したアプリ サンドボックス エスケープの検出

一般的なサンドボックス エスケープに macOS で Launch Services を利用していることが最初に発見されて以来、 Microsoft Defender for Endpointに対するエンド ツー エンドの攻撃をエミュレートし、その機能を改善し、検出に挑戦するために、レッド チームの運用で POC エクスプロイトを使用してきました。レッド チームが最初の POC エクスプロイトを使用した直後に、ブルー チームのメンバーがそれを使用して人工知能 (AI) モデルをトレーニングし、Microsoft Office だけでなく、同様の Launch Services ベースのサンドボックス エスケープに使用されるアプリでもエクスプロイトを検出しました。

Perception Point の手法を知り、独自の新しいエクスプロイト手法 (Python POC) を作成した後、レッド チームは、独自の検出耐久性を完全にテストする別の機会を見つけました。実際、最初のサンドボックス エスケープの脆弱性を処理したのと同じ一連の検出ルールは、2 回目の POC エクスプロイトに関連する脆弱性にパッチが適用される前であっても、依然として有効であることが判明しました。

Office サンドボックス エスケープの脆弱性を検出する Microsoft Defender for Endpoint の部分的なスクリーンショット。左側のパネルには、タイムスタンプ付きのアラート ストーリーが表示されます。右側のパネルには、カテゴリ、MITRE ATT&CK 手法、検出ソース、サービス ソース、検出ステータス、およびその他の情報を含むアラートの詳細が表示されます。
図 8. Office サンドボックス エスケープを検出する Microsoft Defender for Endpoint

Defender for Endpoint のお客様は、このような検出の耐久性を製品の脅威と脆弱性の管理機能に取り入れ、統合されたセキュリティ コンソールを介して、Windows 以外のデバイスに影響を与えるものを含め、構成の誤りや脆弱性を迅速に検出、優先順位付け、修正することができます。

Microsoft Defender for Endpoint が、すべてのプラットフォームにわたって完全なエンドポイント セキュリティ ソリューションを提供する方法について説明します。

ジョナサン・バー・オア
Microsoft 365 Defender 研究チーム

参考: https ://www.microsoft.com/en-us/security/blog/2022/07/13/uncovering-a-macos-app-sandbox-escape-vulnerability-a-deep-dive-into-cve- 2022-26706/

Comments

Copied title and URL