在 OS X 10.11 中引入的 Rootless
即使是root用户,将无法对以下路径有写和执行权限:
/System/bin/sbin/usr (except /usr/local)
- 禁止直接对
/System
,/bin
,/sbin
,/usr
目录的修改(/usr/local
目录除外). 只有通过苹果开发者认证的 app 才有权限对其修改. - 禁止注入系统进程. 某些需要注入系统进程(finder, messages 等等系统级别的进程)的程序, debugger 无法使用了.
- 禁止加载内核扩展(kexts), 除非它们被苹果开发者正确的签名
这些修改最明显的好处就是: 恶意 app 无法通过用户授权的方式从而获得所有系统权限了.
当然, 它带来的副作用也是巨大的, 一些合法的 app 也无法获得系统权限了. 比如: Homebrew, CocoaPods 以及所有需要在 /usr/bin
目录下有可执行权限的 app.
定义问题
Rootless讨论的前提是假定root账户是OS X(或者其他Unix系统)中对抗恶意程序保护操作系统的最后一道防线。意思是一个应用程序一旦获得了root账户权限,将会获得系统的无限的权限。就可以进行实时修改、修改磁盘、替换任何系统文件等。
目前,许多传统的Unix操作系统中,root账户都是被强密码保护着的。这里的问题在于大部分的OS X系统基本上是单用户系统,也就是不存在单独的root账户密码,root密码就是管理员账户的密码。简单来说,苹果通过以下途径来获取root权限:
<img src="https://pic2.zhimg.com/15a4cc6d3d9c2cba183ad6897a39028d_b.jpg" data-rawwidth="865" data-rawheight="537" class="origin_image zh-lightbox-thumb" width="865" data-original="https://pic2.zhimg.com/15a4cc6d3d9c2cba183ad6897a39028d_r.jpg">大部分用户会毫不犹豫的输入密码,都不会想他们到底授权了什么行为。更重要的是,授权给了什么应用程序。可以说,对于一般的无经验用户,他们没有时间和专业知识来考虑这个问题。他们不会意识到他们一旦输入了密码,请求的进程就会获得root权限。
什么是系统集成保护(System Integrity Protection)?
使用了系统集成保护,苹果决定第三方应用有一些永远不会被允许的事情。从某些层面来讲,这种保护和iOS更像了。第三方应用相比起来更受限制。这就是rootless一词的由来,系统在某种程度上限制了管理员账号的权限。
rootless特性使得某些操作只有苹果的应用可以被许可(通过代码签名来判断)。所以第三方应用即使是运行在root权限中,有一些操作也无法完成。在我的测试中我注意到了以下几点:
- /System文件夹下的所有文件都不能被苹果应用意外的程序修改(例如各种安装器和升级部件)
- 当前的API例如task_for_pid不能在系统进程下被调用了。这意味着以前注入系统进程(Finder、Messages或者系统内核)的程序都不能用了。
- 有意思的是,rootless依然允许已签名的KEXT内核拓展被载入。问题是KEXT可以进行许多无限制的系统及操作。
总结
Rootless机制的目的很明显是改进安全性和可靠性,使得恶意软件以及木马很难渗透进系统。我很确信他将成为许多恶意软件开发者的一个挑战,不过我也很确定人们会发现这一机制很多薄弱的环节。
这个特性对于一些合法的软件有很多副作用。对此,苹果提供了一种方法使得用户可以关闭这个特性,但这需要用户以恢复模式启动(开机按住Command+R)
如果想了解更多,可以参考苹果的WWDC session视频。
解决办法
将Rootless修改成了,enable,所以我们需要关掉它, 重启电脑
按住 Command + R,进入到恢复界面
打开Terminal终端,然后输入 csrutil disable 如果想改回来,将disable改成enable即可