Skip to content

pin-reference-model.sh:model 欄位未驗證即進 path sink,且結果寫回 tracked baseline-meta.json(#115 同款、更嚴重) #127

Description

@kiki830621

Problem

scripts/pin-reference-model.sh#115 的同款未修實例——而且比 #115 更嚴重。

發現於 #126#116+#115 的 cluster PR)verify 的 Devil's Advocate。四個 verify leg 都從
baseline.json 往前追 model 欄位,沒有人往回追 sink 問「還有誰寫進這個地方」。

同款的三個要素

regression-gate.sh#115,已修) pin-reference-model.sh(本 issue,未修)
讀取 baseline.jsonmodel baseline-meta.jsonmodel(L19)
驗證 ✅ 白名單(#115 後) 零驗證
路徑組合 同一個 sed 's/-\([^-]*\)$/_\1/' 同一個 sed(L23)
Sink cd + find + shasum cd + find + shasum
# scripts/pin-reference-model.sh:19,23
MODEL=$(/usr/bin/python3 -c "import json,sys; print(json.load(open(sys.argv[1]))['model'])" "$META")
MODEL_DIR="${1:-$CACHE_ROOT/openai_whisper-$(echo "$MODEL" | sed 's/-\([^-]*\)$/_\1/')}"

為什麼比 #115 嚴重

#115 的 sink 只比對 digest;本 issue 的 sink 把採集到的檔名與 sha256 持久化寫回
git-tracked 的 benchmarks/baseline-meta.json
。DA 已實證:逃出 cache root 後,被竊取的
檔名與雜湊會寫進版控檔案。

加重因子:

  • baseline-meta.jsonbaseline.json同一目錄、同一 trust boundary,兩者都被 git ls-files 追蹤
  • baseline-meta.json 零測試覆蓋
  • regression-gate.sh4 處指引操作者去跑這支腳本

Type

bug

Expected

pin-reference-model.shmodel 施加與 #115 相同的驗證。直接重用
scripts/lib/baseline-worklist.py
#116 已把驗證抽成獨立模組)或等價的共用通道——
不要複製第三份 regex,那正是本 class 反覆出現的根因。

亦需考慮:MODEL_DIR 可由 $1 覆蓋(L23 的 ${1:-...}),該路徑同樣未驗證。

Impact

  • scripts/pin-reference-model.sh
  • 可能擴充 scripts/lib/baseline-worklist.py 使其能驗 baseline-meta.json 的 shape
  • 測試(baseline-meta.json 目前零覆蓋)

誠實 severity:MEDIUM(同 #115——需惡意 PR 混入受版控檔案;read-only traversal 非 RCE),
但持久化寫回 repo 這點使影響面大於 #115

Source: surfaced during /idd-verify PR #126 — Devil's Advocate,四個 leg 全體漏掉。
DA 實證逃逸並確認資料寫入 tracked 檔案。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions