Skip to content

Instantly share code, notes, and snippets.

@kindy
Last active January 24, 2026 13:14
Show Gist options
  • Select an option

  • Save kindy/78a526efb48cfd1e78a62b15993800ba to your computer and use it in GitHub Desktop.

Select an option

Save kindy/78a526efb48cfd1e78a62b15993800ba to your computer and use it in GitHub Desktop.

macOS 隐私目录保护机制深度总结

一、核心问题

你希望在 macOS 上创建一个类似 ~/Library/Group Containers/group.com.apple.notes 的"私密目录",阻止各种应用/程序随意访问。

结论:普通用户无法创建真正的系统级 Data Vaults(这需要 Apple 的数字签名)。但通过组合策略,可以达到极高的安全水平。


二、macOS 安全机制解析(基于实测修正)

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 白名单)。


三、关键概念辨析

1. Sandbox Container vs Data Vaults

特性 Sandbox Container Data Vaults
路径 ~/Library/Containers/ 散落各处(Messages, Notes, Safari 等)
保护逻辑 限制"谁能出去"(App 被关在笼子里) 限制"谁能进来"(数据被锁在金库里)
防护对象 防其他沙盒 App 防所有无授权进程
非沙盒程序 ❌ 可访问 ❌ 可访问(需 FDA)
FDA App ✅ 可访问 ✅ 可访问(实测确认)

结论:Sandbox Container 不是 Data Vaults。两者都防不住 FDA App

2. 保护的是"路径"而非"文件本身"

你的回收站实验揭示了关键真相:

  • 受保护目录中的文件,一旦被有权限的程序(如 Finder)移出(如移到回收站),保护立即消失
  • 这是"基于路径的防御"的固有局限。

3. 权限继承链

当你给终端 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 目录)
独立用户账户 ⚠️ sudo 可破
加密磁盘映像(挂载后) ⚠️ 取决于挂载点
加密磁盘映像(未挂载) 最高
虚拟机 + 镜像加密 重量级

六、最终推荐方案

核心策略:加密磁盘映像 + 分级终端权限

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 -POption+Cmd+Delete(跳过回收站)
  • 定期检查 FDA 授权列表,确保无异常 App

七、安全级别总结

┌─────────────────────────────────────────────────────┐
│  攻击场景                │  防御状态                 │
├─────────────────────────────────────────────────────┤
│  普通 App 扫描           │  ✅ 完全防御              │
│  恶意脚本(无 FDA)       │  ✅ 完全防御              │
│  FDA App(如 Alacritty)  │  ⚠️ 挂载时可访问         │
│                         │  ✅ 未挂载时无法解密      │
│  电脑丢失/被盗            │  ✅ AES-256 加密保护      │
│  iCloud 账号泄露          │  ✅ 加密文件无法解密      │
└─────────────────────────────────────────────────────┘

一句话总结

在 macOS 上,未挂载的加密磁盘映像是唯一能抵御 FDA 权限的防线。系统目录保护(Data Vaults/Sandbox)只能作为"隐蔽层"辅助,不能作为核心依赖。结合分级终端权限管理,可构建接近完美的隐私保护体系。

@kindy
Copy link
Author

kindy commented Jan 24, 2026

今天的一个探索。
以前觉得iOS的App之间数据不同挺烦人的,
今天深入探索了一下macOS中的保护机制,
感觉在日常较多使用终端及各种cli的情况下,macOS的保护机制还是很重要和有价值的。
尤其是在使用code agent这种东西时,虽然read工具有明确的目录保护(cwd),但llm打算执行shell命令时很容易就饶过,
code agent其实是比较难保护的,这时候os就被的保护就尤为重要了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment