关于 macos-security-bypass
面向授权安全工作的 macOS 安全绕过参考技能,涵盖 TCC、Gatekeeper、SIP、沙盒、代码签名、权限和持久化,并列出版本相关示例与命令。
主要功能
- 01TCC 绕过方式与前提
- 02Gatekeeper 隔离属性绕过
- 03SIP 限制与历史绕过案例
- 04沙盒逃逸途径
- 05代码签名和权限分析
- 06绕过后的持久化方法
适用场景
- 01评估 TCC 权限及暴露面
- 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
详细介绍
SKILL:macOS 安全绕过——专家攻击手册
AI 加载说明:macOS 安全绕过专家技术。涵盖 TCC 绕过、Gatekeeper 规避、SIP 限制、沙盒逃逸和权限滥用。基础模型会遗漏特定版本的绕过细节以及各项保护的交互影响。
0. 相关路由
深入探查之前,可考虑加载:
- macos-process-injection,用于在获得初始访问权限后进行 dylib 注入、利用 XPC 或滥用 Electron
- linux-privilege-escalation,用于同样适用于 macOS 的 Unix 层提权技术(SUID、cron、可写路径)
- linux-security-bypass,了解 Unix 通用安全绕过概念
高级参考资料
在需要以下内容时,也请加载 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 应用的程序包或插件目录具有写入权限 |
| 直接修改数据库 | 编辑 TCC.db 以授予许可 | 禁用 SIP 或具有 FDA 权限 |
| 继承权限 | 子进程继承父进程的 TCC 授权 | 在获得 FDA 授权的应用上下文中执行代码 |
| 滥用自动化 | 使用 Apple Events/osascript 控制获得 TCC 授权的应用 | 自动化权限(门槛低于直接 TCC 权限) |
| 挂载技巧 | 挂载包含已修改 TCC.db 的精心构造磁盘映像 | 本地访问权限,适用于 Ventura 之前的版本 |
| TCC 中的 SQL 注入 | 构造格式错误的程序包 ID,触发 TCC 子系统中的 SQL 注入 | 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 之前 | system_installd + 已签名 pkg 中的安装后脚本 |
| CVE-2022-22583 | Monterey 12.2 之前 | packagekit + 操纵挂载点 |
| CVE-2022-46689 (MacDirtyCow) | Ventura 13.1 之前 | 利用写时复制中的竞态条件覆盖 SIP 文件 |
| CVE-2023-32369 (Migraine) | Ventura 13.4 之前 | 通过 systemmigrationd 绕过 Migration Assistant 的 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 Events | 自动化未受沙盒限制的应用以执行操作 |
| 分布式通知 | 向未受沙盒限制的辅助程序发送信号,使其执行载荷 |
| 剪贴板 | 将载荷写入剪贴板,由未受沙盒限制的应用读取 |
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 利用 Entitlement 实现权限提升
| Entitlement | 滥用场景 |
|---|---|
com.apple.security.cs.disable-library-validation | 将攻击者的 dylib 加载到具有相应 Entitlement 的进程中 |
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 的具有相应 Entitlement 的应用(
disable-library-validation) - 利用具有 JIT Entitlement 的应用(浏览器、虚拟机)执行未签名代码
- 利用遗留在生产环境中的、具有
get-task-allowEntitlement 的调试版本
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/ | 是 | root 级别,启动时运行 |
| 登录项 | ~/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