外观
SIP 与公证:系统的两道保护
这两个机制经常被混为一谈,其实管的是完全不同的事:
- **系统完整性保护(SIP)**管的是「系统自己不能被改」。
- 门禁(Gatekeeper)与公证管的是「你下载的东西可不可信」。
搞不清区别,就会出现「应用打不开 → 搜到一篇教程 → 关掉 SIP」这种用大炮打蚊子、还把炮口对错方向的操作。
开始之前
本文的查询命令都是只读的。涉及降低保护的操作只做说明,不作为步骤推荐——真要执行时请先读完对应小节的代价部分。
SIP:系统自己不能被改
查看当前状态:
sh
csrutil status正常输出是 System Integrity Protection status: enabled.。
SIP 开启时,即使用 root 身份也不能:修改 /System、/usr(/usr/local 除外)、/bin、/sbin 下的内容;替换系统自带应用;把调试器附加到系统进程;加载未经签名的内核扩展。
注意它和上一篇的关系:/System 改不动有两层原因——卷本身只读(见目录结构与只读系统卷),以及 SIP 的限制。两道锁叠在一起,所以「用 sudo 应该能改吧」的直觉在这里完全不成立。
关掉它的代价
关闭 SIP 必须重启进恢复模式(Apple 芯片长按电源键进入「选项」,Intel 开机按住 Command-R),在那里执行 csrutil disable。在正常启动的系统里执行会直接被拒绝——这是有意的设计。
代价是全局且长期的:系统关键位置从此可写,恶意软件的落脚点变多,某些需要完整保护的功能会不可用,而且这个状态会一直保持到你主动改回来。
man csrutil 只有一页,不解释具体保护范围。Apple 的公开文档里也没有任何与性能相关的表述——所以「关掉 SIP 让系统更快」这类说法没有依据,相关讨论见优化传言辨析。
唯一站得住的理由是:你要用的某个功能明确需要它,并且你接受这个交换。典型例子是 yabai 的部分窗口特性,见平铺窗口管理器——那篇文章列了哪些功能需要、哪些不需要,让你能只为真正想要的功能付代价。这与「为了不明确的收益关掉保护」是两回事。
门禁与公证:下载的东西可不可信
从互联网获得的文件带有隔离属性(见权限与扩展属性)。首次打开时,系统据此做一次检查:签名是否完整、是否经过 Apple 公证。
公证的准确含义:开发者把软件提交给 Apple,Apple 自动扫描已知恶意软件,通过后签发一张票据。它表示「扫描时没发现已知恶意代码」,不表示 Apple 审核过功能、认可数据处理方式,也不构成质量担保。
查看一个应用的签名:
sh
codesign -dv --verbose=4 /Applications/某个应用.appcodesign 是代码签名工具,-d 表示显示信息而非签名,-v 与 --verbose=4 控制详细程度。输出里 Authority= 几行是签名链——Developer ID Application: 某公司 说明是用 Apple 开发者身份签的。
评估它能否通过门禁:
sh
spctl --assess --verbose=4 /Applications/某个应用.app--assess 做一次策略评估。输出 accepted 表示通过,rejected 表示会被拦。这条命令能在双击之前就告诉你结果,排查时比反复双击看弹窗高效。
「任何来源」选项
spctl 有一个 --global-disable(旧名 --master-disable):
sh
sudo spctl --global-disable按 man spctl 的说法,它的作用是在「隐私与安全性」设置里显示出「任何来源」这个选项,而不是直接关闭检查。也就是说它只是把那个开关露出来,真正放行还需要你再去点。
不建议这么做。系统之所以默认藏起这个选项,是因为它把检查从「每个应用单独判断」降级成「全都不查」。需要运行某个未公证的软件时,正确做法是对那一个应用做例外处理——先确认来源可信,再按应用无法打开里的步骤操作。例外的范围只有那一个应用,而不是以后所有下载。
查询当前状态:
sh
spctl --status
spctl --disable-status前者查评估子系统是否启用,后者查「任何来源」选项是否已经被显示出来。
一张对照表
遇到问题时用它判断该往哪个方向查:
| 现象 | 涉及机制 | 往哪里看 |
|---|---|---|
| 提示「无法验证开发者」「已损坏」 | 门禁 / 公证 | 应用无法打开 |
改系统文件被拒,sudo 也不行 | 只读系统卷 + SIP | 目录结构与只读系统卷 |
访问桌面/邮件报 Operation not permitted | TCC | TCC 隐私授权 |
| 某个窗口管理功能不生效 | 可能确实需要 SIP 例外 | 平铺窗口管理器 |
命令行工具装不上、改不动 /usr | SIP(/usr/local 不受限) | 改用 Homebrew 前缀 |
第三行值得强调:TCC 的报错和 SIP 无关。把「关掉 SIP」当作隐私授权问题的解法,是最常见也最亏的一次误判。
检查结果
三条只读命令,记下各自的输出:
sh
csrutil status
spctl --status
codesign -dv --verbose=4 /System/Applications/Calculator.app 2>&1 | grep Authority第三条查系统自带计算器的签名链,2>&1 把 codesign 写到标准错误的输出合并进标准输出,以便 grep 处理。你应当看到 Apple 自己的签名机构。
动手练习
不改变任何安全设置,做一次对比:
- 用
codesign -dv --verbose=4分别检查一个 App Store 下载的应用和一个官网下载的应用,比较Authority=的差异。 - 用
spctl --assess --verbose=4评估这两个应用,确认都是accepted。 - 用
xattr -l看看这两个应用还带不带隔离属性——已经打开过的通常已被系统清除。 - 执行
csrutil status和spctl --status,把结果记在自己的设备笔记里。
成功标准是第 1 步:能说出 App Store 应用与官网应用的签名机构不同,以及这个差异意味着什么。之后再看到「先关掉安全检查再安装」的教程,你有能力判断那一步是否真的必要——多数时候都不必要。