admin 发表于 15/9/14 20:18:45

Clover更新SIP配置方法简要说明 Apple SIP/Rootless安全技术介绍...

提醒:Clover 3250 版起,自行加入以下参数到 config.plist,关闭 SIP 部分功能。key>RtVariables</key>
    <dict>
      <key>BooterConfig</key>
      <string>0x28</string>
      <key>CsrActiveConfig</key>
      <string>0x67</string>
    </dict>SIP配置方法简要说明

Apple在10.11中全面启用了名为System Integrity Protection (SIP)的系统完整性保护技术。受此影响,未经签名的第三方kext及经过修改的原版kext将无法正常加载,大部分系统文件即使在root用户下也无法直接进行修改。如何配置以及关闭这些限制?简明解决方案如下:
1. Clover用户请更新至3258及以上版本,并在config.plist中加入如下参数:<key>RtVariables</key>
      <dict>
                <key>CsrActiveConfig</key>
                <string>0x13</string>
      </dict>2. 变色龙Enoch分支用户请更新至2754及以上版本,并在配置文件org.chameleon.Boot.plist中添加参数:<key>CsrActiveConfig</key>
<string>19</string>3. Ozmosis/白果用户,如也需要使用第三方未签名kext或修改系统原版kext,可进入恢复分区并使用官方的csrutil命令行工具修改SIP配置:csrutil enable --without kext --without fs4. 如何确定已经当前SIP的开关状态?可在终端中使用官方的csrutil命令行工具进行查询csrutil status如输出结果中包含有如下字段,那么上面的配置也就已经起作用了:
Kext Signing: disabled
Filesystem Protections: disabled
另外,从DB5/PB3开始,rootless=0以及kext-dev-mode=1启动参数已经被废除,请不要再使用。

如只希望得到一个简明的解决方法,那么本文到此已经结束;如需了解SIP/Rootless更深入的一些相关内容,或需要自由定制SIP中各项技术的开关(即上面添加参数的具体含义),以及更多可行的配置SIP的方法,请继续往下阅读正文部分。


## 正文部分 ##

之前已经有相关消息(传送门),Apple会在iOS 9以及10.11中引入新的安全技术来阻止对关键系统文件的修改操作。这项技术被称为"Rootless",官方命名为"System Integrity Protection (SIP)"。此项技术主要是用于限制root用户的权限,以提升系统的安全性。然而,这项原本设计应用于iOS的技术,在10.11中同样得到了应用,且该技术包含的保护措施远不仅仅只是限制对关键系统文件的修改。
下面是对SIP在文件系统保护上的一些简单测试,目前可行的关闭方法以及相关原理的分析。

I. 征兆以及来自Apple官方的说明

以下是Apple在10.11 Developer Beta 1 Release Notes中的说明:Installation
Note
After upgrading to OS X v10.11 Developer Beta, applications that write to protected/system locations may no longer function correctly.
在升级到OS X v10.11开发者测试版后,那些有对受保护的/系统目录进行写入操作的应用程序可能无法正常工作。

Disk Utility
Note
System file permissions are automatically protected, and updated during Software Updates. The Repair Permissions function is no longer necessary.
系统文件的权限被自动保护,并会在软件更新时进行更新。磁盘工具中的修复权限功能已经不再需要。如此看来,El Capitan中全新设计的磁盘工具恐怕并非仅仅主要是UI层面的更新。DB2之后原先在diskutil工具的命令行参数中提供的权限修复的功能也已经废除。
那么,SIP到底是什么?且看看下面Apple的官方说明:

