M05 · CTF
root 為什麼寫不進 /System
在實驗室選 /System 路徑、uid 0(root)、write、第三方簽署者,找出 DAC 通過卻仍被拒的那道閘, 並說出回傳的是 EPERM 還是 EACCES、為什麼。
SIP / rootless 實驗室
csr = 0x0
System Integrity Protection status: enabled.
/System 帶 SF_RESTRICTED → SIP MAC 保護。
- DAC (POSIX)uid 0(root)滿足擁有者寫入權 → DAC 通過。注意:root 仍須經過 DAC,只是通常會過。
- SIP (MAC)對 restricted 路徑寫入、非授權的 rootless 二進位 → EPERM。連 root 都擋。
重點:DAC 過了(你是 root),但 SIP 這道獨立 MAC 閘擋下 → EPERM。「root 寫不進 /System」就是這個原因,不是 DAC。
開機期 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。
過關目標
- 讓 decision.system.root.write.errno 達到 "EPERM"
- 讓 decision.applications.root.write.allowed 達到 true
- 用自己的話解釋:為什麼 root 寫 /System 被擋是 EPERM(SIP/MAC)而非 EACCES(DAC)?兩者差在哪?
解答是「操作模擬器到對的狀態 + 能說出原理」,非提交 flag 字串。互動式自動評分為 roadmap 項目;目前以自我檢核完成。
提示
卡住時
兩閘 deny-overrides:DAC(POSIX)→ SIP(MAC)。root 過得了 DAC,被 SIP 擋。
走錯方向時
SIP 擋下回 EPERM(operation not permitted);DAC 權限不足才回 EACCES。
想更深入
把路徑換成 /Applications(sunlnk,非 restricted)→ SIP 不介入,root 可寫。這就是 restricted 與 sunlnk 的差別。