Trellix、macOSおよびiOSにおける新たな特権エスカレーションバグクラスを発見


はじめに

初代iPhoneに搭載されたiOSの最初のバージョン以来、Appleはモバイルデバイス上で実行可能なソフトウェアに慎重な制限を課してきました。Appleが信頼する開発者証明書によって暗号署名されたアプリケーションのみが実行可能で、AppleScriptのようなスクリプト言語はiOSには存在しませんでした。動的にコードを実行する機能はほぼ完全に削除され、悪意のあるプログラムを実行するためにこれらの緩和策を回避する方法を見つける必要があるエクスプロイトにとって、強力な障壁を作り出しました。macOSはiOSの機能を継続的に採用し、コード署名をより厳格に実施するようになりました。Trellix Advanced Research Centerの脆弱性チームは、コード署名をバイパスして、複数のプラットフォームアプリケーションのコンテキスト内で任意のコードを実行し、macOSとiOSの両方で特権の昇格とサンドボックスエスケープを引き起こす、大規模な新しいクラスのバグを発見しました。これらの脆弱性は、CVSSスコアが5.1~7.1であり、深刻度は中程度から高程度です。これらの問題は、悪意のあるアプリケーションやエクスプロイトによって、ユーザーのメッセージ、位置情報、通話履歴、写真などの機密情報へアクセスされる可能性があります。


新しいバグクラスの発見

2021年9月、Citizen Labは、サウジアラビアの活動家を標的として、彼らのiPhoneをPegasus Malwareに感染させるために0クリックでiOSリモートコード実行するエクスプロイト「FORCEDENTRY」について公開しました。さらに、Google Project Zeroと協力してエクスプロイトを解析し、攻撃に使用された手法の詳細を示す2つの投稿を行いました。パート1では、PDF解析コードの最初の悪用について、パート2では、Sandbox Escapeについて説明しました。最初の悪用が注目された一方で、私たちは2番目の悪用に大きな関心を寄せていました。これには、開発者が任意のオブジェクトのリストをフィルタリングできるようにする無害に見えるクラスである NSPredicate が含まれていました。 実際には、NSPredicate の構文は完全なスクリプト言語です。iOS上でコードを動的に生成して実行する機能は、これまでずっと公式の機能として存在していました。しかし、これは始まりに過ぎず、この機能によって、macOSとiOSのプロセス間セキュリティを完全に破る、全く新しいバグクラスが明らかになったのです。

FORCEDENTRY サンドボックスエスケープは、この動作の最初の探求ではありませんでした。iOSユーザースペースのセキュリティ研究者であるCodeColoristは、NSPredicateの仕組みを悪用することを含むReal World CTF 2019の課題を設計しました。その後、彼は講演を行い、2021年1月にブログ記事「See No Eval」を公開し、それらを使って任意のコードを実行する方法を詳しく説明しました。この研究の要点は、NSPredicateの構成要素であるNSExpressionオブジェクトを使えば、任意のクラスやオブジェクトの任意のメソッドを呼び出せるというものでした。Appleのプライベートフレームワークの既存のクラスを使用することで、ポインタ認証(PAC)やその他のあらゆる緩和をバイパスして、任意の関数を呼び出すことが可能だったのです。しかし、この投稿では、Appleがこれらのオブジェクトの危険性を緩和した方法、すなわちNSPredicateVisitorと呼ばれるプロトコルを使った方法も紹介されています。このプロトコルを実装するクラスを使用して、すべての式をチェックして、安全に評価できることを確認できます。CodeColorist は投稿の最後で、「適切な検証がなければ、TCC をバイパスするプロセス間の攻撃面になる可能性がある」と述べています。

