如何在macO上禁用“无根”系统完整性保护(SIP)AKA [OS X]


156

苹果已经在OS X 10.11 El Capitan中引入了系统完整性保护,也称为“无根”。我了解这是针对恶意软件进行一般保护的步骤,但是作为开发人员,我需要对其锁定的某些文件具有写权限。

如何禁用此保护?


2
即使您可以修复所有SIP方面,也有很多条目要记住-请记住,通过破坏系统,您正在构建的东西可能无法在客户端计算机上运行,​​而SIP已打开,并且用户将不接受将其关闭
Motti Shneor '16

5
@Motti Shneor-但是,在某些情况下,仅出于拥有开发目的而具有安装某些SDK的写访问权限时,就需要关闭此功能。这将不需要客户端执行相同的操作。
defaultNINJA

我来自unix的背景,试图了解无根的逻辑:是因为计算机很可能是单用户计算机,所以所有内容都将安装在用户主目录中,因此无需弄乱系统目录例如/ usr / share / vim /。
Kemin Zhou

Answers:


147

Apple的文档包括禁用SIP,关于Mac上的系统完整性保护配置系统完整性保护

lifehacker.com上的一篇文章列出了以下步骤:

  1. 通过重新启动计算机并按住Command+ R直到屏幕上出现Apple徽标,将Mac重启到恢复模式。
  2. 单击实用程序>终端。
  3. 在“终端”窗口中,输入csrutil disable并按Enter
  4. 重新启动Mac。

您可以通过ls使用大写字母O(而不是零0)发出此命令来修改长列表标志,来验证文件或文件夹是否受到限制:

ls -lO /System /usr 

查找受限制的文本以指示在何处实施SIP。

默认情况下(=启用SIP),以下文件夹受到限制(请参阅Apple支持页面):

/System
/usr
/bin
/sbin
Apps that are pre-installed with OS X

...,以下文件夹是免费的:

/Applications
/Library
/usr/local

1
我从运行中看到ls -lO /usr/local未标记为受限。我也/usr/local/递归了。但是我一直看到根获得所有权/usr/local/bin/usr/local/share影响自制。这也是SIP的工作吗?
SaxDaddy 2015年

1
@SaxDaddy只要/usr/local不受限制,您可以轻松修复此目录“以下”的任何权限。Homebrew实际上建议运行sudo chown -R $(whoami) /usr/local(以管理员用户身份登录)以解决权限问题。
nohillside

4
@SaxDaddy您是否正在使用Sophos Anti-Virus?Sophos存在一个已知问题,它会更改这些目录的权限。根据其社区论坛上的一个帖子,应该在“很快”到期的更新中解决。
ND怪胎2015年

1
@NDGeek:+1:太好了,谢谢!您正确调用了它。而且我看到SAV 9.4.1(发行于18nov15)解决了该问题。我已安装该版本,并确认/usr/local现在已正确设置权限。
SaxDaddy 2015年

1
@andro -O标志在10.11.6 仍然有效。如果对您不起作用,那是一个单独的问题,您应该提出一个新问题。
Mike Scott

104

可以通过启动到Recovery HD并运行以下命令来禁用SIP :

csrutil disable

在此处输入图片说明

通过向csrutil enable命令添加一个或多个标志,也可以启用SIP保护并有选择地禁用其某些方面。所有这些都需要从Recovery启动才能进行设置:

启用S​​IP并允许安装未签名的内核扩展

csrutil enable --without kext

在此处输入图片说明

启用S​​IP并禁用文件系统保护

csrutil enable --without fs

在此处输入图片说明

启用S​​IP并禁用调试限制

csrutil enable --without debug

在此处输入图片说明

启用S​​IP并禁用DTrace限制

csrutil enable --without dtrace

在此处输入图片说明

启用S​​IP并禁用写入NVRAM的限制

csrutil enable --without nvram

在此处输入图片说明

我也有一个帖子,提供有关SIP的更多信息:

系统完整性保护–为Apple的安全模型增加了另一层


5
多么令人欢迎的丰富知识。我可能必须加倍
享受

我收到一个错误:csrutil: failed to modify system integrity configuration. This tool needs to be executed from the Recovery OS.
IgorGanapolsky '16

5
@IgorGanapolsky阅读答案。通过启动到Recovery HD禁用SIP
Brick

13

如果目标是实际上只是禁用系统完整性保护,那么按照上述其他答案中先前建议的方式,通过引导时的Command+ 引导进入Recovery HD分区并不是最快的方法。r

您可以将单用户模式启动与恢复高清启动结合使用,而未公开的启动键组合为:

这让你刚进入所需要的这种最低限度的环境直接


7

修改会更安全,/etc/paths因为这/usr/local/bin只是之前usr/bin。这样,您就可以在/usr/local/bin不禁用SIP的情况下完成开发工作。

/etc/paths自El Capitan以来,操作系统的全新安装一直以这种方式订购,但是如果您要从优胜美地或更早的版本升级操作系统,则必须手动修改路径顺序。


@iconoclast在El Capitan之前,一个常见的约定是将程序安装到usr/bin。由于SIP现在阻止了此操作,因此应将程序安装到usr/local/bin,不受SIP的限制。通过将usr/local/bin第一,用户无需输入了绝对路径程序运行的程序。这有意义吗?您是否对其他事情感到困惑?
user260467 '18

我一直认为将任何东西放进去都是很不好的做法,/usr/bin但是我想我应该问的是“这如何回答OP的问题?” 原本我是假设它确实在某些方面,而我只是没有进行连接。但是现在我非常怀疑它是否有任何联系。
iconoclast

@iconoclast我认为不向开发人员提及他们确实不应该仅仅为了开发应用程序而禁用SIP是不负责任的。
user260467 '18

6

如果您只需要访问/ usr / local,请看此页面:https : //github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/El_Capitan_and_Homebrew.md

这个想法是使用,add ,使用chflags 暂时禁用SIP来将该目录设置为非限制csrutil disable/usr/local

 sudo mkdir /usr/local && sudo chflags norestricted /usr/local && sudo chown -R $(whoami):admin /usr/local

然后使用重新启用SIP csrutil enable

如果/usr/local在升级时已经存在,则甚至不需要上述操作。您可以简单地运行

sudo chown -R $(whoami):admin /usr/local

我不断收到错误消息:Read-only file system
IgorGanapolsky '16

该链接无效:404错误。
iconoclast

2

如果您无法进入恢复分区运行csrutil disable(以禁用SIP),请尝试使用nvram命令设置启动参数,例如

sudo nvram boot-args="rootless=0"

但是,如果出现以下错误:

nvram:错误设置变量-'boot-args':(iokit / common)不允许

那就行不通了 您仍然需要启动它的恢复/安全模式。

看到:


nvram: Error setting variable - 'boot-args': (iokit/common) not permitted
mghicks

1
@mghicks在这种情况下,它将不起作用。我已经更新了答案。
kenorb

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.