macos应用数据隔离通过内核级沙盒机制实现:每个应用默认仅能访问自有容器目录,越界访问被xnu内核拦截并返回eperm;权限由tcc动态管控,用户可随时授/撤;跨应用通信须经xpc等认证通道;还可通过apfs宗卷克隆、多用户账户等延伸隔离。

macOS 应用数据隔离不是靠“关文件夹门”实现的,而是从内核层就划清边界——每个应用默认只能碰自己沙盒里的东西,连读一个用户文档都得先伸手要钥匙。
沙盒机制:默认锁死,授权才开
系统在安装应用时就为其分配独立的私有目录(如 ~/Library/Containers/com.example.app),该路径由 UID 隔离,其他应用无法通过路径拼接或硬编码方式访问。即使用户授予“完整磁盘访问”权限,也只是开放公共区域(如 ~/Documents、~/Downloads),不等于打通沙盒壁垒。所有越界访问请求都会被 XNU 内核的沙盒策略引擎拦截,并返回 EPERM 错误,明确标识是策略拒绝而非权限不足。
权限动态管控:用户说了算,系统来执行
macOS 不预设信任,任何敏感操作都必须触发显式授权弹窗:
- 辅助功能权限需在「系统设置 → 隐私与安全性 → 自动化」中手动勾选,且仅对具体进程生效(如 Terminal 或 iTerm2)
- 屏幕录制、照片库、联系人等权限由 TCC(Transparency, Consent, Control)数据库统一管理,记录每个 App 的授权状态和时间戳
- 用户可随时在设置中撤销某项权限,系统会立即切断对应能力,无需重启应用
- 后台运行权限受 Hardened Runtime 限制,未声明 com.apple.security.application-groups 或未启用 Background App Refresh 的应用,切到后台后几秒即被挂起
跨应用通信:不走捷径,只走安检通道
两个 App 想交换数据,不能直接读对方内存或共享文件句柄,必须走系统认证通道:
- 通过 XPC 或 NSXPCConnection 建立受控 IPC,通信双方需匹配 Entitlements 中声明的 service bundle ID
- 拖放(Drag & Drop)、剪贴板共享、URL Scheme 调用均受沙盒策略校验,例如 URL Scheme 必须在 Info.plist 中预注册,否则启动失败
- 若需访问 Keychain 数据,必须配置 keychain-access-groups 并签名一致,否则 SecItemAdd 返回 errSecInteractionNotAllowed
系统级隔离延伸:不止于单个 App
当需要更强隔离,macOS 提供向上叠加的方案:
- APFS 宗卷克隆:用 diskutil apfs cloneVolume 创建逻辑副本,启动后 Safari 缓存、LaunchAgents、Keychain 完全物理分离,适合开发多环境
- 多用户账户:不同账户下同名 App 的偏好设置(~/Library/Preferences)、扩展配置、自动登录项互不可见
- 终端临时切换身份:用 sudo -u username open -a "App" 启动,进程归属目标用户,沙盒 UID 和资源视图随之切换