See No Evalの投稿は、FORCEDENTRYで使用されたサンドボックスエスケープの主なアイデアであったようです。それ以来、Appleはこの悪用とCodeColoristのブログ投稿で使用された機能を削除し、NSPredicateで実行できることを制限しようとする新しい緩和策を追加しています。これらの緩和策は、明らかにセキュリティを危険にさらす可能性のある特定のクラスやメソッドの使用を防ぐために、大規模なdenylistを使用しています。しかし、私たちは、これらの新しい緩和策をバイパスできることを発見しました。制限されていないメソッドを使用することで、これらのリストを空にすることができ、以前と同じメソッドを使用できるようになりました。このバイパスは、AppleによってCVE-2023-23530が割り当てられました。さらに重要なことは、NSPredicateVisitorのほぼすべての実装がバイパス可能であることを発見したことです。XPC Services(macOSおよびiOSにおける高レベルのプロセス間通信の主要な方法)では、NSPredicate引数を受け入れ、提供された式が安全に評価されることを確認するためにNSPredicateVisitorを使用するプロセスが多くあります。ほぼすべてのプロセスが独自のバージョンを持っているため、単一の実装はありませんが、ほとんどは “expressionType” プロパティを使用して関数式をフィルタリングしています。問題は、このプロパティが送信側プロセスで設定可能であり、受信側では正確であると信頼されているため、チェックが役に立たないという事実です。このバイパスはCVE-2023-23531に割り当てられています。この2つの技術により、潜在的な脆弱性の範囲が大きく広がり、現在も調査が続けられています。


脆弱性

この新しいクラスのバグの中で最初に見つかった脆弱性は、デバイス上の動作に関するデータを収集するプロセスであるcoreduetdです。メッセージやSafariなど、適切な権限を持つプロセスでコードを実行した攻撃者は、悪意のあるNSPredicateを送信し、このプロセスの権限でコードを実行することができます。このプロセスは、macOS上でrootとして実行され、攻撃者は、ユーザーのカレンダー、アドレス帳、および写真にアクセスできるようになります。同じ影響を与える非常に類似した問題は、CoreDuetに関連するプロセスであるcontextstoredにも影響します。この結果は、FORCEDENTRYと同様で、攻撃者は、脆弱なXPCサービスを使用して、デバイスへのアクセス権がより高いプロセスからコードを実行することができます。

appstored (macOS では appstoreagent) デーモンにも、脆弱な XPC サービスが存在します。これらのデーモンと通信可能なプロセスを制御する攻撃者は、これらの脆弱性を悪用して、任意のアプリケーション(システムアプリを含む可能性もあり)をインストールすることが可能となります。

また、このクラスの脆弱性は、資格を必要としない、任意のアプリでアクセスできるサービスにも存在していました。これらのうち、私たちが最初に見つけたのはOSLogServiceで、これはXPCサービスであり、syslogから潜在的に重要な情報を読み取るために利用される可能性があります。さらに重要なことに、攻撃者はiPadのUIKitCoreのNSPredicateの脆弱性を悪用することができます。悪意のあるシーンアクティベーションルールを設定することで、位置情報、カメラやマイク、通話履歴、写真などの機密データにアクセスできる高権限のアプリ「SpringBoard」内部でのコード実行や、端末のワイプを実現することが可能です。

 Significant breach of the security model of macOS and iOS


まとめ

上述の脆弱性は、個々のアプリケーションが必要なリソースのサブセットにきめ細かくアクセスし、それ以外はより高い特権を持つサービスに問い合わせることに依存しているmacOSとiOSのセキュリティモデルに対する重大な侵害を表しています。NSPredicateの引数を受け取り、それを不十分なNSPredicateVisitorsでチェックするサービスは、悪意のあるアプリケーションとエクスプロイトコードがプロセスの分離を破って、許可されるべきよりもはるかに多くのリソースに直接アクセスすることを可能にします。なおこれらの問題は、macOS 13.2 および iOS 16.3で対処されています。これらの問題を解決するために、弊社に迅速に協力してくださったApple社に感謝します。

※本ページの内容は2023年2月21日(US時間)更新の以下のTrellix Storiesの内容です。
原文:Trellix Advanced Research Center Discovers a New Privilege Escalation Bug Class on macOS and iOS
著者:Austin Emmitt