ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[更新SIP配置方法简要说明] Apple SIP/Rootless安全技术介绍+测试分析及配置方法

2021-11-13 10:33:08  阅读:346  来源: 互联网

标签:Clover SIP Apple kext ____ 保护 Rootless bit


SIP配置方法简要说明

Apple在10.11中全面启用了名为System Integrity Protection (SIP)的系统完整性保护技术。最直接的影响是:许多未经签名的第三方kext以及经过修改的原版kext将无法加载使用;大部分系统文件即使在root用户下也无法直接进行修改。如何配置以及关闭这些限制?这里先给出一些较为通用的解决方案(仅关闭SIP中的文件系统保护和kext加载限制):
1. Clover用户请更新至3258及以上版本,并在config.plist中加入如下参数:

  1. <key>RtVariables</key>
  2.         <dict>
  3.                 <key>CsrActiveConfig</key>
  4.                 <string>0x13</string>
  5.         </dict>
复制代码

从Clover 3729版本起,也可直接在Clover界面菜单中选择需要关闭的保护技术。
2. 变色龙Enoch分支用户请更新至2754及以上版本,并在配置文件org.chameleon.Boot.plist中添加参数:

  1. <key>CsrActiveConfig</key>
  2. <string>19</string>
复制代码

3. Ozmosis/白果用户,如也需要使用第三方未签名kext或修改系统原版kext,可进入Recovery分区或安装程序环境并使用官方的csrutil命令行工具修改SIP配置:

  1. csrutil enable --without kext --without fs
复制代码

4. 如何确定已经当前SIP的开关状态?可在终端中使用官方的csrutil命令行工具进行查询:

  1. csrutil status
复制代码

如输出结果中包含有如下字段,那么上面的配置也就已经起作用了:

Kext Signing: disabled
Filesystem Protections: disabled


5. 从10.11 DB5/PB3版开始,rootless=0以及kext-dev-mode=1启动参数已经被废除,请不要再使用。第三方kext推荐安装至/Library/Extensions/,尽量避免对SLE下的原版kext进行直接修改。

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



## 正文部分 ##

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

I. 征兆,以及来自Apple官方关于SIP的说明

首先请看一段摘自10.11 Developer Beta 1 Release Notes的说明,其中Apple隐约地提到了有关文件系统管理的一些变化:

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工具的命令行参数中提供的权限修复的功能也已经废除。

这些说明背后的深层次含义到底是什么?

通过Apple提供给开发者的相关介绍资料,能够总结出如下几项关键内容:
1. 在10.11中,Apple启用了一套关键的安全保护技术体系,其官方命名为"System Integrity Protection (SIP)",即系统完整性保护。
2. SIP技术的整个体系主要分为文件系统保护,运行时保护,内核扩展签名。
-> 文件系统保护(Filesystem protection),即对关键系统文件通过沙盒层限制root权限。上面给出的DB1发布说明中的相关表述也正是基于此项保护技术。简单的测试和分析可见下方II和III部分。
-> 运行时保护(Runtime protection),主要表现在SIP开启的状态下,受保护的关键系统进程在执行状态下无法被进行代码注入,挂调试器调试,以及限制内核调试等等。简单的测试可见下方II部分。
-> 内核扩展签名(Kext signing),此项从10.9开始已经引入,10.10中发展为强制要求签名。现已作为SIP的一部分进行部署。而从DB5开始,10.10中支持的"kext-dev-mode=1"的启动参数也被废除。官方要求第三方kext必须被安装至/Library/Extensions,且在文件系统保护开启状态下不允许对SLE下的原版kext进行任何修改。
3. 从DB5开始,"rootless=0"的启动参数已经被废除,此参数在早期的10.11测试版本中可用于完全关闭整个SIP保护体系。当前配置SIP的详细方法请参考下面的IV部分内容。


II. SIP开启状态下的测试及分析

以下测试均在已获取root权限状态下进行。
1. 文件系统保护(Filesystem protection)
尝试对受保护的系统文件进行修改,以AppleHDA.kext为例:

可以看到,系统已经对此关键系统文件进行了保护,修改拥有者(chown),权限(chmod),移除(rm/unlink),移动(mv)等相关修改操作均会被拒绝。
实现原理简单分析:新增的rootless entitlement,白名单,以及基于沙盒技术的实现。
还是以AppleHDA.kext为例。

