Suzu macOS Playground

M07 · CTF

sandbox extension 與過放 filter 的偵測面

進程 profile 沒有靜態允許 ~/Downloads,使用者卻透過開啟對話框選了一個檔——找出讓這次存取放行的不是改 profile, 而是一張動態 sandbox extension token。接著比較兩個 file-read* 規則:一個用 (subpath) 精確收斂、一個用過寬的 (regex) 配到鄰接路徑,指出過放 filter 屬於規則撰寫邏輯錯誤(profile 過放)而非 kernel 漏洞,並說出在 Sandbox log 裡能看到什麼偵測訊號。

← 先讀 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 項目;目前以自我檢核完成。

提示

卡住時

靜態 profile 沒列的路徑要被放行,靠的是執行期遞交的 sandbox extension token(能力導向授權),不是把 profile 改寬。

走錯方向時

過寬的 (regex) filter 是「規則寫錯」導致 profile 過放,根因在撰寫邏輯;這跟 kernel/MACF 本身的漏洞是不同類別。

想更深入

把過寬 extension 發給低權進程 = confused-deputy 類別(高權者代低權者行使能力,M08 展開)。偵測面:log show 篩 sender == "Sandbox" 的 deny(1) 痕跡,以及哪個 operation 對哪個目標被擋/放行。

相關指令

codesignlog
← 回 CTF 場