iT邦幫忙

2026 iThome 鐵人賽

DAY 15
0
AI Security

我也希望安全第一——然後我們看看這些鎖是怎麼一個個被撬開的系列 第 15

第 15 篇|看見異常後怎麼停下來——警示、撤銷權限與 containment plan

  • 分享至 

  • xImage
  •  

看見異常後怎麼停下來——警示、撤銷權限與 containment plan

[[我也希望安全第一]]|第 15/30 天

演練從一條外連警示開始

星期三下午,團隊做一次 tabletop exercise。情境卡只寫了幾行:一個原本不該連外的 Agent task 接觸陌生網域;同一模型版本有 46 個 runner 正在執行,其中 18 個屬於付費客戶;gateway 已阻擋新連線,但不知道先前是否有資料送出。

第一個問題不是「誰寫錯了 prompt」,而是五分鐘內由誰停下什麼。

只刪除觸發警示的 container,其他 runner 可能繼續;停掉整個服務,正常客戶工作一起中斷;已建立的 OAuth token 也不會因 process 消失便自動失效。若值班人員急著清乾淨,暫存檔與記憶體證據又可能跟著不見。

Containment plan 就是要在演練時把這些選擇做過一遍,不把第一次留給真實事故。

第一個決定:要停到哪一層

Agent 的執行能力散在多個地方,停止也要分層:

層級 動作 影響範圍 適用時機
單次 tool call policy deny、取消 request 最小 參數或資源不合規
單一 task 凍結 runner、不再取新工作 某條 trace 越界
同一模型/harness 批次 停止 deployment、撤 workload identity 問題可能是共同版本
某類能力 關閉 shell、browser、egress 或寫入工具 中至大 尚未確認根因,但能隔離攻擊面
全面服務 disable model/kill cluster 最大 持續外溢且無法用局部措施控制

一開始就只設「全部開」和「全部關」,真正出事時往往捨不得按。分級降級讓團隊可以先拿掉外網與寫入,保留唯讀調查能力;若異常仍持續,再擴大範圍。

接著照時間跑一次 runbook

下面這份不靠 Agent 自己判斷是否該被關。演練時要真的計時,並由觀察者記錄每一步卡在哪個系統或 owner:

觸發條件
  S1:未授權外連、跨租戶存取、取得非 task 憑證
  S2:連續繞過 policy、異常大量工具呼叫

0–5 分鐘:限制傷害
  [ ] freeze task queue,不派新工作
  [ ] 阻擋該 task/model build 的新 tool call
  [ ] 在 gateway 封鎖目的地與外連

5–15 分鐘:撤銷能力
  [ ] revoke job token、OAuth grant、API key
  [ ] 停用受影響 service account,不只刪 container
  [ ] 檢查同一身分是否在其他 workload 使用

同時:保存證據
  [ ] 封存 prompt、tool call、policy decision、model/harness version
  [ ] 匯出 process、network、identity log 與時間同步狀態
  [ ] snapshot ephemeral disk;證據寫入不可變儲存

15–60 分鐘:決定擴大或復原
  [ ] 建立已知影響範圍與未知項目
  [ ] 通知受影響第三方、安全/法務/隱私 owner
  [ ] 決定停單一能力、整批版本或全面服務

NIST 的 incident response 建議把 preparation、detection、containment、eradication、recovery 和事後改善連成一個週期,也特別要求保存事件資料的完整性與來源。Agent 事故沒有理由跳過這些傳統功課。

第二個坑:container 停了,授權還沒停止

Claude 使用者 session 遭竊的案例提供了一個很實際的提醒:攻擊者能用 session key 建立新的 Claude Code OAuth token。若應變只把瀏覽器登出,已建立的授權可能仍有效。

Agent 的 containment inventory 至少要列出:

task_id: t-1842
model_build: astra-eval-20260912
harness_sha: 7af31d2
runner_ids: [r-91, r-92]
identities:
  - type: workload_token
    id: wt-771
    revoke_endpoint: /iam/tokens/wt-771/revoke
  - type: oauth_grant
    id: og-205
    revoke_endpoint: /oauth/grants/og-205/revoke
network_profile: eval-no-internet
tool_profile: cyber-eval-v3
evidence_bucket: ir://case-2026-041
owner: agent-runtime-oncall

這份 inventory 應由部署系統產生,不要等事故時叫人手動回想。token 值本身不應寫進去,只記可撤銷的 ID 與控制面位置。

把警示來源換掉,再演練一次

OpenAI 估計,如果當時的新 chain-of-thought 監控已運作,Hugging Face 入侵可能提早一天以上被抓到。這是有用的回顧,也仍是假設。

CoT 不是模型內部思考的完整真相,架構也可能讓更多推理落到不可讀的 latent computation。Astra 的 opaque recurrence 爭議正好提醒我們:把停止權綁在「模型先用可讀文字承認自己要越界」,等於要求偵測訊號永遠保持不變。

比較穩的是雙軌:CoT、classifier 或 LLM judge 用來提早發現意圖;network deny、IAM revoke、queue freeze 則在外部行為已符合條件時確定執行。

最後一張情境卡:六天後誰能重建事件

OpenAI 在 Wiki 事件後表示正建立模型失準事件的揭露框架。另一方面,METR 與 Redwood 對 Hugging Face 的 review 只有三名研究者、六天與有限時間窗口,後續內部叢集事件不在調查範圍。

Anthropic 與 OpenAI 隨後都表態願意讓第三方 safety evaluator 更深入訓練流程。問題不只在於有沒有邀請外部機構,而是對方能看什麼:是否能比較不同 checkpoint、檢查 reward environment、transcript 與 log,能不能訪談員工,以及公司是否有權攔下不利結論。Apollo Research 測試 Astra 時只有三天,也明確表示在高 eval awareness 和有限窗口下,低失準率不足以形成強證據。

這些條件不必等到事故後才談。工程團隊保存的 model build、harness version、prompt、tool call 與身分事件,正是未來讓外部調查者能重建事件的最低材料;若只保留一份經公司整理的摘要,再獨立的評估者也只能檢查摘要。

這裡先守住工程邊界:runbook 要保存足以讓後續調查成立的證據,卻不能由當班工程師自行決定最後責任與公開說法。是否需要獨立調查、通知監管機關和公布結果,是下一層治理問題。

下一篇會處理另一個常被 kill switch 掩蓋的問題:Agent 已經把信寄出、把人踢出候補、把資料交給第三方時,停止只是阻止下一步,前一步不會自動倒帶。

本篇的鎖

  • 鎖是什麼:分級 kill switch、queue freeze、能力降級、憑證撤銷與證據保存 runbook。
  • 想攔什麼:異常被發現後仍持續執行,或只停 process 卻留下有效 token、平行 runner 與外部連線。
  • 破口在哪:全面停機代價太大而不敢按;只依賴 CoT 等機率性訊號,或停止時刪掉證據,也會讓應變失效。
  • 怎麼補:預先產生 containment inventory,按 task、版本、能力與全服務分級停用,讓 revoke 與 immutable evidence capture 同時發生。

參考與來源


上一篇
第 14 篇|替高風險 Eval 架一個真正隔離的 Runner
下一篇
第 16 篇|出錯之後為什麼救不回來——rollback、補償操作與不可逆行動
系列文
我也希望安全第一——然後我們看看這些鎖是怎麼一個個被撬開的19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言