通过查询其扩展属性可知,名为com.apple.rootless的特殊属性已经被设置,在文件系统保护开启状态下无法去除。具体有哪些目录受到保护可参见/System/Library/Sandbox/rootless.conf。
进行上述相关操作时的系统日志:
l
修改文件所有者(chown) -> 通过沙盒操作file-write-owner进行决策 -> 拒绝操作
修改文件权限(chmod) -> 通过沙盒操作file-write-mode进行决策 -> 拒绝操作
删除/移动文件(rm) -> 通过沙盒操作file-write-unlink进行决策 -> 拒绝操作
可以看到,沙盒技术在文件系统保护的实现上起到了关键的作用。
文件系统保护的例外名单,此名单会在后台静默升级:
/System/Library/Sandbox/Compatibility.bundle/Contents/Resources/paths

2. 运行时保护(Runtime protection)
尝试用调试器挂Finder进程:

可以看到,由于SIP存在,无法对系统保护的进程进行调试。
尝试对launchd进程(pid==1)调用task_for_pid()函数:

可见,系统已经限制了对于系统进程调用task_for_pid()
尝试用dtrace命令产生一个kernel panic:

经测试可知,系统已经对内核以及系统组件的部分dtrace功能进行了限制。
另外,SIP也对系统级的后台服务,例如kextd,进行了保护,无法通过launchctl来将其停止运行。


III. 如何对SIP保护技术进行配置?

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

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

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

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

  1. csrutil enable
复制代码

也可添加更多参数实现按需开关各项保护技术:

  1. csrutil enable [--without kext|fs|debug|dtrace|nvram|basesystem] [--no-internal]
复制代码

-> 禁用SIP(csr-active-config=0x77):

  1. csrutil disable
复制代码

等效命令:

  1. csrutil enable --without kext --without fs --without debug --without dtrace --without nvram
复制代码

-> 清除SIP标志位(将csr-active-config项从NVRAM中移除,等同于SIP完全开启):

  1. csrutil clear
复制代码

-> 检查并报告当前SIP开关详细状态,具体可见VI部分:

  1. csrutil status
复制代码

-> 更多其他功能,例如netboot参数,report参数等。
只能通过Recovery或安装程序环境来控制SIP开关已确定是Apple提供的关闭SIP技术的标准方法,也符合SIP设计及存在的意义。未来此程序可能还会更新提供更为丰富的功能。

5. [引导器支持] 本条对于大部分非白果适用。目前主流的引导器均已经支持SIP状态设置。
-> 变色龙的Enoch分支(版本>=2754)已经初步完成对于SIP的支持。该分支版本在默认状态下仅关闭了kext加载限制(csr-active-config=0x1),SIP/Rootless体系中其余所有的保护机制仍处在开启状态,例如前文测试的文件系统保护。如需对其他保护机制进行开关,可在配置文件org.chameleon.Boot.plist中添加参数:

  1. <key>CsrActiveConfig</key>
  2. <string>19</string>
复制代码

注意,与下面Clover不同的是,需要填入的值为十进制,请自行换算,例如19(=0x13)。此标志位的具体含义请参照IV部分的解析,可按需修改。注入完成重启之后可使用VI部分中提到的方法检查注入是否有效。
-> Clover版本(>=3250)也已经初步完成对于SIP的支持,可以通过在配置文件config.plist中添加CsrActiveConfig参数来自由设置SIP控制标志位,或使用最新版Clover Configurator设置。如不设置此条目Clover会默认使用0x67(不推荐使用此默认值):

  1. <key>RtVariables</key>
  2.         <dict>
  3.                 <key>CsrActiveConfig</key>
  4.                 <string>0x13</string>
  5.                 <key>BooterConfig</key>
  6.                 <string>0x49</string>
  7.         </dict>
复制代码

从Clover 3729版本起,也可直接在Clover界面菜单中选择需要关闭的保护技术。

其中各SIP标志位的具体含义可参照IV部分的解析,可按需修改,注入完成重启之后可使用VI部分中提到的方法检查注入是否有效。BooterConfig启动标志位值的含义也可参照下方解析部分。

6. [已失效] [第三方程序] 谨慎使用。
这类程序严格来说应该限制其仅能够在Recovery环境下使用,如在正常系统环境中仅凭root权限即可关闭SIP,那么整个SIP保护体系也就失去了其存在的意义了,由此可能对普通用户造成不必要的安全风险。因此如无特别需要请尽量避免使用。
这里提供一个可查看并自由设置SIP各项保护技术开关的小程序,感谢作者@cvad,原帖:传送门

相关的实现原理?可参照下方手动注入NVRAM数据部分。
注意:该工具仅在部分原生支持NVRAM写入的机子上有效,Ozmosis/白果用户可选择使用。若已使用Clover >= 3250版/Chameleon >= 2754版配置SIP,请不要再使用此工具进行设置。再有,此程序无需依赖Recovery环境,please use with caution.

