- Cisco Talos は、macOS 向けの Microsoft アプリケーションに 8 件の脆弱性を発見しました。
- 攻撃者が悪意のあるライブラリを Microsoft アプリケーションに挿入してこれらの脆弱性をエクスプロイトし、アプリケーションのエンタイトルメント(権限)とユーザーが付与したアクセス許可を取得する可能性があります。
- アクセス許可は、マイク、カメラ、フォルダ、画面録画、ユーザー入力などのリソースにアプリケーションがアクセスできるかどうかを制御しています。攻撃者がこれらのリソースへのアクセスを取得した場合、機密情報の漏洩や、最悪の場合、権限の昇格につながる可能性があります。
- このブログ記事では、macOS のセキュリティモデルの概要と、攻撃者がアプリケーションの権限を奪取するために macOS アプリケーションの脆弱性をどのような方法でエクスプロイトする可能性があるかについても説明します。
Cisco Talos は最近、macOS のアプリケーションと、同プラットフォームのアクセス許可ベースのセキュリティモデルの悪用可能性について分析を行いました。macOS のセキュリティモデルは TCC(Transparency, Consent, and Control)フレームワークを中心としています。
Talos は macOS 向けの複数の Microsoft アプリケーションに 8 件の脆弱性を発見しました。これらの脆弱性により、攻撃者がオペレーティングシステムのアクセス許可モデルをバイパスする可能性があります。アプリケーションの既存のアクセス許可を使用するので、ユーザーに追加の確認を求めるプロンプトは表示されません。成功すれば、攻撃者は侵害された Microsoft アプリケーションにすでに付与されている権限を取得できます。たとえばユーザーに気付かれずにユーザーアカウントからメールを送信したり、ユーザーの操作なしで音声クリップの録音、写真撮影、動画の録画をしたりすることも可能です。Microsoft 社は、これらの脆弱性のリスクは低いとみなしています。また、一部のアプリケーションではプラグインをサポートするために署名されていないライブラリの読み込みを許可する必要があるとして、問題の修正を拒否しています。以下は、Talos が発見した脆弱性の Talos ID と対応する CVE の一覧です。
Talos ID | CVE | アプリケーション名 |
TALOS-2024-1972 | CVE-2024-42220 | Microsoft Outlook |
TALOS-2024-1973 | CVE-2024-42004 | Microsoft Teams(職場または学校) |
TALOS-2024-1974 | CVE-2024-39804 | Microsoft PowerPoint |
TALOS-2024-1975 | CVE-2024-41159 | Microsoft OneNote |
TALOS-2024-1976 | CVE-2024-43106 | Microsoft Excel |
TALOS-2024-1977 | CVE-2024-41165 | Microsoft Word |
TALOS-2024-1990 | CVE-2024-41145 | Microsoft Teams(職場または学校)WebView.app ヘルパーアプリケーション |
TALOS-2024-1991 | CVE-2024-41138 | Microsoft Teams(職場または学校)com.microsoft.teams2.modulehost.app |
調査結果の詳細に入っていく前に、Apple 社の macOS アクセス許可セキュリティモデルを理解しておくことが非常に重要です。Talos が実施した一連の調査に関連するさまざまな要素に焦点を当て、Microsoft の脆弱性をケーススタディとして使用します。
Apple 社の macOS アクセス許可セキュリティモデルとは
ほとんどのオペレーティングシステムのセキュリティポリシーは、デフォルトでは、任意アクセス制御(DAC)に基づいています。これは、ユーザー権限またはルート権限で実行される侵害されたソフトウェアやマルウェアに対して、最低限の保護しか提供しません。
Apple 社の macOS は、悪意のあるソフトウェアとプライバシーの侵害からユーザーを保護するように設計されています。標準的な DAC ポリシーに加え、特定のリソースへのアクセスを TCC でさらに保護することにより、アプリケーションがユーザーの機密データとシステムリソースにアクセスする方法を管理しています。
以下、すべてではありませんが、macOS で使用されている同意ベースのアクセス許可モデルの機能について説明します。
TCC とデータ保護
TCC では、アプリケーションが連絡先、カレンダー、写真、位置情報などの保護されたリソースにアクセスする前に、ユーザーの明示的な同意の取得を要求するポリシーを適用することによって、ユーザーが自分の個人情報と、アプリケーションがデータにアクセスできるかどうかを直接管理できるようにしています。
TCC はエンタイトルメントと連携して機能します。エンタイトルメントとは、アプリケーションの機能に必要な一連の権限を付与するものです。デベロッパーは、Apple 社が提供する選択肢からエンタイトルメントを選択します。すべてのエンタイトルメントのうち、一般に使用できるものは一部にすぎず、最も強力なエンタイトルメントは、Apple 社独自のアプリケーションとシステムバイナリ専用に確保されています。
特定のエンタイトルメントが設定されているアプリケーションが最初に特定の機能の使用を要求する際には、アクセス許可のポップアップが表示されます。
上の図はアクセス許可のプロンプトの例で、「Malevolent App」がカメラへのアクセスを要求しています。ユーザーはカメラへのアクセスを許可するか拒否するかを決定する必要があります。この決定は、TCC データベースに記録されます。
ユーザーが選択すると、その後「Malevolent App」からカメラに関連する要求があった場合、データベースに記録された決定に従って管理されます。このシステムにより、ユーザーはアプリケーションが実行しようとするプライバシーに関わるアクションを効果的に制御して通知を受けられます。ユーザーの操作を必要とすることによって、動画の録画や写真撮影といったプライバシーに関わるアクションを悪意のあるアプリケーションが実行するのを回避できます。
ユーザーは、macOS の「システム設定」の「プライバシーとセキュリティ」セクションで、後からこのアクセス許可を確認できます。ここには、カメラ、マイク、位置情報サービスなどのアクセス許可の一覧が表示されます。
たとえば「プライバシーとセキュリティ」設定の「カメラ」のアクセス許可カテゴリには、カメラへのアクセスを要求したアプリケーションが表示されます。「Malevolent App」は、前述のポップアップに関するユーザーの決定に従って、アクセスが許可されたアプリケーションとして表示されています。ここで、アクセス許可を有効または無効に変更することもできます。
コードインジェクション
Apple 社の macOS には、マルウェアがよく用いるコードインジェクションという手口から保護するためのセキュリティ対策が施されています。コードインジェクションとは、攻撃者が悪意のあるコードを正当なプロセスに挿入して保護されたリソースにアクセスしようとするものです。
このリスクを回避するため、Mac App Store で配布されるアプリケーションにはサンドボックス化が義務付けられています。サンドボックス化は、リソースとデータへのアクセスを制限するように設計されています。サンドボックス化されたアプリケーションは、エンタイトルメントで明示的に要求されたリソースにしかアクセスできません。また一部のリソースへのアクセスは、前述したのと同様にユーザーの同意を求めるポップアップによってさらに保護されます。
たとえばサンドボックス化されたアプリケーションでは、com.apple.security.device.camera エンタイトルメントが true に設定されている場合のみ、ユーザーにカメラへのアクセスを促します。このエンタイトルメントがない場合、アプリケーションはカメラにアクセスできないので、アクセス許可を求めるポップアップも表示されません。
詳しく見る – エンタイトルメントの確認
アプリケーションまたはバイナリのエンタイトルメントに関する一般的な情報を取得するには、次のコマンドを実行します。
$ codesign -dv –entitlements – “/Applications/Microsoft Teams (work or school).app”
Executable=/Applications/Microsoft Teams (work or school).app/Contents/MacOS/MSTeams
Identifier=com.microsoft.teams2
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=164256 flags=0x10000(runtime) hashes=5122+7 location=embedded
Signature size=9012
Timestamp=20 Mar 2024 at 22:54:32
Info.plist entries=32
TeamIdentifier=UBF8T346G9
Runtime Version=14.2.0
Sealed Resources version=2 rules=13 files=143
Internal requirements count=1 size=180
[Dict]
[Key] com.apple.application-identifier
[Value]
[String] UBF8T346G9.com.microsoft.teams2
[Key] com.apple.developer.team-identifier
[Value]
[String] UBF8T346G9
[Key] com.apple.security.app-sandbox
[Value]
[Bool] true
[…]
[Key] com.apple.security.device.camera
[Value]
[Bool] true
[Key] com.apple.security.device.microphone
[Value]
[Bool] true
[…]
[Key] com.apple.security.network.client
[Value]
[Bool] true
[…]
Microsoft Teams は Apple App Store に公開されているので、com.apple.security.app-sandbox エンタイトルメントが設定されています。アプリケーションはサンドボックス化されており、アクセスを希望するリソースとデータを明示的に宣言しています。上記の例を見ると com.apple.security.device.microphone と com.apple.security.device.camera が存在するので、アプリケーションはマイクとカメラの使用許可を要求できます。また、com.apple.security.network.client エンタイトルメントも存在するので、アプリケーションは外部へのネットワーク接続を開始できます。
公証済みのアプリケーション(App Store で配布されていなくても、Apple 社の自動サービスによって悪意のあるコンポーネントがないか確認済みのアプリケーション)については、強化されたランタイムを有効にする必要があります。
サンドボックスは、リソースとデータの観点から潜在的な影響を制限するよう設計されています。一方、強化されたランタイムは、アプリケーションがエクスプロイトされにくくすることに焦点を当てて設計されています。たとえばさまざまな種類の攻撃、特にコードインジェクションに関連した攻撃を回避するため、一連の保護がデフォルトで含まれています。強化されたランタイムが有効な場合、ジャストインタイム(JIT)のコンパイルや信頼できないライブラリの読み込みなどリスクの高いアクションを実行するアプリケーションは、エンタイトルメントによってこれらの機能を明示的に宣言する必要があります。
実際、強化されたランタイムによって、デフォルトでライブラリの検証が可能となり、アプリケーションのデベロッパーまたは Apple 社によって署名されたアプリケーションだけにライブラリの読み込みを制限できます。アプリケーションでこの検証動作を無効にする必要がある場合(通常はプラグインをインポートするために)、デベロッパーは明示的に com.apple.security.cs.disable-library-validation エンタイトルメントを true に設定する必要があります。
サンドボックス機能と強化されたランタイムの機能を連携させて、保護を強化することができます。この方法は、場合によってはエンタイトルメントが重複しているように見えるかもしれません。たとえばサンドボックス化されたアプリケーションで強化されたランタイムを有効にし、マイクへのアクセスを必要としている場合を考えてみてください。この場合、マイクには 2 つの異なるエンタイトルメントがあります。1 つはサンドボックスのエンタイトルメント、もう 1 つは強化されたランタイムのエンタイトルメントです。
com.apple.security.device.audio-input com.apple.security.device.microphone
詳しく見る – 強化されたランタイムとライブラリ検証の無効化
アプリケーションまたはバイナリのエンタイトルメントに関する一般的な情報を取得するには、次のコマンドを実行します。
$ codesign -dv –entitlements – “/Applications/Microsoft Teams (work or school).app”
Executable=/Applications/Microsoft Teams (work or school).app/Contents/MacOS/MSTeams
Identifier=com.microsoft.teams2
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=164256 flags=0x10000(runtime) hashes=5122+7 location=embedded
Signature size=9012
Timestamp=20 Mar 2024 at 22:54:32
Info.plist entries=32
TeamIdentifier=UBF8T346G9
Runtime Version=14.2.0
Sealed Resources version=2 rules=13 files=143
Internal requirements count=1 size=180
[Dict]
[Key] com.apple.application-identifier
[Value]
[String] UBF8T346G9.com.microsoft.teams2
[Key] com.apple.developer.team-identifier
[Value]
[String] UBF8T346G9
[Key] com.apple.security.app-sandbox
[Value]
[Bool] true
[…]
[Key] com.apple.security.cs.disable-library-validation
[Value]
[Bool] true
[…]
上記の出力は、Talos が報告した時点での Microsoft Teams アプリケーションの codesign 出力です。このアプリケーションは、com.apple.security.app-sandbox エンタイトルメントで示すようにサンドボックス化されています。また「CodeDirectory」で始まる行の flags=0x10000(runtime) を見れば明らかなように、強化されたランタイムも有効になっています。
サンドボックス化されていて、強化されたランタイムが有効であるにもかかわらず、com.apple.security.cs.disable-library-validation エンタイトルメントが存在することから、このアプリケーションは署名の検証を実行せずにサードパーティのライブラリを読み込むことが許可されていることが分かります。
ライブラリインジェクション
実施した一連の調査では、ライブラリを挿入して他のアプリケーションのアクセス許可やエンタイトルメントを悪用する機能に主眼を置いています。macOS におけるライブラリインジェクションは Dylib ハイジャックとも呼ばれ、アプリケーションの実行プロセスにコードを挿入するという手口です。macOS では、強化されたランタイムなどの機能でこの脅威を防ぎ、他のアプリケーションのプロセスを通じて攻撃者が任意のコードを実行する可能性を軽減しています。しかし、攻撃者が実行中のアプリケーションのプロセス空間へのライブラリインジェクションに成功した場合は、そのライブラリはすでにプロセスに付与されているすべてのアクセス許可を使用することができ、実質的にそのアプリケーションの代わりに動作することになります。
上の図は、これまでの説明を図解したものです。基本的に攻撃者は、独自に一連の機能を取得しています。攻撃者は、より権限の高いアプリケーションを開いて悪意のあるライブラリを挿入することによって、エクスプロイト対象のアプリケーションの機能を取得します。その後、攻撃者は侵害されたアプリケーションを通じて、新たに取得した機能にアクセスします。
最小権限の原則
サンドボックス化されたアプリケーションや、強化されたランタイムを有効にしたアプリケーションでは、「権限が必要な」リソース(カメラ、マイク、位置情報など)の 1 つにアクセスする許可を要求するだけでも、そのアプリケーションが特定のエンタイトルメントを持っている必要があります。多くのエンタイトルメントはリソースと関連づけられており、アプリケーションが特定のリソースを使用する目的を示しています。
以下のスニペットは、「Microsoft Teams」アプリケーションのエンタイトルメントの例です。
次の 3 つのエンタイトルメントは、アプリケーションにカメラとマイクの使用許可を要求する権限を与えています。
[Key] com.apple.security.device.audio-input [Value] [Bool] true [Key] com.apple.security.device.camera [Value] [Bool] true [Key] com.apple.security.device.microphone [Value] [Bool] true
エンタイトルメントにより、最小権限の原則の実装も容易になります。アプリケーションが適切に機能するために必要なリソースへのアクセスのみが許可されるため、侵害されたアプリケーションの潜在的な影響が軽減されます。この手法によって攻撃対象領域が狭まり、攻撃者がアプリケーションをエクスプロイトした場合に達成できることが限られます。さらに、一部のエンタイトルメントではデフォルトでさまざまなセキュリティ機能が有効になります。強化されたランタイムと com.apple.security.cs.disable-library-validation エンタイトルメントについての説明で触れたとおり、必要があれば、デベロッパーは特定のエンタイトルメントを追加し、これらの機能を意図的に無効にする必要があります。
Apple 社のアクセス許可モデルが持つ意味
Apple 社の macOS は、ユーザーのプライバシー保護とシステムセキュリティの維持を目的にした TCC とエンタイトルメントを含む階層型のセキュリティモデルを特徴としています。TCC は、個人データとシステム権限へのアプリケーションのアクセスを管理し、アクセスを許可する前にユーザーの明示的な承認を必要とします。
macOS のセキュリティモデルには強みがありますが、絶対に安全というわけではありません。アプリケーションに付与されている昇格されたアクセス許可がハイジャックされると、これらのアプリケーションを通じて機密リソースに不正アクセスされてしまう危険性があります。
TCC の有効性は、受け取ったアクセス許可をアプリケーションが責任を持って扱えるかにかかっています。信頼されているアプリケーションが侵害された場合、そのアクセス許可を悪用するように操作される可能性があり、攻撃者がユーザーに気づかれずにアクションを実行できるようになります。たとえばカメラとマイクにアクセスできるビデオチャット アプリケーションが侵害された場合、ユーザーへの警告なしで強制的に録画されるおそれがあります。
この状況は、ある重要な側面を表しています。つまり macOS では、アプリケーションを信頼し、アクセス許可をアプリケーションが自己管理することが前提になっているということです。この責任が果たせなければ、アクセス許可モデル全体の侵害につながります。アプリケーションが意図せずに不正なアクションを実行するためのプロキシとして動作し、TCC を回避してシステムのセキュリティモデルを脅かすことになるのです。このことは、アプリケーションがエクスプロイトの手段とならないように、堅牢なセキュリティ対策を実装することの重要性を浮き彫りにしています。
ケーススタディ:macOS 向け Microsoft アプリケーション
調査中に、macOS 向け Microsoft アプリケーションの多くで、セキュリティを高める機能である強化されたランタイムが使用されていることが分かりました。ただし、これらのアプリケーションでは com.apple.security.cs.disable-library-validation エンタイトルメントも有効になっており、潜在的にリスクがあります。
強化されたランタイムがライブラリインジェクション攻撃を防ぎ、サンドボックスによってユーザーデータとシステムリソースを保護したとしても、マルウェアは特定の条件下で特定のアプリケーションをエクスプロイトする方法を見つける可能性があります。エクスプロイトに成功すれば、攻撃者はアプリケーションのエンタイトルメントとアクセス許可を引き継げるでしょう。重要なのは、サンドボックス化されたアプリケーションすべてが同じように脆弱性の影響を受けやすいわけではないということです。通常、アプリケーションが有効な攻撃手段となるには、特定のエンタイトルメントや脆弱性の組み合わせが必要です。
ここで取り上げている脆弱性は、攻撃者が操作し得る場所からアプリケーションがライブラリを読み込む際に問題になるものです。アプリケーションに com.apple.security.cs.disable-library-validation エンタイトルメントがある場合、攻撃者はライブラリを挿入し、侵害されたアプリケーション内で任意のコードを実行できます。その結果、アプリケーションのすべてのアクセス許可とエンタイトルメントが攻撃者に悪用されかねません。
上記のフローチャートは、すべて網羅したものではありませんが、アプリケーションがライブラリインジェクションに対して潜在的に脆弱かどうかを確認するための簡単なスキーマです。このフローチャートに当てはまらないケースも多くあります。
ここからは、アプリケーションの 2 つのグループを検証していきます。1 つは脆弱性という点で共通点が多いグループです。もう 1 つのグループは独自の特徴を持っています。独自である理由の 1 つは、いろいろな特徴がある中でも、アプリケーションのうち 2 つがヘルパーアプリケーションである点です。
第 1 のグループは、次の「Microsoft Office アプリケーション」です。
第 2 のグループは、次の「Microsoft Teams アプリケーション」です。
- Microsoft Teams(職場または学校)のメインアプリケーション
- Microsoft Teams(職場または学校)WebView.app
- Microsoft Teams(職場または学校)com.microsoft.teams2.modulehost.app
各グループについて、アプリケーションに脆弱性がある理由とその影響を説明します。
Microsoft Office アプリケーション
Office アプリケーションはそれぞれ異なりますが、アプリケーションはすべて強化されたランタイムアプリケーションであり、以下のエンタイトルメントが含まれているという共通の特徴があります。
[Key] com.apple.security.cs.disable-library-validation [Value] [Bool] true
これは事実上、強化されたランタイム(ダイナミック リンク ライブラリのハイジャックを防ぐための機能)によるセキュリティ保護が無効になっていることを意味します。結果的に、すべての Office アプリケーションでは、署名のないダイナミックライブラリの読み込みが許可されます。これがセキュリティ上の懸案事項になるのは、適切な承認なしで、マルウェアにアプリケーションのアクセス許可を悪用される可能性があるからです。
たとえば Microsoft Outlook の脆弱性について Talos が報告した時点でのエンタイトルメントを考えてみてください。
$ codesign -dv –entitlements – “/Applications/Microsoft Outlook.app”
Executable=/Applications/Microsoft Outlook.app/Contents/MacOS/Microsoft Outlook
Identifier=com.microsoft.Outlook
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=311585 flags=0x10000(runtime) hashes=9726+7 location=embedded
Signature size=9012
Timestamp=30 Mar 2024 at 18:46:20
Info.plist entries=56
TeamIdentifier=UBF8T346G9
Runtime Version=14.2.0
Sealed Resources version=2 rules=13 files=9705
Internal requirements count=1 size=184
[Dict]
[Key] com.apple.application-identifier
[Value]
[String] UBF8T346G9.com.microsoft.Outlook
[Key] com.apple.developer.team-identifier
[Value]
[String] UBF8T346G9
[Key] com.apple.developer.ubiquity-kvstore-identifier
[Value]
[String] UBF8T346G9.com.microsoft.Outlook
[Key] com.apple.developer.usernotifications.communication
[Value]
[Bool] true
[Key] com.apple.developer.usernotifications.time-sensitive
[Value]
[Bool] true
[Key] com.apple.security.app-sandbox
[Value]
[Bool] true
[Key] com.apple.security.application-groups
[Value]
[Array]
[String] UBF8T346G9.Office
[String] UBF8T346G9.ms
[String] UBF8T346G9.com.microsoft.oneauth
[String] UBF8T346G9.OfficeOsfWebHost
[Key] com.apple.security.assets.movies.read-only
[Value]
[Bool] true
[Key] com.apple.security.assets.music.read-only
[Value]
[Bool] true
[Key] com.apple.security.assets.pictures.read-only
[Value]
[Bool] true
[Key] com.apple.security.automation.apple-events
[Value]
[Bool] true
[Key] com.apple.security.cs.disable-library-validation
[Value]
[Bool] true
[Key] com.apple.security.device.audio-input
[Value]
[Bool] true
[Key] com.apple.security.device.camera
[Value]
[Bool] true
[Key] com.apple.security.files.user-selected.read-write
[Value]
[Bool] true
[Key] com.apple.security.network.client
[Value]
[Bool] true
[Key] com.apple.security.personal-information.addressbook
[Value]
[Bool] true
[Key] com.apple.security.personal-information.location
[Value]
[Bool] true
[Key] com.apple.security.print
[Value]
[Bool] true
[Key] com.apple.security.smartcard
[Value]
[Bool] true
[Key] com.apple.security.temporary-exception.apple-events
[Value]
[Array]
[String] com.microsoft.lync
[String] com.microsoft.skypeforbusiness
[String] com.cisco.jabber
[String] cisco-systems.spark
[String] microsoft/com.microsoft.alertsdaemon
[String] com.microsoft.autoupdate2
[String] com.microsoft.entourage.databasedaemon
[String] com.microsoft.outlook.database_daemon
[String] com.microsoft.entourage.databaseutility
[String] com.microsoft.outlook.databasedaemon
[String] com.microsoft.outlook.databaseutility
[String] com.microsoft.entourage
[String] com.microsoft.outlook
[String] com.microsoft.errorreporting
[String] com.microsoft.excel
[String] com.microsoft.communicator
[String] microsoft/com.microsoft.messengerdaemon
[String] microsoft/com.microsoft.messenger
[String] com.microsoft.messenger
[String] com.microsoft.entourage.officereminders
[String] com.microsoft.outlook.officereminders
[String] com.microsoft.setupassistant
[String] com.microsoft.powerpoint
[String] com.microsoft.entourage.syncservices12
[String] com.microsoft.syncservicesagent
[String] com.microsoft.word
[String] com.microsoft.myday
[Key] com.apple.security.temporary-exception.files.absolute-path.read-only
[Value]
[Array]
[String] /Library/Preferences/com.microsoft.office.licensingV2.plist
[String] /Library/Logs/Microsoft/
[String] /Library/Application Support/Microsoft/
[Key] com.apple.security.temporary-exception.files.home-relative-path.read-only
[Value]
[Array]
[String] /Library/Application Support/Microsoft/
[String] /Library/Caches/TemporaryItems/msoclip/
[String] /Documents/Microsoft User Data/
[String] /Documents/Microsoft-Benutzerdaten/
[String] /Documents/Datos de usuario de Microsoft/
[String] /Documents/Données utilisateurs Microsoft/
[String] /Documents/Microsoft användardata/
[String] /Documents/Microsoft ユーザー データ/
[String] /Documents/Dati utente Microsoft/
[String] /Documents/Dane użytkownika produktów firmy Microsoft/
[String] /Documents/Данные пользователя Майкрософт/
[String] /Documents/Microsoft 用户数据/
[String] /Documents/Microsoft 使用者資料/
[Key] com.apple.security.temporary-exception.mach-lookup.global-name
[Value]
[Array]
[String] com.microsoft.office.licensingV2.helper.port
[String] com.apple.GSSCred
[Key] com.apple.security.temporary-exception.sbpl
[Value]
[Array]
[String]
(allow authorization-right-obtain (right-name “com.apple.KerberosAgent”))
[Key] com.apple.security.temporary-exception.shared-preference.read-only
[Value]
[Array]
[String] com.apple.ncprefs
[String] com.apple.notificationcenterui
[Key] com.apple.security.temporary-exception.shared-preference.read-write
[Value]
[Array]
[String] com.microsoft.autoupdate2
[String] com.microsoft.office
[String] com.microsoft.shared
[String] com.cisco.WebEx Productivity Tools
[String] com.cisco.Cisco Webex Meetings
[Key] keychain-access-groups
[Value]
[Array]
[String] UBF8T346G9.com.microsoft.identity.universalstorage
Office アプリケーションはそれぞれ他とは異なりますが、すべてに共通しているのは、強化されたランタイム機能があり、com.apple.security.cs.disable-library-validation エンタイトルメントが true に設定されているということです。
攻撃者が悪意のあるライブラリを挿入できた場合、アプリケーションのすべてのエンタイトルメントとアクセス許可が利用される可能性があります。
通常、置き換えることのできるライブラリは相対パスでインポートされるものだけです。以下は、Microsoft Outlook アプリケーションのインポートの一部です。
$ otool -L "/Applications/Microsoft Outlook.app/Contents/MacOS/Microsoft Outlook"
/Applications/Microsoft Outlook.app/Contents/MacOS/Microsoft Outlook:
@rpath/OPF.framework/Resources/OPF_Common.dylib (compatibility version 1.0.0, current version 1.0.0)
@rpath/ADAL4.framework/Versions/A/ADAL4 (compatibility version 0.0.0, current version 0.0.0)
@rpath/CocoaUI.framework/Versions/A/CocoaUI (compatibility version 0.0.0, current version 0.0.0)
@rpath/COMBase.framework/Versions/A/COMBase (compatibility version 0.0.0, current version 0.0.0)
[…]
@rpath/EditorKit.framework/Versions/A/EditorKit (compatibility version 1.0.0, current version 1.0.0)
@rpath/EmailRendererKit.framework/Versions/A/EmailRendererKit (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/swift/libswiftAppKit.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/swift/libswiftFoundation.dylib (compatibility version 1.0.0, current version 1.0.0)
@rpath エントリは、バイナリの読み込みコマンドで LC_RPATH として定義されているすべてのパスを使用しようとします。
$ otool -l "/Applications/Microsoft Outlook.app/Contents/MacOS/Microsoft Outlook" | grep LC_RPATH -A2 cmd LC_RPATH cmdsize 40 path @loader_path/../Frameworks (offset 12)
たとえば Microsoft Outlook の場合、LC_RPATH は 1 つだけで、@loader_path/../Frameworks を使用します。LC_RPATH はダイナミックライブラリの検索パスを指定するものであり、以下の可能性があります。
- @executable_path:実行ファイルを含むパスを指します。
- @loader_path:バイナリで使用する場合は @executable_path と同じ動作になりますが、ダイナミックライブラリ(dylib)で使用する場合は、そのライブラリがあるディレクトリを指します。
そのため、この場合、実行ファイルへのパスは、実行ファイル自体に対する相対パスになります。他の Office アプリケーションにも、同様の相対インポートがあります。
すでに一度実行され、/Applications にあるアプリケーションを変更するには、特定のエンタイトルメントが必要です。ただし、/tmp のような別フォルダにアプリケーションをコピーして変更することで、この要件を回避できます。
相対インポートがいくつかあり、ライブラリ検証を無効にするエンタイトルメントが存在することを考えると、Microsoft Office アプリケーションはどれもライブラリインジェクション攻撃に対して脆弱だと言えます。
すべての Microsoft Office アプリケーションには共通の特徴がいくつかありますが、そのエンタイトルメントは異なります。つまり、アプリケーションにライブラリを挿入した場合の影響は、どのアプリケーションが侵害されるかによって異なります。一般的に、アプリケーションにすでに特定のアクセス許可が付与されている場合、攻撃者がそのアプリケーションを悪用して、それ以上ユーザーの操作を必要とすることなく、制限されたリソースにアクセスする可能性があります。
以下にその例を示します。
Outlook を除くすべてのアプリケーションは、ユーザープロンプトなしで Apple イベントを Microsoft Outlook に送り、電子メールを送信できます。基本的には、ユーザーが操作しなくても、攻撃者は電子メールを送信できます。
Excel を除くすべてのアプリケーションには音声を録音する機能があり、一部のアプリケーションはカメラにもアクセスできます。
攻撃者はいずれかのアプリケーションを使用して、UBF8T346G9.com.microsoft.identity.universalstorage アクセスグループに属するキーチェーンエントリを抽出できます。
Microsoft Teams アプリケーション
ライブラリインジェクションに対する脆弱性の面で、Microsoft Teams(職場または学校用)アプリケーションは Microsoft Office アプリケーションと似ていますが、異なる点もあります。それは、アプリケーション内に、同じくこの脆弱性の影響を受けやすいヘルパーアプリケーションが複数あるということです。ただし、ヘルパーアプリケーションの 1 つには、相対パスでインポートされるライブラリはありません。
Microsoft Office スイートと同様、これら 3 つのアプリケーションはライブラリインジェクション攻撃に対して脆弱です。その理由は、強化されたランタイムが有効であるにもかかわらず、3 つのアプリケーションすべてに com.apple.security.cs.disable-library-validation エンタイトルメントがあり、true に設定されているからです。
Microsoft Teams(職場または学校)
Microsoft Teams(職場または学校用、以降では単に Teams と記載)には多くのエンタイトルメントがあります。Talos が報告した時点での Teams アプリケーションのエンタイトルメントは以下のとおりです。
$ codesign -dv –entitlements – “/Applications/Microsoft Teams (work or school).app”
Executable=/Applications/Microsoft Teams (work or school).app/Contents/MacOS/MSTeams
Identifier=com.microsoft.teams2
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=164256 flags=0x10000(runtime) hashes=5122+7 location=embedded
Signature size=9012
Timestamp=20 Mar 2024 at 22:54:32
Info.plist entries=32
TeamIdentifier=UBF8T346G9
Runtime Version=14.2.0
Sealed Resources version=2 rules=13 files=143
Internal requirements count=1 size=180
[Dict]
[Key] com.apple.application-identifier
[Value]
[String] UBF8T346G9.com.microsoft.teams2
[Key] com.apple.developer.team-identifier
[Value]
[String] UBF8T346G9
[Key] com.apple.security.app-sandbox
[Value]
[Bool] true
[Key] com.apple.security.application-groups
[Value]
[Array]
[String] UBF8T346G9.com.microsoft.teams
[String] UBF8T346G9.com.microsoft.oneauth
[Key] com.apple.security.cs.allow-unsigned-executable-memory
[Value]
[Bool] true
[Key] com.apple.security.cs.disable-library-validation
[Value]
[Bool] true
[Key] com.apple.security.device.audio-input
[Value]
[Bool] true
[Key] com.apple.security.device.bluetooth
[Value]
[Bool] true
[Key] com.apple.security.device.camera
[Value]
[Bool] true
[Key] com.apple.security.device.microphone
[Value]
[Bool] true
[Key] com.apple.security.device.print
[Value]
[Bool] true
[Key] com.apple.security.device.usb
[Value]
[Bool] true
[Key] com.apple.security.files.bookmarks.app-scope
[Value]
[Bool] true
[Key] com.apple.security.files.downloads.read-write
[Value]
[Bool] true
[Key] com.apple.security.files.user-selected.read-write
[Value]
[Bool] true
[Key] com.apple.security.network.client
[Value]
[Bool] true
[Key] com.apple.security.network.server
[Value]
[Bool] true
[Key] com.apple.security.personal-information.location
[Value]
[Bool] true
[Key] com.apple.security.print
[Value]
[Bool] true
[Key] com.apple.security.temporary-exception.sbpl
[Value]
[Array]
[String] (allow mach-lookup (global-name “com.apple.mdmclient.daemon.unrestricted”))
[String] (allow mach-lookup (global-name “com.apple.ReportCrash”))
[String] (allow mach-lookup (global-name “com.microsoft.teams2.launcher”))
[String] (allow ipc-posix-sem* (ipc-posix-name-prefix “/Smartscreen-anaheim”))
[String] (allow mach-register mach-lookup (global-name-prefix “com.microsoft.edgemac.mojo”))
[String] (allow mach-register mach-lookup (global-name-prefix “org.chromium.crashpad.child_port_handshake”))
[String] (allow mach-register mach-lookup (global-name-prefix “com.microsoft.teams2.helper.local.MachPortRendezvousServer”))
[String] (allow mach-register mach-lookup (global-name-prefix “com.microsoft.teams2.helper.MachPortRendezvousServer”))
[String] (allow mach-register mach-lookup (global-name-prefix “mach.renderer.receiver”))
[String] (allow mach-register mach-lookup (global-name-prefix “mach.streamrender”))
[String] (allow file-read* file-write* (subpath “/dev/fd”))
[String] (allow file-read* file-write* (subpath “/private/var/folders”))
[String] (allow file-read* (home-subpath “/Library/Logs/DiagnosticReports”))
[String] (allow user-preference-read (preference-domain “com.apple.mdmclient”))
[String] (allow user-preference-read (preference-domain “com.apple.SystemConfiguration”))
[String] (allow user-preference* (preference-domain “com.microsoft.teams2.defaults”))
[String] (allow user-preference* (preference-domain “com.microsoft.teams2.helper”))
[String] (allow user-preference* (preference-domain “com.microsoft.autoupdate2”))
[String] (allow user-preference-read (preference-domain “com.microsoft.office”))
[String] (allow network* (remote unix))
[String] (allow process-exec* (literal “/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate”))
[String] (allow mach-lookup (global-name “com.microsoft.update.xpc”))
[String] (allow signal (target-signing-identifier “com.microsoft.teams2.launcher”))
[String] (allow distributed-notification-post)
[String] (allow job-creation)
[String] (allow iokit-open (iokit-registry-entry-class-prefix “AppleSMC”))
[Key] keychain-access-groups
[Value]
[Array]
[String] UBF8T346G9.com.microsoft.identity.universalstorage
他の Microsoft Office アプリケーションと同様に、Teams にはいくつかのエンタイトルメントと相対パスでインポートされるライブラリがあります。一方、他のアプリケーションとの主な違いは、ユーザーが Teams をインストールしている場合、すでにアプリケーションが使用されている可能性が高いという点です。つまり、カメラとマイクのアクセス許可がおそらくすでに付与されています。攻撃者が Teams にライブラリを挿入できれば、Teams をプロキシとして使用して、ポップアップ通知をトリガーすることなく、ほぼ確実にカメラとマイクにアクセスできるでしょう。
com.microsoft.teams2.modulehost.app
Microsoft Teams のヘルパーアプリケーションの 1 つであり、以前は com.microsoft.teams2.modulehost.app として知られていましたが、最新のリリースで「Microsoft Teams ModuleHost.app」に名称が変更されました。このモジュールには以下のエンタイトルメントがありました。
$ codesign -dv –entitlements – “/Applications/Microsoft Teams (work or school).app/Contents/Helpers/com.microsoft.teams2.modulehost.app”
Executable=/Applications/Microsoft Teams (work or school).app/Contents/Helpers/com.microsoft.teams2.modulehost.app/Contents/MacOS/com.microsoft.teams2.modulehost
Identifier=com.microsoft.teams2
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=165792 flags=0x10000(runtime) hashes=5170+7 location=embedded
Signature size=9012
Timestamp=29 Mar 2024 at 05:04:18
Info.plist entries=29
TeamIdentifier=UBF8T346G9
Runtime Version=14.2.0
Sealed Resources version=2 rules=13 files=1
Internal requirements count=1 size=180
[Dict]
[Key] com.apple.security.cs.allow-jit
[Value]
[Bool] true
[Key] com.apple.security.cs.disable-library-validation
[Value]
[Bool] true
[Key] com.apple.security.personal-information.location
[Value]
[Bool] true
このアプリケーションには相対インポートが複数あります。エンタイトルメントは 3 つしかありませんが、メインアプリケーションのエンタイトルメントの一部をヘルパーアプリケーションが利用できます。これにより、攻撃者が写真撮影、音声録音、データの抜き取り、その他の不正なアクションを行う可能性があります。
WebView.app
Teams のヘルパーアプリケーションの 1 つである WebView.app には、Talos が問題を報告した時点で以下のエンタイトルメントがありました。
$ codesign -dv –entitlements – “/Applications/Microsoft Teams (work or school).app/Contents/Helpers/Microsoft Teams WebView.app”
Executable=/Applications/Microsoft Teams (work or school).app/Contents/Helpers/Microsoft Teams WebView.app/Contents/MacOS/Microsoft Teams WebView
Identifier=com.microsoft.teams2.helper
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=1735 flags=0x10000(runtime) hashes=43+7 location=embedded
Signature size=9013
Timestamp=29 Mar 2024 at 05:04:17
Info.plist entries=37
TeamIdentifier=UBF8T346G9
Runtime Version=14.0.0
Sealed Resources version=2 rules=13 files=88
Internal requirements count=1 size=188
[Dict]
[Key] com.apple.security.cs.allow-jit
[Value]
[Bool] true
[Key] com.apple.security.cs.disable-library-validation
[Value]
[Bool] true
[Key] com.apple.security.personal-information.location
[Value]
[Bool] true
前述のヘルパーアプリケーションと同様に、このアプリケーションには 3 つのエンタイトルメントしかありませんでした。にもかかわらず、ヘルパーアプリケーションはメインアプリケーションからエンタイトルメントを一部継承するため、音声録音の許可を要求できます。
このヘルパーアプリケーションの特徴は、相対インポートを使用しないことです。
$ otool -L "/Applications/Microsoft Teams (work or school).app/Contents/Helpers/Microsoft Teams WebView.app/Contents/MacOS/Microsoft Teams WebView" /Applications/Microsoft Teams (work or school).app/Contents/Helpers/Microsoft Teams WebView.app/Contents/MacOS/Microsoft Teams WebView: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1336.0.0)
これは、攻撃する側にとっては問題です。確かに、上のフローチャートに従ってアプリケーションがライブラリインジェクション攻撃に脆弱かどうかを評価すると「おそらく脆弱ではない」という結論になります。しかし、アプリケーションで使用される相対インポートはライブラリを読み込むための唯一の手段ではありません。実際、このアプリケーション自体が相対パスで dlopen を使用しています。これはアプリケーションの静的依存関係では明らかになりません。アプリケーションのコードのスニペットは以下のとおりです。
void _main(int32_t arg1, int64_t arg2) { [...] uint64_t path_length = 0; [...] if (__NSGetExecutablePath(0, &path_length) != 0xffffffff) { [...] } else { int64_t new_ptr = wrapper_simil_malloc(((uint64_t)path_length)); if (__NSGetExecutablePath(new_ptr, &path_length) == 0) { int64_t likely_executable_path = _dirname(new_ptr); char const* const rdi_12; if (likely_executable_path == 0) { _strerror(((uint64_t)*(uint32_t*)___error())); rdi_12 = "dirname %s: %s."; } else { int64_t executable_path_length = (_strlen(likely_executable_path) + 0x63); int64_t edge_framework_path = wrapper_simil_malloc(executable_path_length); _snprintf(edge_framework_path, executable_path_length, "%s/%s", likely_executable_path, "../Frameworks/Microsoft Edge Framework.framework/Versions/122.0.2365.103/Microsoft Edge Framework"); int64_t edge_framework_handler = _dlopen(edge_framework_path, 0x105); if (edge_framework_handler != 0) { int64_t ChromeMain_func = _dlsym(edge_framework_handler, "ChromeMain"); if (ChromeMain_func == 0) { [...] } _exit(ChromeMain_func(((uint64_t)arg1), arg2)); /* no return */ } [...] } [...] } [...] } [...] }
上記のコードは、基本的に <WebView executable path>/../Frameworks/Microsoft Edge Framework.framework/Versions/122.0.2365.103/Microsoft Edge Framework というパスを構築し、dlopen を利用して Microsoft Edge Framework ライブラリを読み込んでから、ChromeMain 関数を呼び出します。アプリケーションがライブラリを動的に読み込んでいるので、相対インポートを使用したライブラリの読み込みと動きがとてもよく似ています。そのため、このアプリケーションはライブラリインジェクションに対して脆弱であると言えます。
まとめ
macOS のセキュリティモデルは、標準的な DAC ポリシーシステムの機能を超えてセキュリティを強化します。アプリケーションが機密データやプライバシーに関連するリソースにアクセスしようとするたびに、ユーザーに通知されます。さらに、macOS には動的なライブラリインジェクションを防ぐ特定の機能があり、それによって脆弱性のカテゴリ全体を効果的に無効化します。欠陥がないシステムはなく、新たな脆弱性が発生する可能性はありますが、このフレームワークは、脆弱性を減らし、アプリケーションの動作に関するユーザーの意識を高めるのに重要な役割を果たしています。
Talos の調査では、ライブラリインジェクションに対して脆弱なアプリケーションに焦点を当てました。脆弱なアプリケーションにすでに付与されているエンタイトルメントやアクセス許可をマルウェアが悪用できるというシナリオです。
ケーススタディとして、Microsoft アプリケーションを使用しました。各アプリケーションでは強化されたランタイムが有効になっており、com.apple.security.cs.disable-library-validation エンタイトルメントもあります。Microsoft 社は、これらの問題はリスクが低いとみなしていますが、Talos が報告した 8 つのアプリケーションのうち、以下 4 つは Microsoft 社によって更新され、com.apple.security.cs.disable-library-validation エンタイトルメントが削除されました。そのため、上記で説明したシナリオに対する脆弱性はもはや存在しません。
- Microsoft Teams(職場または学校)のメインアプリケーション
- Microsoft Teams(職場または学校)WebView.app
- Microsoft Teams(職場または学校)com.microsoft.teams2.modulehost.app、現在は Microsoft Teams ModuleHost.app に名称変更
- Microsoft OneNote
ただし、残りの以下 4 つのアプリケーションには脆弱性が残っています。
脆弱性のあるアプリケーションでは、攻撃者がユーザープロンプトなしでアプリケーションのすべてのエンタイトルメントを悪用し、すでにアプリケーションに付与されているすべてのアクセス許可を再利用する余地が残っています。脆弱なアプリケーションは、攻撃者にとっては事実上、アクセス許可のブローカーとして機能します。
Microsoft 社は、何らかの「プラグイン」をサポートするために、特定のアプリケーションで com.apple.security.cs.disable-library-validation エンタイトルメントを使用しているようです。Apple 社によると、このエンタイトルメントはサードパーティのデベロッパーが署名したプラグインの読み込みを可能にします。しかし Talos が把握している限りでは、macOS 向け Microsoft アプリケーションで利用できる「プラグイン」は、「Office アドイン」と呼ばれている Web ベースのものだけです。
この理解が正しければ、ライブラリ検証を無効にする必要性について疑問が生じます。追加のライブラリを読み込むことを想定していないのであればなおさらです。このエンタイトルメントを使用することで、Microsoft 社が強化されたランタイムによる保護を回避し、ユーザーを不必要なリスクにさらす可能性があります。
そのようなプラグインを macOS の現在のフレームワークで安全に扱う方法が不明確であることも重要な点です。サードパーティ製のプラグインの公証は、複雑ではありますが選択肢になります。その場合、Microsoft 社または Apple 社がサードパーティ製のモジュールのセキュリティを確認してから署名する必要があります。
macOS では、TCC におけるリソースへのアクセス許可のようなユーザープロンプトを導入し、特定のサードパーティ製プラグインを読み込むかをユーザーが決定できるようにすることも考えられます。これはセキュリティを大きく損なうことなくアクセスを許可するための、より管理された手段となり得ます。
本稿は 2024 年 08 月 19 日にTalos Group のブログに投稿された「How multiple vulnerabilities in Microsoft apps for macOS pave the way to stealing permissions」の抄訳です。