跳转到内容

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/某个应用.app

codesign 是代码签名工具,-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 permittedTCCTCC 隐私授权
某个窗口管理功能不生效可能确实需要 SIP 例外平铺窗口管理器
命令行工具装不上、改不动 /usrSIP(/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 自己的签名机构。

动手练习 ​

不改变任何安全设置,做一次对比:

  1. 用 codesign -dv --verbose=4 分别检查一个 App Store 下载的应用和一个官网下载的应用,比较 Authority= 的差异。
  2. 用 spctl --assess --verbose=4 评估这两个应用,确认都是 accepted。
  3. 用 xattr -l 看看这两个应用还带不带隔离属性——已经打开过的通常已被系统清除。
  4. 执行 csrutil status 和 spctl --status,把结果记在自己的设备笔记里。

成功标准是第 1 步:能说出 App Store 应用与官网应用的签名机构不同,以及这个差异意味着什么。之后再看到「先关掉安全检查再安装」的教程,你有能力判断那一步是否真的必要——多数时候都不必要。

返回系统内部