7. [手动注入NVRAM数据]

  1. /*
  2. * 目前Clover/Chameleon引导器已经更新支持配置SIP,
  3. * 原生支持NVRAM读写的机器也可直接使用官方csrutil工具配置SIP,
  4. * 下面的手动注入NVRAM数据方法仅供特殊情况时使用。
  5. */
复制代码

这里提供几种手动注入相关的NVRAM参数(csr-active-config)来配置SIP的方法,效果与官方工具或使用新版引导器一致。
-> [已失效] 若是被OS X原生支持NVRAM的机子,可使用nvram命令改写NVRAM中的数据:

  1. sudo nvram 7C436110-AB2A-4BBB-A880-FE41995C9F82:csr-active-config=%13%00%00%00
复制代码

具体也可参考d1ves的帖子。此操作无需在Recovery环境中进行,未来版本的系统也有可能会对其进行限制,请谨慎使用。
Q: 何谓原生支持NVRAM?
A: 主板支持UEFI,且不依赖Clover提供的EmuVariableUefi即可正常读写NVRAM(即不需要依赖Clover的rc.scripts或变色龙的FileNVRAM模块来模拟NVRAM保存);如使用Ozmosis则应该都支持。
-> 若是需要依赖Clover的rc scripts来模拟NVRAM保存,例如仅支持传统BIOS的设备,也可在/nvram.plist文件中直接注入上述参数。注意数值上需要进行base64转换。
-> 使用其他能修改NVRAM数据的工具来自行添加此字段。
-> 通过对AppleEFINVRAM打补丁来破解/绕过对于NVRAM相关属性的修改限制。


IV. SIP相关标志位解析

根据Apple开放的部分源码,SIP/Rooless体系中的各项安全技术的控制标志位保存在NVRAM中以实现持久化状态储存,提供在Recovery中的csrutil程序本质上也是修改这些标志位(csr-active-config)。设置合适的标志位即可任意开关需要的保护技术。这部分具体的分析可参考本人的blog:传送门
或是下面的中文版本:
举例:
-> Raw Data: csr-active-config=0x13
0x0013 = 0b 00000000 00010011
每个标志位的含义,上方从右至左8个标志位以bit 0 - bit 7表示:

  1. ___ ____ ___1 (bit 0): [kext] 允许加载不受信任的kext(与已被废除的kext-dev-mode=1等效)
  2. ___ ____ __1_ (bit 1): [fs] 解锁文件系统限制
  3. ___ ____ _1__ (bit 2): [debug] 允许task_for_pid()调用
  4. ___ ____ 1___ (bit 3): [n/a] 允许内核调试 (官方的csrutil工具无法设置此位,从10.13开始会随bit 0/4被自行设置)
  5. ___ ___1 ____ (bit 4): [internal] Apple内部保留位(csrutil disable默认会设置此位,用于Recovery/安装环境)
  6. ___ __1_ ____ (bit 5): [dtrace] 解锁dtrace限制
  7. ___ _1__ ____ (bit 6): [nvram] 解锁NVRAM限制
  8. ___ 1___ ____ (bit 7): [n/a] 允许设备配置,用于Recovery/安装环境
  9. __1 ____ ____ (bit 8): [basesystem] Basesystem验证,即允许启动任意Recovery系统(10.12新增)
  10. _1_ ____ ____ (bit 9): [n/a] 允许加载未经用户批准的kext,即禁用kext user consent功能(10.13新增)
  11. 1__ ____ ____ (bit 10): [n/a] Executable Policy Override(10.14新增)
复制代码

把需要关闭的安全保护技术标志位设置为1即可。非开发者一般仅需要关心前2项。
更多示例及建议值:
-> Clover(需要修改原版kext但未使用kextpatch)/Chameleon用户,建议仅解锁kext加载和文件系统限制:
csr-active-config=0x13或0x3 (csrutil enable --without kext --without fs [--no-internal]) - 此配置对于大部分非白果用户适用
-> Clover(已正确配置kextpatch对原版kext进行修改)/Ozmosis用户,建议仅解锁kext加载限制以加载第三方未签名kext:
csr-active-config=0x11或0x1 (csrutil enable --without kext [--no-internal])
-> Clover(愿意依赖Kext注入功能+已正确配置kextpatch对原版kext进行修改)/白果用户,可完全开启SIP:
csr-active-config=0x10或0x0 (csrutil enable [--no-internal] 或 curutil clear)
注:部分kext无法通过Clover的kext注入来正常工作,例如AppleHDA Injector等。
-> 关闭SIP中的所有防护,不推荐:
csr-active-config=0x07ff
在非必要的情况下,不要把提供的这些保护全部关闭。
-> 10.13下仅关闭Kext User Consent功能:
csr-active-config=0x200 (在Recovery OS下运行 spctl kext-consent disable)

