M07 · CTF
deny default 與 container 重導向
在 SBPL 面板裡,一個只有 (version 1)(deny default) 的 profile 下,讓進程 open ~/Documents/secret 與 mach-lookup com.apple.system.logger,觀察兩者都被擋(EPERM)。接著加上最小 allow 規則放行 logger, 並指出為何 App 寫死的 ~/Documents 其實落在它自己的 container(路徑被虛擬化),猜別人路徑無效。
SBPL sandbox 求值器
- (deny default) ← 起點
- #1 (allow file-read* /usr/lib) ← 命中
- #2 (allow file-read* ~/Library/Containers/com.x.app/Data)
- #3 (allow file-write* ~/Library/Containers/com.x.app/Data)
- #4 (allow mach-lookup com.apple.fonts)
- #5 (deny file-read* ~/Library/Containers/com.x.app/Data/secret)
命中規則 #1(allow file-read*)。last-match-wins:後面的規則覆寫前面的。
試 file-read-data ~/Library/Containers/com.x.app/Data/secret/key:先被 allow(Data 子樹)命中、再被後面更specific 的 deny(secret 子樹)覆寫 → 最終 deny。這就是 last-match-wins。SBPL 為教學子集,非完整語言。
過關目標
- 讓 decision.fileRead.homeDocuments.errno 達到 "EPERM"
- 讓 decision.machLookup.systemLogger.allowedAfterRule 達到 true
- 讓 container.homePathVirtualized 達到 true
- 用自己的話解釋:為什麼 (deny default) 之下 open() 被擋是 EPERM 而非 EACCES?又為什麼 sandboxed App 寫死 ~/Documents 碰不到真正的家目錄?
解答是「操作模擬器到對的狀態 + 能說出原理」,非提交 flag 字串。互動式自動評分為 roadmap 項目;目前以自我檢核完成。
提示
卡住時
SBPL 的靈魂是 (deny default)。沒有任何 allow 命中的操作一律擋——預設是荒地,allow 才開路。
走錯方向時
被擋回的是 EPERM(MAC 拒絕),不是 EACCES(DAC 權限不足)。sandbox 是掛在 MACF 上的 policy module,獨立於 POSIX 權限。
想更深入
App 看到的 ~/Documents 被重導向到 ~/Library/Containers/<bundle-id>/Data/ 底下(私有目錄實作在 container 內)。路徑命名空間被虛擬化,所以猜別人或真實家目錄的路徑無效。