Suzu macOS Playground

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(路徑被虛擬化),猜別人路徑無效。

← 先讀 M07 章節

SBPL sandbox 求值器

profile(由上而下,last-match-wins)
  1. (deny default) ← 起點
  2. #1 (allow file-read* /usr/lib) ← 命中
  3. #2 (allow file-read* ~/Library/Containers/com.x.app/Data)
  4. #3 (allow file-write* ~/Library/Containers/com.x.app/Data)
  5. #4 (allow mach-lookup com.apple.fonts)
  6. #5 (deny file-read* ~/Library/Containers/com.x.app/Data/secret)
要求一個操作
allow

命中規則 #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 為教學子集,非完整語言。

過關目標

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

提示

卡住時

SBPL 的靈魂是 (deny default)。沒有任何 allow 命中的操作一律擋——預設是荒地,allow 才開路。

走錯方向時

被擋回的是 EPERM(MAC 拒絕),不是 EACCES(DAC 權限不足)。sandbox 是掛在 MACF 上的 policy module,獨立於 POSIX 權限。

想更深入

App 看到的 ~/Documents 被重導向到 ~/Library/Containers/<bundle-id>/Data/ 底下(私有目錄實作在 container 內)。路徑命名空間被虛擬化,所以猜別人或真實家目錄的路徑無效。

相關指令

codesignlslog
← 回 CTF 場