至于系统启动标志位,即Clover的config.plist中BooterConfig的含义:
举例:
-> Raw Data: BooterConfig=0x49
0x0049 = 0b 00000000 01001001
每个标志位的含义,上方从右至左9个标志位以bit 0 - bit 9表示:

  1. _ ____ ___1 (bit 0): RebootOnPanic,遇到内核崩溃自动重启
  2. _ ____ __1_ (bit 1): HiDPI,在启动过程中使用HiDPI模式显示
  3. _ ____ _1__ (bit 2): Black,在启动过程中不显示进度条
  4. _ ____ 1___ (bit 3): CSRActiveConfig,将读取当前生效的SIP控制标志位
  5. _ ___1 ____ (bit 4): CSRConfigMode,仅用于Recovery/安装环境,将允许对SIP进行配置
  6. _ __1_ ____ (bit 5): CSRBoot,仅用于Recovery/安装环境,SIP将完全禁用
  7. _ _1__ ____ (bit 6): BlackBg,在启动过程中使用黑色背景
  8. _ 1___ ____ (bit 7): LoginUI,登陆界面,用于FileVault解锁
  9. 1 ____ ____ (bit 8): InstallUI,安装进度条界面,用于系统安装/升级
复制代码

把需要的打开的启动标志位设置为1即可。通过Clover设置BooterConfig可能需要机器支持原生NVRAM读写方可生效。如无特殊需要可以不在config.plist中添加此项。


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

配置完SIP后,如何确定系统当前的SIP开关状态呢?
Apple提供了csrutil命令行工具,该工具可以支持输出详细的SIP各项保护技术的开关状态。
如需要查询当前的SIP保护开关详细状况,可在终端中输入:

  1. csrutil status
复制代码

执行之后该工具将返回详细的报告,例如:

System Integrity Protection status: enabled (Custom Configuration).

Configuration:
        Apple Internal: disabled
        Kext Signing: disabled
        Filesystem Protections: enabled
        Debugging Restrictions: enabled
        DTrace Restrictions: enabled
        NVRAM Protections: enabled
        Basesystem Verification: 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. 待更新。


VI. SIP对于Hackintosh的影响

这方面的影响主要体现在强制kext签名以及文件系统保护2个方面:
1. kext签名保护:由于10.10中可用的kext-dev-mode=1启动参数在10.11中已经废除,请参照上面IV部分来配置SIP以关闭此项保护。
Clover的kext注入功能可绕过kext签名保护从而强制加载第三方kext,但部分kext使用注入功能可能无法正常工作,例如AppleHDA Injector等。
2. 文件系统保护:如不考虑安全性需求,也请参照上面IV部分来配置SIP以关闭此项保护,关闭之后即可对任意系统文件进行修改,包括直接修改"/System/Library/Extensions"下的原版kext。
如希望此项技术保持开启,则"/System/Library/Extensions"目录中的kext收到保护,无法直接进行修改。Apple要求第三方kext必须安装至"/Library/Extensions",此目录并不在保护列表中,因此可在root权限下自由操作。若有需要对SLE下原版kext进行修改也可通过充分利用Clover Kextpatch/kext Injector等技术实现。
注意:由于10.11中的磁盘工具已经去除了权限修复功能,若需要对整个系统盘权限进行修复,除手动命令操作外,推荐使用neycwby09写的RepairPermissions工具来完成。


VII. 安全 vs 便利?

安全往往是以牺牲便利性与一定的自由度为代价的,但安全与封闭不应划上等号。SIP技术作为macOS安全策略的重要部分,通过内核与沙盒渗入系统的方方面面,对于普通用户来说还是能够起到一定的防护作用;而对开发者或高级用户而言,也可以根据要求对其进行自由配置。就macOS的发展来看,从早先10.5的TrustedBSD及沙盒 -> 10.7引入app沙盒 -> 10.9引入kext签名机制 -> 10.10强制要求kext签名 -> 10.11完整的SIP体系,不难看出,Apple已经在其macOS上逐步构建起了一整套相对完善的安全机制。对于一个成熟的操作系统来说,这也正是其中不可缺少的重要一环。

标签:Clover,SIP,Apple,kext,____,保护,Rootless,bit
来源: https://blog.csdn.net/weixin_39802884/article/details/121300991

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有