macOS App Sandbox和Hardened Runtime的关系
macOS App Sandbox和Hardened Runtime的关系

macOS App Sandbox和Hardened Runtime的关系

Hardened Runtime 和 App Sandbox 都有访问权限控制,例如“通讯录”、“日历”、“位置”等,它们有看起来重复的参数,但实际上它们作用不同、是互补的机制。

App Sandbox(应用沙盒)

1、作用:限制 App 对系统资源的访问(强制访问控制)。

2、重点:默认阻止一切访问,除非在 .entitlements 文件中显式声明权限。

3、是否必须:App Store 必须开启。非 App Store 分发(通过 notarization)可以不开启,但建议使用。

4、App Sandbox权限(在 .entitlements 中):

如果不开启 App Sandbox,即使请求系统权限弹窗,也可能访问不到真实数据(系统不允许访问)。

Hardened Runtime(强化运行时)

1、作用:增强运行时的安全性,防止调试、注入、JIT 攻击等。

2、重点:用于代码签名 + Notarization 公证。

3、是否必须:App Store 分发:默认必须开启。非 App Store 分发:建议开启(尤其 Notarization 必须)。

4、Hardened Runtime 权限:在开启 Hardened Runtime 时,有些功能需要在签名时用 –options runtime 并在签名中添加特定 flag,如:

codesign --options runtime --entitlements your.entitlements ...

比如:

1、摄像头:需要 com.apple.security.device.camera。

2、麦克风:需要 com.apple.security.device.audio-input。

3、Apple Events:需要 com.apple.security.automation.apple-events。

两者设计目标

App Sandbox和Hardened Runtime存在权限的重叠,例如都可以授权摄像头、麦克风、位置等功能,两者实际存在权限控制的区别。

App Sandbox 控制可以访问什么的权限(例如“你可以访问联系人”);

Hardened Runtime 控制在可以访问的时候,触发系统弹窗 & 用户授权(例如“用户是否允许访问联系人”)。

可能会疑问,既然 App Sandbox 已经控制权限了,为什么 macOS 不直接由它也处理系统弹窗和用户授权,而是又搞了 Hardened Runtime 单独处理弹窗?

这其实是 Apple macOS 权限模型中的设计分层哲学,可以总结为一句话:

App Sandbox 负责的是开发者的声明(declare what you need),Hardened Runtime 负责的是系统对用户的保护(enforce runtime user consent)。

App Sandbox ≠ 权限弹窗系统,它是“权限边界”

App Sandbox 是一种静态的、文件级的“能力声明与隔离机制”:

它是系统级强制访问控制(Mandatory Access Control)的一部分,目的是限制 App 访问文件系统、网络、摄像头等资源。

它工作在内核级别,一旦你访问了未声明的资源,系统直接拒绝,甚至不会到用户态处理。

它不负责动态交互,也就是说:App Sandbox 不会也不能弹窗,因为它的责任是:“不在权限列表内,就永远不让你碰到这个资源。”

Hardened Runtime 是用户态的“执行守门人”

Hardened Runtime 是一个运行时安全框架,由 Apple 在 macOS Mojave(10.14)引入,初衷是为了支持 Notarization(应用公证),并抵御以下攻击:

1、动态代码注入

2、插件劫持

3、JIT 执行绕过

4、未授权访问敏感数据(如通讯录、摄像头)

它做了两件事:

1、为了用户安全,引入了隐私权限弹窗(TCC framework,Transparency, Consent, and Control)。

2、提供运行时安全防护,只有 Hardened Runtime 启用后,TCC 弹窗才工作。

所以 macOS 的 TCC 权限系统(弹窗/授权),依赖于 Hardened Runtime,而不是 Sandbox。

为什么不把两者合并?历史 & 兼容性原因

iOS 权限设计 = 沙盒 + 弹窗集成

因为 macOS 兼容历史上很多不使用 Sandbox 的老 App、命令行工具、插件程序。如果弹窗功能绑定在 App Sandbox 上,会导致:

旧 App 无法访问联系人、相册(因为没开启沙盒);

命令行工具(无 GUI)也不能弹窗请求授权;

会破坏大量 macOS 上已有生态。

所以 Apple 折中做法

保留 App Sandbox 用于声明资源访问范围;

把弹窗授权系统(TCC)挂在 Hardened Runtime 上;

再通过 Notarization 要求大家逐步启用 Hardened Runtime。

总结

App Store 分发时,建议开启 App Sandbox + Hardened Runtime,声明所需所有资源访问权限。

Notarization 分发(非 App Store)时,开启 Hardened Runtime,按需决定是否开启 App Sandbox,但仍需声明权限。

想访问通讯录、日历等敏感数据时,两边都需要写:Sandbox 控制“允许访问”,Hardened Runtime 控制“系统弹窗和权限授予”。

如果开发的是 macOS 应用、需要访问敏感资源(比如照片、联系人、摄像头),必须同时:

1、在 .entitlements 中添加 Sandbox 权限(如果开启了 Sandbox)。

2、启用 Hardened Runtime(触发弹窗授权)。

3、在代码中触发访问,系统才会弹出权限请求框。

相关文章

1、macOS管理App Sandbox权限:https://fangjunyu.com/2025/06/20/macos%e7%ae%a1%e7%90%86app-sandbox%e6%9d%83%e9%99%90/

2、macOS安全机制Hardened Runtime(强化运行时):https://fangjunyu.com/2025/06/22/macos%e5%ae%89%e5%85%a8%e6%9c%ba%e5%88%b6hardened-runtime%ef%bc%88%e5%8a%a0%e5%9b%ba%e8%bf%90%e8%a1%8c%e6%97%b6%ef%bc%89/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注