更新来自Apple官方的说明
根据Apple官方提供的针对开发者的相关介绍资料,列出几项关键内容:
1. 此项技术已被Apple官方命名为"System Integrity Protection (SIP)",即系统完整性保护。
2. SIP技术的整个体系主要分为文件系统保护,运行时保护,内核扩展签名。
-> 文件系统保护(Filesystem protection),直观表现为下面II和III部分进行的测试,即对关键系统文件通过沙盒层限制root权限。
-> 运行时保护(Runtime protection),主要表现在SIP开启的状态下,受保护的关键系统进程在执行状态下无法被进行代码注入,挂调试器调试,限制内核调试等等。
-> 内核扩展签名(Kext signing),此项从10.9开始已经引入,10.10中发展为强制要求签名。现已作为SIP的一部分进行部署。从DB5开始,"kext-dev-mode=1"的启动参数已经被废除。官方要求第三方kext必须被安装至/Library/Extensions。
3. 从DB5开始,"rootless=0"的启动参数已经被废除,此参数原本可用于完全关闭整个SIP保护体系。当前关闭SIP的方法请参考下面的IV部分内容。


II. SIP开启状态下的测试(文件系统保护部分)

获取root权限后,尝试对受保护的系统文件进行修改:
以AppleHDA.kext为例。

可以看到,系统已经对此关键系统文件进行了保护,修改拥有者(chown),权限(chmod),移除(rm/unlink),移动(mv)等相关修改操作均会被拒绝。


III. 系统是如何限制root对关键系统文件进行修改的?

相关的发现:新增的rootless权限位以及基于沙盒技术的应用。
还是以AppleHDA.kext为例。

通过xattr或ls -lO命令查询其扩展权限可知,com.apple.rootless权限位已经被设置(系统安装时建立此权限位),且无法去除。此权限位出现在了几乎整个系统文件目录结构上(具体有哪些目录受到保护可参见/System/Library/Sandbox/rootless.conf)。且在关键系统文件拷贝至非保护目录时,该权限位无法被复制(deny forbidden-rootless-xattr),会自动进行去除。
进行上述相关操作时的系统日志:
l
修改文件所有者(chown) -> 通过沙盒指令file-write-owner -> 拒绝操作
修改文件权限(chmod) -> 通过沙盒指令file-write-mode -> 拒绝操作
删除/移动文件(rm) -> 沙盒指令file-write-unlink -> 拒绝操作
可以看到,沙盒在这里起到了关键的作用(通过沙盒shell层提供的指令限制root权限)。SIP应该正是基于沙盒技术来得以实现的。


IV. 如何关闭/临时绕过SIP保护技术?

1. [临时绕过] 进入10.11的安装程序或Recovery HD,使用其中所带的终端进行相关操作。在此环境下,由于特殊启动标志位的存在,整个SIP保护技术处在完全关闭状态。可正常修改受保护文件的权限以及所有者。

2. [已经失效] 根据Apple目前开放的bsd内核部分源码,内核临时提供有"rootless=0"参数用于关闭此安全机制。若要完全关闭SIP,可在启动参数(boot-args)中添加"rootless=0"。此参数从DB5/PB3开始已经被废弃使用,请勿再尝试。

3. [不推荐] 经测试,如果进入之前版本的系统,例如10.10,可以对挂载的10.11分区上的系统文件进行修改操作。但可能因为rootless权限位的存在,文件所有者无法正常修改。如果是对kext操作,将导致修改后的kext无法加载。

4. [完全/部分关闭] [官方方案] Apple已经提供了csrutil程序来配置SIP,原Security Configuration图形化程序已经被移除。此程序在正常系统环境下只支持检查当前SIP开关状态,若需要开关或调整SIP状态必须前往Recovery或安装程序中执行。
注意:对于白果/Ozmosis,请直接使用此官方工具来配置SIP;若使用Clover >= 3250版/Chameleon >= 2754版,请不要再使用此工具进行设置。该工具修改SIP配置的功能仅在部分原生支持NVRAM写入的机子上有效。
csrutil命令行工具使用方法:
-> 启用SIP(csr-active-config=0x10):

csrutil enable也可添加更多参数实现按需开关各项保护技术csrutil enable [--without kext|fs|debug|dtrace|nvram] [--no-internal]-> 禁用SIP(csr-active-config=0x77):csrutil disable等效命令:

