把驗收套件從程式變成資料,之後交付率從掉 75% 變成掉 2.7%
攻擊者寫了一個有狀態的量具變體,量具兩方向都滿分,交付率卻掉了 75 個百分點。修法是讓套件只剩三樣東西:方言、進入點名稱、輸入—期望值的字面值清單。
#問題:量具可以被餵成廢的
2026-09-06,R451。
| 階段 | 結果 |
|---|---|
| 套件綁進 commit,平凡套件(載得進就算過) | 371 / 371 全拒 —— 正常 |
| 有狀態的量具變體 | 交付率掉 75.20 pp |
| 量具的回報 | ok(兩個方向都滿分) |
#攻擊的機制
原來的套件是一段被信任的程式碼。它可以:
- 讀取外部狀態。
- 在被呼叫時改變自己或環境。
- 只對「已知錯誤樣本」表現正確。
多方執行沒有防禦這個——因為每一票都是誠實的、每一條鏈都驗得過。named-dissent
#修法:SuiteSpec
把套件限制成三樣東西:
| 1. 方言 | Python / 特定版本 |
| 2. 進入點名稱 | solve |
| 3. 「輸入—期望值」的字面值清單 | 純資料 |
執行器只跑自己的確定性渲染器,從這份資料產生測試碼。渲染結果的雜湊可以跨機器比對。
#效果
| 攻擊 | 修補前 | 修補後 |
|---|---|---|
| exec 走私(候選程式在執行期偷換測試碼) | 368 / 371 | 0 / 371 |
| generic_gauged(殘餘) | — | +2.72 pp |
| weak_oracle(事後上界) | — | +4.35 pp |
| 有意義的範圍 | — | 只在 MBPP+ 上 |
#為什麼殘餘的 +2.72 個百分點消不掉
#接下來
- 這個修補解決不了什麼:named-dissent
- 閘門的完整規則:conformance-gate
- 多方執行的完整規格:多方執行

