Suzu macOS Playground

M05 · CTF

csr bitmask 與 SSV 兩層

用 csr 位元面板找出哪個位元會讓 root 能寫 restricted 路徑;再說明為何「關 SIP」不等於「關 SSV」, 兩層(執行期 MAC、開機期 seal)如何各自獨立。

← 先讀 M05 章節

SIP / rootless 實驗室

① csr-active-config 位元

csr = 0x0

System Integrity Protection status: enabled.

② 檔案存取(DAC → SIP,deny-overrides)

/System 帶 SF_RESTRICTED → SIP MAC 保護。

結果拒絕 (EPERM)
  1. DAC (POSIX)uid 0(root)滿足擁有者寫入權 → DAC 通過。注意:root 仍須經過 DAC,只是通常會過。
  2. SIP (MAC)對 restricted 路徑寫入、非授權的 rootless 二進位 → EPERM。連 root 都擋。

重點:DAC 過了(你是 root),但 SIP 這道獨立 MAC 閘擋下 → EPERM。「root 寫不進 /System」就是這個原因,不是 DAC。

③ SSV:開機期 seal vs 執行期 MAC(兩層獨立)

開機期 seal(authenticated-root / SSV)

開機時以 Merkle tree 的 root hash 驗整個系統卷快照的封印(seal)。磁碟上改一個 byte → 算出的 root hash 不符 → 無法開機(除非關掉 authenticated-root)。

與執行期 SIP 無關:可以 SIP 關、但 seal 仍開。

執行期 MAC(SIP / rootless)

系統執行中,MACF policy 擋對 SF_RESTRICTED 路徑的修改,連 uid 0 都擋。

與開機 seal 兩層獨立:本機實測即 SIP disabled 但 Authenticated Root enabled。

本機實測:SIP disabled 但 Authenticated Root enabled、Snapshot Sealed: Yes — 正是兩層獨立的活證據。

模型邊界:兩閘 deny-overrides 是 M09 六閘的預習教學模型,非核心 MACF 逐位元評估順序。csr 位元、restricted 旗標、SSV 雙層皆為實測(見章末真機卡);驗證於 macOS 26.3.1。

過關目標

解答是「操作模擬器到對的狀態 + 能說出原理」,非提交 flag 字串。互動式自動評分為 roadmap 項目;目前以自我檢核完成。

提示

卡住時

csr 0x2 = ALLOW_UNRESTRICTED_FS,設了之後 SIP 的 FS 保護就不介入,restricted 路徑可寫。

走錯方向時

SIP(執行期 MAC)與 authenticated-root(開機期 seal)是兩個獨立開關。本機實測 SIP off 但 seal on。

想更深入

開機系統卷的封印由 ALLOW_UNAUTHENTICATED_ROOT(0x800) 與 csrutil authenticated-root 管,跟 FS 保護(0x2)不同位。

相關指令

csrutildiskutil
← 回 CTF 場