csrutil enable --without kext --without fs --without debug --without dtrace --without nvram-> 清除SIP标志位(将csr-active-config项从NVRAM中移除,等同于SIP完全开启):csrutil clear-> 检查并报告当前SIP开关详细状态,具体可见VI部分:csrutil status-> 更多其他功能,例如netboot参数,report参数等。
只能通过Recovery或安装程序环境来控制SIP开关已确定是Apple提供的关闭SIP技术的标准方法。未来此程序可能还会更新提供更为丰富的功能。

5. [部分/完全关闭] [引导器支持]
-> 变色龙的Enoch分支(版本>=2754)已经初步完成对于SIP的支持。该分支版本在默认状态下仅关闭了kext加载限制(csr-active-config=0x1),SIP/Rootless体系中其余所有的保护机制仍处在开启状态,例如前文测试的文件系统保护。如需对其他保护机制进行开关,可在配置文件org.chameleon.Boot.plist中添加参数:<key>CsrActiveConfig</key>
<string>19</string>注意,与下面Clover不同的是,需要填入的值为十进制,请自行换算,例如19(=0x13)。此标志位的具体含义请参照本部分最后的解析,可按需修改。注入完成重启之后可使用VI部分中提到的方法检查注入是否有效。
-> Clover版本(>=3250)也已经初步完成对于SIP的支持,可以通过在配置文件config.plist中添加CsrActiveConfig参数来自由设置SIP控制标志位,或使用最新版Clover Configurator设置。如不设置此条目Clover会默认使用0x67(不推荐使用此默认值):

<key>RtVariables</key>
      <dict>
                <key>CsrActiveConfig</key>
                <string>0x13</string>
      </dict>其中SIP控制标志位值的具体含义可参照本部分最后的标志位解析,可按需修改,注入完成重启之后可使用VI部分中提到的方法检查注入是否有效。BooterConfig启动标志位值的含义也可参照下方解析部分,但目前支持尚不完善,可以不添加。

6. [部分/完全关闭] [其他第三方程序]
这类程序严格来说应该限制其仅能够在Recovery环境下使用,如在正常系统环境中仅凭root权限即可关闭SIP,那么整个SIP保护体系也就失去了其存在的意义了。因此建议使用官方的csrutil工具来进行操作。
这里提供一个可查看并自由设置SIP各项保护技术开关的小程序,感谢作者@cvad,原帖:传送门

注意:该工具仅在部分原生支持NVRAM写入的机子上有效,Ozmosis/白果用户可选择使用。若使用Clover >= 3250版/Chameleon >= 2754版,请不要再使用此工具进行设置。再有,此程序无需依赖Recovery环境,please use with caution.

7. [部分/完全关闭] [手动注入NVRAM数据]
[*]/*
[*]* 目前Clover/Chameleon引导器已经更新支持SIP管理,
[*]* 部分机器也可直接使用官方csrutil工具关闭SIP,
[*]* 下面的手动注入NVRAM数据方法仅供特殊情况时使用。
[*]*/

如有需要也可手动注入相关的NVRAM参数(csr-active-config)来关闭SIP,达到与上面使用官方工具或使用新版引导器一样的效果。目前可行的办法:
-> 若是被OS X原生支持NVRAM的机子,可使用旧版本OS X(10.9及更早版本)中的nvram工具改写NVRAM中的数据,具体可参考d1ves的帖子。启动旧版本的OS X(10.9及更早版本)后,可在终端中输入sudo nvram csr-active-config=%77%00%00%00来直接添加。
Q: 何谓原生支持NVRAM?
A: 主板支持UEFI,且不依赖Clover提供的EmuVariableUefi即可正常读写NVRAM(即不需要依赖Clover的rc.scripts或变色龙的FileNVRAM模块来模拟NVRAM保存);如使用Ozmosis则应该都支持。
Q: 为何无法直接在10.10或10.11用nvram命令添加/修改此NVRAM字段?
A: Apple在10.10中即开始构建SIP体系,只是并未完全启用。因此10.10及以上版本中的nvram程序限制了对相关NVRAM数据的操作。
-> 若是需要依赖Clover的rc scripts来模拟NVRAM保存,例如仅支持传统BIOS的设备,也可在/nvram.plist文件中直接注入上述参数。
-> 使用其他能修改NVRAM数据的工具来自行添加此字段。

