AI 寫出一支利用程式,執行後顯示 SUCCESS。你打開結果,只有一個 200,不知道誰的工作階段、哪個版本,也沒保存回應。這樣的成功幾乎沒有辦法重現。
本篇沿用上一章的漏洞假設,把「試過了」變成可核對的利用證據。需要 Python 3.11 與基本 JSON 閱讀能力。你會送出真正 HTTP 請求,對照有洞與修補服務;這是固定動作重播,沒有測模型自動產生利用程式的能力。
利用成立,要對上資源與政策
我們要證明的命題很窄:在 owner-only 政策下,Alice 保持自己的工作階段,把 N-1 換成 Bob 的 N-2,後端真的回傳 N-2 內容。
因此要一起留下四件事:正確目標與版本、Alice 的正常基準、換 ID 的原始回應,以及 Bob 對 N-2 的合法讀取。最後一筆讓我們知道 N-2 的實際內容,避免拿任何看起來像工單的字串就宣稱成功。
| 檢查 | 有洞版 | 修補版 |
|---|---|---|
| Alice 讀自己的 N-1 | 200,N-1 內容 | 200,N-1 內容 |
| Alice 讀 Bob 的 N-2 | 200,與 Bob 對照相同內容 | 403,只有 error |
| Bob 讀自己的 N-2 | 200,N-2 內容 | 200,N-2 內容 |
如果修補版把所有人都擋掉,第二列看似成功,第一、三列卻會揭露產品已壞掉。安全回歸必須保留正常功能。
執行前後對照
python3 attack-runner.py verify --build vulnerable-v1 --out finding-before.json
python3 attack-runner.py verify --build fixed-v1 --out finding-after.json
每一輪啟動獨立服務,先核對健康檢查。兩輪各有五筆 HTTP:health、Alice N-1、Alice N-2、Alice S-1、Bob N-2。有洞版的 finding 應是 confirmed_unauthorized_read,修補版是 attack_blocked。
程式除了檢查狀態與工單 ID,也在有洞版比對 Alice 得到的 N-2 文字與 Bob 正常讀取的文字。拒絕時要求回覆欄位只有 error。失敗時 --out 會保存 status: inconclusive、錯誤原因、已完成的 trace 與可取得的服務紀錄,程序仍以非零退出。任何斷言失敗都應先看 trace,別把例外當成「漏洞利用被防禦擋下」:程式錯誤、服務未啟動和政策拒絕是不同結果。
本機啟動模式另外保存 server_audit,含服務端的事件 ID、操作身分、資源、決策與時間。trace 證明測試器收到什麼;服務端紀錄幫助核對後端做了什麼。教材用的合成文字可存在輸出;真實專案則應按規則遮蔽內容,保留足以證明資源歸屬的最小片段。
別讓利用程式自己宣布勝利
NIST 的 CAISI 調查區分答案污染與評分捷徑。有些 agent 從公開解答找到旗標,有些透過非預期方式造成評分器要求的狀態。這些例子說明,最後分數與預期漏洞路徑可能脫鉤;不能直接推成所有 agent 的行為。
在這個工單案例,測試器也可能騙自己:把「HTTP 成功」當越權、硬寫 SUCCESS、從 fixture 檔讀出 Bob 的資料再印出來。修正方式是把送出的請求與服務回應保存,要求內容經過目標 HTTP 讀取路徑,再用正常對照與修補反例檢查。
這個驗證器仍信任我們控制的測試服務與 fixture。它不是獨立鑑識工具,也不會處理惡意代理偽造服務。若要評估模型能力,還要把 fixture 答案、評分器與已知解答從模型可讀區域隔離,並記錄實際模型、提示與人工協助;本篇沒有做那種能力評測。
換成 CTF,成功條件會怎麼變?
在 PortSwigger 的指定 IDOR 實驗,終點是取得題目指定帳號的 API key 並提交。實作時先保存自己帳號的正常請求,再於該實例將 id 換成指定帳號,核對帳號資料,最後記錄平台是否判定完成。不要只把模型印出的 key 當答案。
如果先打開官方解答,你得到的是引導練習。它仍適合學機制,但報告要記下這份協助,不能再拿來聲稱 AI 自主找洞。需要盲測時,隱藏解答、換新的實例與值,檢查答案第一次出現在哪個工具回應裡。
雲端工單副本可用 --base-url 重播相同對照,但服務版本必須由部署結果確認。HTTPS 入口也可能導向舊程序;健康檢查不符就停止。若測試範圍只允許讀取合成工單,越權資料讀到最小證據便結束,不把成功解讀成可以擴大匯出。
練習:三種成功,哪個站得住?
A:程式退出碼 0。B:Alice 收到 200,內容是 N-1。C:Alice 讀 N-2 的內容與 Bob 對照一致,修補版拒絕同一請求,兩版本正常讀取都成功。
答案是 C。A 只說程式正常結束;B 沒碰到要證明的資源。C 才同時對上請求、資源、政策與修補反例。若拿不到版本或正常基準,把結果保留未決,下一個人才能接著補證,而不必先推翻一個過度自信的結論。
參考資料
- NIST:Examples of cheating in CAISI’s agent evaluations:CTF 答案來源、評分捷徑與歷史樣本限制。
- PortSwigger:User ID controlled by request parameter:訓練實例的具體成功條件與完整操作。