Details Apple’s System Integrity Protection (SIP) for Hackintosh

1. csr-active-config 0x0 = SIP Enabled (Default)
2. csr-active-config 0x3 = SIP Partially Disabled (Loads unsigned kexts)
3. csr-active-config 0x67 = SIP Disabled completely

Clover config.plist

<key>RtVariables</key>
    <dict>
        <key>CsrActiveConfig</key>
        <string>0x3</string>
        <key>BooterConfig</key>
        <string>0x28</string>
    </dict>

Unibeast USB installation

什麼是Apple SIP

Apple SIP(System Integrity Protection)機制是OSX 10.11開始啟用的一套關鍵的安全保護技術體系。 SIP技術的整個體系主要分為:

  • 文件系統保護(Filesystem protection)

對於系統文件通過沙盒限制root許可權,比如:就算你有root根限,也無法往/usr/bin目錄寫入。

  • 運行時保護(Runtime protection)

受保護的關鍵系統進程在運行狀態下無法被代碼注入,掛調試器調試,以及限制內核調試等

  • 內核擴展簽名(Kext signing)

10.10中強制要求籤名,要想繞過這個限制,就必需加入啟動參數「kext-dev-mode=1」(10.11 DB5開始,」rootless=0」的啟動參數也被廢除了),這個啟動參數在10.11中被廢除。另外,10.11官方要求第三方kext必須被安裝至/Library/Extensions。

Apple官方如何對SIP保護技術進行配置

  • 進入10.11的安裝程序或Recovery HD

使用其中所帶的終端進行相關操作。在此環境下,由於特殊啟動標誌位的存在,整個SIP保護技術處在完全關閉狀態。可正常修改受保護文件的許可權以及所有者。

  • Apple已經提供了csrutil程序來配置SIP

此程序在正常系統環境下只支持檢查當前SIP開關狀態,若需要開關或調整SIP狀態必須前往Recovery或安裝程序中執行。 注意:該工具修改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開關詳細狀態

    csrutil status

其它可以控制SIP方法

  • 借助Clover(版本>=3250)實現SIP控制

    RtVariables

    CsrActiveConfig
    0x13
    BooterConfig
    0x49

  • 借助第三方應用(例如:SIPUtility.app) 這類應用一般需要在Recovery環境下使用,並且要求原生支持NVRAM寫入,盡量避免使用。

  • 直接寫入NVRAM

例如:

sudo nvram 7C436110-AB2A-4BBB-A880-FE41995C9F82:csr-active-config=%13%00%00%00

SIP自定義配置及各標誌位的含義

舉例:csr-active-config=0x13,0x13 = 0b00010011

____ ___1 (bit 0): [kext] 允許載入不受信任的kext(與已被廢除的kext-dev-mode=1等效)
____ __1_ (bit 1): [fs] 解鎖文件系統限制
____ _1__ (bit 2): [debug] 允許task_for_pid()調用
____ 1___ (bit 3): [n/a] 允許內核調試 (官方的csrutil工具無法設置此位)
___1 ____ (bit 4): [internal] Apple內部保留位(csrutil默認會設置此位,實際不會起作用。設置與否均可)
__1_ ____ (bit 5): [dtrace] 解鎖dtrace限制
_1__ ____ (bit 6): [nvram] 解鎖NVRAM限制
1___ ____ (bit 7): [n/a] 允許設備配置,用於Recovery/安裝環境

更多示例及建議值:

  • Clover(需要修改原版kext但未使用kextpatch),建議僅解鎖kext載入和文件系統限制:

csr-active-config=0x13或0x3(csrutil enable –without kext –without fs [–no-internal])

  • Clover(已正確配置kextpatch對原版kext進行修改),建議僅解鎖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,CodecCommander.kext等。

  • 關閉SIP中的所有防護,不推薦:

csr-active-config=0xff 在非必要的情況下,不要把提供的這些保護全部關閉,也盡量避免使用Clover默認注入的0x67參數。

至於系統啟動標誌位,即Clover的config.plist中BooterConfig的含義:

舉例:BooterConfig=0x49, 0x0049 = 0b001001001

_ ____ ___1 (bit 0): RebootOnPanic,遇到內核崩潰自動重啟
_ ____ __1_ (bit 1): HiDPI,在啟動過程中使用HiDPI模式顯示
_ ____ _1__ (bit 2): Black,在啟動過程中不顯示進度條
_ ____ 1___ (bit 3): CSRActiveConfig,將讀取當前生效的SIP控制標誌位
_ ___1 ____ (bit 4): CSRConfigMode,僅用於Recovery/安裝環境,將允許對SIP進行配置
_ __1_ ____ (bit 5): CSRBoot,僅用於Recovery/安裝環境,SIP將完全禁用
_ _1__ ____ (bit 6): BlackBg,在啟動過程中使用黑色背景
_ 1___ ____ (bit 7): LoginUI,在啟動過程中使用登陸介面作為背景
1 ____ ____ (bit 8): InstallUI

把需要的打開的啟動標誌位設置為1即可。BooterConfig設置為Clover自有設置,可能需要機器支持原生NVRAM讀寫方可生效。如無特殊需要建議可以不在config.plist中添加此項,等待Clover的後續更新。

SIP對於kext修改及安裝的影響

這方面的影響主要體現在強制kext簽名以及文件系統保護2個方面:

  • kext簽名保護:由於10.10中可用的kext-dev-mode=1啟動參數在10.11中已經廢除,請參照上面配置SIP以關閉此項保護。 Clover的kext注入功能可繞過kext簽名保護從而強制載入第三方kext,但部分kext使用注入功能可能無法正常工作,例如AppleHDA Injector,CodecCommander.kext等。

  • 文件系統保護:如不考慮安全性需求,也請參照上面配置SIP以關閉此項保護,關閉之後即可對任意系統文件進行修改,包括直接修改」/System/Library/Extensions」下的原版kext。 如希望此項技術保持開啟,則」/System/Library/Extensions」目錄中的kext受到保護,無法直接進行修改。Apple要求第三方kext必須安裝至」/Library/Extensions」,此目錄並不在保護列表中,因此可在root許可權下自由操作。若有需要對SLE下原版kext進行修改也可通過充分利用Clover Kextpatch/kext Injector等技術實現。