{SIP自定义配置及各标志位的含义}
根据Apple开放的部分源码,SIP/Rooless体系中的各项安全技术的控制标志位保存在NVRAM且在启动时被读取,提供在Recovery中的csrutil程序本质上也是修改这些标志位(csr-active-config=0x77)。设置合适的标志位即可任意开关需要的保护技术。这部分具体的分析可参考本人的blog:传送门
或是下面的中文版本:
举例:
-> Raw Data: csr-active-config=0x77
0x77 = 1110111
每个标志位的含义,上方从右至左7个标志位以B0-B6表示:
B0: 允许加载不受信任的kext(与已被废除的kext-dev-mode=1等效)
B1: 解锁文件系统限制
B2: 允许task_for_pid()调用
B3: 允许内核调试 (官方的csrutil工具无法设置此位)
B4: Apple内部保留位(目前看来无实际作用,设置与否均可。csrutil默认会设置此位。)
B5: 解锁dtrace限制
B6: 解锁NVRAM限制
把需要关闭的安全保护技术标志位设置为1即可。非开发者一般仅需要关心B0和B1位。
更多示例及建议值:
-> Clover(需要修改原版kext但未使用kextpatch)/Chameleon用户,建议仅解锁kext加载和文件系统限制:
csr-active-config=0x13 (csrutil enable --without kext --without fs) - 此配置对于大部分非白果用户适用
-> Clover(已正确配置kextpatch对原版kext进行修改),建议仅解锁kext加载限制:
csr-active-config=0x11(csrutil enable --without kext)
-> Clover(依赖Kext注入功能+已经正确配置kextpatch对原版kext进行修改)/Ozmosis/白果,可完全开启SIP:
csr-active-config=0x00/0x10(csrutil enable [--no-internal] 或 curutil clear)
注:部分kext无法通过Clover的kext注入来正常工作,例如AppleHDA Injector,CodecCommander.kext等。
-> 关闭SIP中的所有防护,不推荐:
csr-active-config=0x7f
在非必要的情况下,不要把提供的这些保护全部关闭,也尽量避免使用Clover默认注入的0x67参数。

至于系统启动标志位,即Clover的config.plist中BooterConfig的含义:
举例:
-> Raw Data: BooterConfig=0x28 (此为Clover配置文件中提供的默认值)
0x28 = 00101000
每个标志位的含义,上方从右至左8个标志位以B0-B7表示:
B0: 遇到内核崩溃自动重启
B1: 在启动过程中使用HiDPI模式显示
B2: 在启动过程中不显示进度条
B3: CSRActiveConfig
B4: CSRConfigMode
B5: CSRBoot,默认用于Recovery/安装环境
B6: 在启动过程中使用黑色背景
B7: 在启动过程中使用登陆界面作为背景
把需要的打开的启动标志位设置为1即可。目前BooterConfig设置在Clover下可能不会起作用。建议可以保持默认值或不在config.plist中添加此项,等待Clover的后续更新。


V. SIP对于现今Kext安装的影响

