macos-security-bypass について
許可を得たセキュリティ作業向けのmacOSセキュリティ回避リファレンススキルです。TCC、Gatekeeper、SIP、サンドボックス、コード署名、エンタイトルメント、永続化を、バージョン別の例やコマンドとともに扱います。
主な機能
- 01TCC回避の手法と前提条件
- 02Gatekeeperの隔離属性回避
- 03SIPの制限と過去の回避事例
- 04サンドボックス脱出の経路
- 05コード署名とエンタイトルメントの分析
- 06回避後の永続化手法
活用シーン
- 01TCC権限と露出範囲の評価
- 02エンドポイントでのGatekeeper動作の確認
- 03アプリの権限と署名の監査
- 04サンドボックス脱出と永続化リスクの調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ yaklang/ hack-skills --skill macos-security-bypassインストール後、Claude Code で/macos-security-bypassを入力して読み込まれたか確認します。
同梱ファイルTCC_BYPASS_MATRIX.md
詳細
スキル:macOS セキュリティバイパス — エキスパート向け攻撃プレイブック
AI 読み込み指示:macOS の高度なセキュリティバイパス手法です。TCC バイパス、Gatekeeper の回避、SIP の制限、サンドボックスからの脱出、エンタイトルメントの悪用を扱います。ベースモデルでは、バージョンごとのバイパスの細かな違いや、保護機能同士の相互作用の影響を見落としがちです。
0. 関連するルーティング
詳しく調べる前に、次の読み込みを検討してください。
- 初期アクセスの獲得後に dylib インジェクション、XPC の悪用、または Electron の悪用が必要な場合は、macos-process-injection
- macOS にも適用される Unix レイヤーの権限昇格手法(SUID、cron、書き込み可能なパス)については、linux-privilege-escalation
- Unix で共通するセキュリティバイパスの概念については、linux-security-bypass
高度なリファレンス
次の情報が必要な場合は、TCC_BYPASS_MATRIX.md も読み込んでください。
- macOS のバージョンごとの TCC バイパスのマッピング
- 保護の種類ごとの手法(カメラ、マイク、FDA、自動化)
- MDM/構成プロファイルの悪用パターン
1. TCC(透明性、同意、制御)の概要
TCC は macOS の権限フレームワークで、機密リソース(カメラ、マイク、連絡先、フルディスクアクセスなど)へのアクセスを制御します。
1.1 TCC データベースの場所
| データベース | パス | 制御対象 | 保護 |
|---|---|---|---|
| ユーザーレベル | ~/Library/Application Support/com.apple.TCC/TCC.db | ユーザーごとの同意判断 | Catalina 以降は SIP で保護 |
| システムレベル | /Library/Application Support/com.apple.TCC/TCC.db | システム全体の同意判断 | SIP で保護 |
| MDM 管理対象 | 構成プロファイル経由 | PPPC(プライバシー環境設定ポリシー制御)を配信 | デバイス管理 |
-- Query TCC database (requires FDA or SIP off)
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \
"SELECT service, client, allowed FROM access;"
1.2 TCC バイパスのカテゴリ
| カテゴリ | 仕組み | 一般的な前提条件 |
|---|---|---|
| FDA アプリの悪用 | すでにフルディスクアクセスを許可されているアプリに便乗する | FDA アプリのバンドルまたはプラグインディレクトリへの書き込みアクセス |
| DB の直接変更 | TCC.db を編集して同意を付与する | SIP の無効化または FDA |
| 権限の継承 | 子プロセスが親プロセスの TCC 許可を継承する | FDA が許可されたアプリのコンテキストでコードを実行 |
| 自動化の悪用 | Apple Events/osascript で TCC 許可済みのアプリを制御する | 自動化の許可(TCC への直接アクセスより低いハードル) |
| マウントの手口 | 変更済みの TCC.db を含む細工したディスクイメージをマウントする | ローカルアクセス、Ventura より前 |
| TCC の SQL インジェクション | TCC サブシステムで SQL インジェクションを引き起こす不正なバンドル ID | CVE-2023-32364 など |
1.3 既知の TCC バイパスパターン
Terminal/iTerm の FDA 継承:Terminal.app に FDA が許可されている → 実行したコマンドはすべて FDA を継承する → 任意のファイルを読み取れる。
# If Terminal has FDA, this reads protected files directly
cat ~/Library/Mail/V*/MailData/Envelope\ Index
cat ~/Library/Messages/chat.db
Finder の自動化:より低い権限で Finder を自動化し、保護された場所にあるファイルにアクセスする。
tell application "Finder"
set f to POSIX file "/Users/target/Library/Mail/V9/MailData/Envelope Index"
duplicate f to desktop
end tell
システム環境設定/システム設定へのインジェクション:Application Scripts フォルダに書き込んで、すでに TCC 権限を持つプロセスにインジェクションする。
MDM プロファイルの悪用:PPPC プロファイルを使うと、TCC 権限を事前に承認できます。不正な MDM 登録、または侵害された MDM サーバーから PPPC ペイロードを配信します。
2. Gatekeeper のバイパス
Gatekeeper は署名されていないアプリ、または公証されていないアプリの実行をブロックします。基本的な強制は com.apple.quarantine 拡張属性に依存します。
2.1 隔離属性の削除
# Check quarantine attribute
xattr -l /path/to/app
# Output: com.apple.quarantine: 0083;...
# Remove quarantine (requires write access)
xattr -d com.apple.quarantine /path/to/app
# Recursive for app bundles
xattr -rd com.apple.quarantine /path/to/MyApp.app
2.2 バイパス手法
| 手法 | 仕組み | macOS のバージョン |
|---|---|---|
xattr -d による削除 | 実行前に隔離属性を削除します | すべて(ローカルアクセスが必要) |
| アプリのトランスロケーションのバイパス | 特定の場所にあるアプリはトランスロケーションをスキップします | Catalina より前 |
| 隔離属性を除去するアーカイブツール | 隔離属性を引き継がない展開アプリもあります | ツールによって異なります |
| 署名済みバンドル内の未署名コード | 公証済みアプリバンドルに未署名のネストされたヘルパーが含まれています | Ventura より前(CVE-2022-42821) |
| Safari の自動展開と起動 | ダウンロードした ZIP が自動展開され、隔離属性が完全に適用される前にアプリが起動します | Safari 固有、修正済み |
| ACL の悪用 | ダウンロード前に設定された ACL により、com.apple.quarantine がブロックされる可能性があります | 事前の配置が必要 |
| ディスクイメージ(DMG)の悪用 | ネットワーク共有からマウントされた DMG には隔離属性が付与されない場合があります | ネットワーク共有の状況によります |
| BOM(部品表)のバイパス | 細工された pkg 内の BOM により、展開されたファイルの隔離属性がスキップされます | CVE-2022-22616 |
2.3 Gatekeeper のチェックフロー
App launched
│
├── com.apple.quarantine attribute present?
│ ├── No → execute (no Gatekeeper check)
│ └── Yes ↓
│
├── Code signature valid?
│ ├── No → block
│ └── Yes ↓
│
├── Notarized (stapled ticket or online check)?
│ ├── No → block (Catalina+)
│ └── Yes → execute
│
└── User override? (right-click → Open → confirm)
└── Bypasses Gatekeeper once for this app
3. SIP(システム整合性保護)
SIP は、保護されたシステム領域の変更、未署名のカーネル拡張機能の読み込み、システムプロセスのデバッグを root に対して制限します。
3.1 SIP で保護される場所
/System/
/usr/ (except /usr/local/)
/bin/
/sbin/
/var/ (selected subdirs)
/Applications/ (pre-installed Apple apps)
3.2 SIP の状態と設定
csrutil status # Check SIP status
csrutil disable # Recovery Mode only
csrutil enable --without fs # Partial disable (risky)
3.3 SIP をバイパスするエンタイトルメント
| エンタイトルメント | 効果 |
|---|---|
com.apple.rootless.install | SIP で保護されたパスへの書き込み |
com.apple.rootless.install.heritable | 子プロセスが SIP バイパスを継承します |
com.apple.security.cs.allow-unsigned-executable-memory | メモリ内での JIT/未署名コード |
com.apple.private.security.clear-library-validation | 未署名ライブラリの読み込み |
3.4 過去の SIP バイパス
| CVE | macOS | 手法 |
|---|---|---|
| CVE-2021-30892(Shrootless) | Monterey 12.0.1 より前 | 署名済み pkg 内の system_installd +インストール後スクリプト |
| CVE-2022-22583 | Monterey 12.2 より前 | packagekit +マウントポイントの操作 |
| CVE-2022-46689(MacDirtyCow) | Ventura 13.1 より前 | コピーオンライトの競合状態を利用して SIP ファイルを上書き |
| CVE-2023-32369(Migraine) | Ventura 13.4 より前 | systemmigrationd を介した移行アシスタントの TCC/SIP バイパス |
| CVE-2024-44243 | Sequoia 15.2 より前 | StorageKit デーモンの悪用 |
4. サンドボックスからの脱出
macOS のサンドボックス(App Sandbox、sandbox-exec またはエンタイトルメントを使用)は、アプリによるファイルシステム、ネットワーク、IPC へのアクセスを制限します。
4.1 Office サンドボックスからの脱出パターン
| ベクトル | 説明 |
|---|---|
| 開く/保存ダイアログの悪用 | ユーザーがダイアログでファイルアクセスを許可する → マクロがサンドボックスの外部のファイルを読み書きします |
~/Library/LaunchAgents/ への永続化 | 一部のサンドボックスプロファイルでは、LaunchAgent の plist への書き込みが許可されます |
| ログイン項目の操作 | サンドボックスの外部にあるペイロードを指すログイン項目を追加します |
| 共有コンテナの悪用 | 同じ App Group コンテナを共有する複数のアプリを利用します |
4.2 IPC ベースの脱出
| IPC の仕組み | 脱出ベクトル |
|---|---|
| XPC サービス | クライアントの検証が不十分な、特権を持つ XPC サービスに接続します |
| Mach ポート | 特権を持つタスクポートへの送信権を取得します |
| Apple イベント | サンドボックス化されていないアプリを自動操作し、処理を実行させます |
| 分散通知 | サンドボックス化されていないヘルパーに通知を送り、ペイロードを実行させます |
| ペーストボード | ペイロードをペーストボードに書き込み、サンドボックス化されていないアプリに読み込ませます |
4.3 ブラウザーのサンドボックス
- Chromium:マルチプロセスモデルで、レンダラープロセスはサンドボックス化されていますが、ブラウザープロセスはされていません
- Safari:WebContent プロセスはサンドボックス化されていますが、親の Safari プロセスはより多くの権限を持ちます
- エクスプロイトチェーン:レンダラーの RCE → サンドボックスからの脱出(ブラウザープロセスの IPC の脆弱性を利用)→ システムへのアクセス
5. コード署名とエンタイトルメント
5.1 署名とエンタイトルメントの確認
codesign -dv --verbose=4 /path/to/app # Signature details
codesign -d --entitlements :- /path/to/app # Dump entitlements
security cms -D -i /path/to/mobileprovision # Provisioning profile
# Verify signature validity
codesign --verify --deep --strict /path/to/app
spctl --assess --type execute /path/to/app # Gatekeeper assessment
5.2 権限昇格のためのエンタイトルメント悪用
| エンタイトルメント | 悪用シナリオ |
|---|---|
com.apple.security.cs.disable-library-validation | エンタイトルメントを持つプロセスに攻撃者の dylib をロードする |
com.apple.security.cs.allow-dyld-environment-variables | DYLD_INSERT_LIBRARIES によるインジェクション |
com.apple.security.get-task-allow | デバッガーをアタッチし、コードをインジェクトする |
com.apple.security.cs.debugger | 任意のプロセスをデバッグする |
com.apple.private.apfs.revert-to-snapshot | APFS スナップショットを復元し、変更を回避する |
5.3 Hardened Runtime の回避
Hardened Runtime は、DYLD 環境変数、デバッグ、署名されていないメモリでの実行を防ぎます。回避方法:
- Hardened Runtime を弱める(
disable-library-validation)エンタイトルメントを持つアプリを探す - JIT のエンタイトルメントを持つアプリ(ブラウザー、VM)を悪用して、署名されていないコードを実行する
- 本番環境に残された
get-task-allowエンタイトルメントを持つデバッグビルドを使用する
5.4 ライブラリ検証の回避
ライブラリ検証により、Apple 署名済み、または同じチームによって署名された dylib のみがロードされます。
# Find apps with library validation disabled
codesign -d --entitlements :- /Applications/*.app/Contents/MacOS/* 2>/dev/null | \
grep -l "disable-library-validation"
6. 回避後の永続化
| 方法 | 場所 | 再起動後も維持 | 備考 |
|---|---|---|---|
| LaunchAgent | ~/Library/LaunchAgents/ | はい | ユーザーレベルで、ログイン時に実行 |
| LaunchDaemon | /Library/LaunchDaemons/ | はい | ルートレベルで、起動時に実行 |
| ログイン項目 | ~/Library/Application Support/com.apple.backgroundtaskmanagementagent/ | はい | システム設定に表示される |
| Cron | crontab -e | はい | 防御側に見落とされがち |
| Dylib ハイジャック | 書き込み可能な dylib 検索パス | はい | 対象アプリの起動時にトリガーされる |
| フォルダーアクション | ~/Library/Scripts/Folder Action Scripts/ | はい | フォルダーのイベント時にトリガーされる |
7. macOS セキュリティ回避の判断ツリー
Target is macOS endpoint
│
├── Need to execute untrusted binary?
│ ├── Quarantine attribute present?
│ │ ├── Yes → xattr -d com.apple.quarantine (§2.1)
│ │ └── No → execute directly
│ └── Gatekeeper still blocks?
│ ├── Signed but not notarized → right-click → Open override
│ └── Unsigned → embed in signed bundle or use archive tricks (§2.2)
│
├── Need access to TCC-protected resources?
│ ├── FDA-granted app available?
│ │ ├── Yes → exploit FDA app context (§1.3)
│ │ └── No ↓
│ ├── Automation permission obtainable?
│ │ ├── Yes → Apple Events to TCC-granted app (§1.3)
│ │ └── No ↓
│ ├── SIP disabled?
│ │ ├── Yes → direct TCC.db modification (§1.2)
│ │ └── No → check version-specific TCC bypass (→ TCC_BYPASS_MATRIX.md)
│ └── MDM present?
│ └── Compromised MDM → push PPPC profile (§1.3)
│
├── Need to bypass SIP?
│ ├── Check macOS version → historical SIP CVE? (§3.4)
│ ├── Find entitled Apple binary → piggyback SIP-bypass entitlement (§3.3)
│ └── Recovery Mode access? → csrutil disable (§3.2)
│
├── Need sandbox escape?
│ ├── Office macro context → dialog/LaunchAgent tricks (§4.1)
│ ├── XPC service with weak validation → IPC escape (§4.2)
│ └── Browser context → renderer → sandbox escape chain (§4.3)
│
├── Need to inject into signed process?
│ ├── disable-library-validation entitlement? → dylib injection
│ ├── allow-dyld-environment-variables? → DYLD_INSERT_LIBRARIES
│ ├── get-task-allow? → debugger attach
│ └── None → check macos-process-injection SKILL.md
│
└── Need persistence?
└── Choose method by access level (§6)
8. クイックリファレンス:ツールコマンド
# Enumerate TCC permissions
tccutil reset All # Reset all TCC (admin)
sqlite3 TCC.db "SELECT * FROM access;" # Read TCC DB
# Gatekeeper status
spctl --status # Gatekeeper enabled?
spctl --assess -v /path/to/app # Check app assessment
# SIP status
csrutil status
# Find interesting entitlements across system
find /System/Applications /Applications -name "*.app" -exec sh -c \
'codesign -d --entitlements :- "$1" 2>/dev/null | grep -q "disable-library-validation" && echo "$1"' _ {} \;
# List loaded kexts (kernel extensions)
kextstat | grep -v com.apple
# Sandbox profile inspection
sandbox-exec -p "(version 1)(allow default)" /bin/ls # Test sandbox rules