你希望在 macOS 上创建一个类似 ~/Library/Group Containers/group.com.apple.notes 的"私密目录",阻止各种应用/程序随意访问。
结论:普通用户无法创建真正的系统级 Data Vaults(这需要 Apple 的数字签名)。但通过组合策略,可以达到极高的安全水平。
macOS 有三套相互独立但协同工作的安全机制:
| 机制 | 本质 | 保护对象 | 关键特性 |
|---|---|---|---|
| App Sandbox | 限制 App 行为的"囚笼" | 防止 App 越界访问 | 只约束沙盒内的 App,非沙盒程序(如终端脚本)不受限 |
| Data Vaults | 保护特定数据的"禁区" | 系统敏感数据(Notes, Messages, Mail, Safari 等) | 基于路径的保护,FDA 权限可穿透 |
| TCC | 隐私授权的"守门人" | 文件目录 + 硬件/服务(摄像头、麦克风、辅助功能等) | 管理用户授权,FDA 是其最高豁免权限 |
核心发现(基于你的实测): 在 macOS 15.x 中,Full Disk Access (FDA) 权限极其强大:
- ✅ 可访问
~/Library/Messages(短信数据库) - ✅ 可访问
~/Library/Group Containers/group.com.apple.notes - ✅ 可读取
/Library/Application Support/com.apple.TCC/TCC.db(系统级隐私授权数据库)
这意味着:FDA ≈ 文件系统的"上帝模式",比传统 sudo 还强(sudo 会被 SIP 拦截,但 FDA 是 SIP 白名单)。
| 特性 | Sandbox Container | Data Vaults |
|---|---|---|
| 路径 | ~/Library/Containers/ |
散落各处(Messages, Notes, Safari 等) |
| 保护逻辑 | 限制"谁能出去"(App 被关在笼子里) | 限制"谁能进来"(数据被锁在金库里) |
| 防护对象 | 防其他沙盒 App | 防所有无授权进程 |
| 非沙盒程序 | ❌ 可访问 | ❌ 可访问(需 FDA) |
| FDA App | ✅ 可访问 | ✅ 可访问(实测确认) |
结论:Sandbox Container 不是 Data Vaults。两者都防不住 FDA App。
你的回收站实验揭示了关键真相:
- 受保护目录中的文件,一旦被有权限的程序(如 Finder)移出(如移到回收站),保护立即消失。
- 这是"基于路径的防御"的固有局限。
当你给终端 App(如 Alacritty)授予 FDA 后:
Alacritty (FDA)
└── zsh (继承 FDA)
└── 脚本/Mach-O 程序 (继承 FDA)
所有子进程都自动继承 FDA 权限,这是巨大的安全风险点。
macOS 中的可执行文件本质上只有两类:
| 类型 | 描述 | 执行方式 |
|---|---|---|
| Mach-O | 原生二进制(含 Fat/Universal Binary) | 内核直接执行 |
| 脚本 | 带 Shebang 的文本文件 | 由解释器(zsh/python 等)执行 |
| App Bundle | 本质是文件夹,内含 Mach-O 或脚本 | 通过 LaunchServices 启动 |
关键点:脚本的权限取决于解释器进程的权限,而非脚本文件本身。
| 方案 | 防普通 App | 防 FDA App | 防物理接触 | 实用性 |
|---|---|---|---|---|
| 依赖 TCC 目录(Documents 等) | ❌ | ❌ | 低 | |
| 寄生 Data Vaults(Notes 目录) | ✅ | ❌ | ❌ | 中 |
| 独立用户账户 | ✅ | ❌ | 中 | |
| 加密磁盘映像(挂载后) | ❌ | ❌ | 高 | |
| 加密磁盘映像(未挂载) | ✅ | ✅ | ✅ | 最高 |
| 虚拟机 + 镜像加密 | ✅ | ✅ | ✅ | 重量级 |
1. 存储介质
# 创建 APFS 加密稀疏捆绑磁盘映像
hdiutil create -size 10g -fs APFS -encryption AES-256 \
-type SPARSEBUNDLE -volname "Vault" ~/iCloud/Vault.sparsebundle- 格式:
.sparsebundle(云同步友好,增量上传) - 加密:AES-256
- 存放:可放 iCloud Drive(加密后即使被下载也无法解密)
2. 密码管理
- ❌ 不存入系统钥匙串(防止自动解锁)
- ✅ 存入独立密码管理器(如 1Password),通过 Touch ID 调用
3. 挂载策略
# 挂载到深层隐蔽目录(防普通 App 扫描)
mkdir -p ~/Library/Group\ Containers/group.com.apple.notes/.vault
hdiutil attach ~/iCloud/Vault.sparsebundle \
-mountpoint ~/Library/Group\ Containers/group.com.apple.notes/.vault- 虽然防不住 FDA App,但能阻挡 99% 的普通程序
4. 分级终端权限(你的最佳实践)
| 终端 | FDA 权限 | 用途 |
|---|---|---|
| iTerm | ❌ | 日常使用 |
| Terminal | ❌ | 避免被 Finder 自动调用时泄露 |
| Alacritty | ✅ | 仅用于特权操作,谨慎使用 |
5. 操作习惯
- 用完立即卸载 (
hdiutil detach) - 删除敏感文件用
rm -P或Option+Cmd+Delete(跳过回收站) - 定期检查 FDA 授权列表,确保无异常 App
┌─────────────────────────────────────────────────────┐
│ 攻击场景 │ 防御状态 │
├─────────────────────────────────────────────────────┤
│ 普通 App 扫描 │ ✅ 完全防御 │
│ 恶意脚本(无 FDA) │ ✅ 完全防御 │
│ FDA App(如 Alacritty) │ ⚠️ 挂载时可访问 │
│ │ ✅ 未挂载时无法解密 │
│ 电脑丢失/被盗 │ ✅ AES-256 加密保护 │
│ iCloud 账号泄露 │ ✅ 加密文件无法解密 │
└─────────────────────────────────────────────────────┘
一句话总结:
在 macOS 上,未挂载的加密磁盘映像是唯一能抵御 FDA 权限的防线。系统目录保护(Data Vaults/Sandbox)只能作为"隐蔽层"辅助,不能作为核心依赖。结合分级终端权限管理,可构建接近完美的隐私保护体系。
今天的一个探索。
以前觉得iOS的App之间数据不同挺烦人的,
今天深入探索了一下macOS中的保护机制,
感觉在日常较多使用终端及各种cli的情况下,macOS的保护机制还是很重要和有价值的。
尤其是在使用code agent这种东西时,虽然read工具有明确的目录保护(cwd),但llm打算执行shell命令时很容易就饶过,
code agent其实是比较难保护的,这时候os就被的保护就尤为重要了。