这方面的影响主要体现在强制kext签名以及文件系统保护2个方面:
1. kext签名保护:kext-dev-mode=1已经废除,请参照上面IV部分来配置SIP控制标志位以关闭kext加载限制。Clover的kext注入功能也可绕过签名检测从而强制加载第三方kext,但部分kext使用注入功能可能无法正常工作,例如AppleHDA Injector,CodecCommander.kext等。
2. 文件系统保护:"/System/Library/Extensions"目录位于保护列表中,无法对其中的原版kext进行直接修改。Apple要求第三方Kext推荐安装至"/Library/Extensions",此目录并不在保护列表中,可在root权限下自由操作。若有需要对SLE下原版kext进行修改操作可通过充分利用Clover Kextpatch/kext Injector等技术实现。
另外,d1ves的帖子中提到了"/System/Library/Extensions/IONetworkingFamily.kext/Contents/PlugIns/"此目录同样不在rootless的保护目录中,因此也可以尝试在此目录中放置需要的第三方kext。
注意:由于10.11中的磁盘工具已经去除了权限修复功能,若需要对整个系统盘权限进行修复,除手动命令操作外,推荐使用neycwby09写的RepairPermissions工具来完成,其他第三方工具中提供的修复全盘权限功能目前应该均无实际作用。


VI. 如何确定当前的SIP开关状态

请先正确配置SIP的控制标志位,具体方法请参照上方IV部分。
配置完SIP后,如何确定系统当前已经关闭了哪些安全保护技术呢?
在DB7中,Apple已经更新了csrutil命令行工具,该工具已经可以支持输出详细的SIP各项保护技术的开关状态。
如需要查询当前的SIP保护开关详细状况,可在终端中输入:
csrutil status

执行之后该工具将返回详细的报告,例如:
System Integrity Protection status: enabled (Custom Configuration).

Configuration:
      Apple Internal: enabled
      Kext Signing: disabled
      Filesystem Protections: enabled
      Debugging Restrictions: enabled
      DTrace Restrictions: enabled
      NVRAM Protections: enabled

This is an unsupported configuration, likely to break in the future and leave your machine in an unknown state.

=== 下面的方法为旧内容,仅供参考 ===
1. 手动检测:可通过终端命令ioreg -lx -p IODeviceTree | grep csr-active-config来查看已经注入到NVRAM中的SIP控制标志位数据,而后换算并根据IV部分给出的各项标志位含义可获知当前各项保护技术的开关状态。
2. 自动检测:写了一个简单的kext,该kext加载后会在日志中输出已经被关闭的保护技术列表以前目前设置的启动标志位。若感兴趣可下载使用。
使用方法:
a. 请先根据自己的需要配置好SIP控制标志位(csr-active-config),至少需要关闭kext加载限制,否则将无法加载此kext。
b. 下载脚本:
c. 解压并双击运行脚本,此脚本会自动从本人的Github下载需要的kext,并在加载完成之后自行卸载删除,无需额外安装,绿色环保无污染。
d. 查看控制台窗口或内核日志中的输出结果。若有读取到当前生效的SIP控制标志位(csr-active-config)及启动标志位,则会有类似下面的日志输出:

注意:使用前请去除已经失效的rootless=0启动参数;另外,若提示无法运行脚本请自行设置此脚本文件的可执行权限;日志中显示的LenovoY450字段可忽略,本kext最早是为Y450开发的。


VII. 安全 vs 便利?

安全往往是以牺牲便利性与一定的自由度为代价的。但安全与封闭不应划上等号。SIP技术已经内建于内核,作为OS X新的系统安全策略的重要部分。从10.9引入kext签名机制 -> 10.10强制要求kext签名 -> 10.11完整的SIP体系,不难看出,Apple在其OS X上构建的许多安全机制,已经成为OS X体系中的重要一环。

liudew 发表于 15/9/21 13:54:36

感谢楼主{:7_240:}

liufeng0m 发表于 15/12/25 11:24:02

好像有一点点明白了

m4wayne 发表于 18/6/14 15:11:18

好文,难得一见。说清楚了到底什么是SIP,以及clover等怎么设置{:7_258:}
页: [1]
查看完整版本: Clover更新SIP配置方法简要说明 Apple SIP/Rootless安全技术介绍...