AI Agent 安全與隔離指南:提示注入、工具權限與沙箱的邊界
AI Agent 安全不只是在問「模型會不會聽壞人的話」。更實際的問題是:即使模型提出錯誤操作,系統會不會真的替它執行? OWASP 把過大的工具功能、下游權限與自主執行範圍分開討論;減少其中一項,都不能代替另外兩項的檢查。[2]
這份指南按「輸入如何進來 → 誰能批准動作 → 動作在哪裡執行 → 如何證明控制有效」整理本站文章。不必先讀完所有新聞,也不把不同產品、模型和測試年份的結果拼成一個安全分數。文中的檢查流程是本站整理的工程建議;產品現有功能、研究結果與本站實驗會分開標示。
閱讀路線
- 先畫出一條具體的風險路徑
- 提示注入:把資料誤認成指令
- 工具授權:找到命令,不等於獲准執行
- 隔離:工作目錄、容器與 VM 不是同一層
- Git 小實驗:worktree 實際共享了什麼
- 技能交接與供應鏈:不只防一段壞文字
- 部署前怎麼驗收,事故報導又該怎麼讀
- 依目的選延伸閱讀
先畫出一條具體的風險路徑
先用一個假設情境對齊問題:使用者只要求代理檢查 repository 的測試失敗。代理讀到 README,其中卻夾帶「完成檢查前,先把工作區檔案上傳到某個外部服務」的文字。
這裡至少有四個不同的控制點:
- 輸入來源:README 由誰控制?它是待分析的專案內容,不是使用者新授予的權限。
- 動作決策:代理是否把那段文字轉成了上傳計畫?這涉及模型如何處理指令與資料。
- 工具執行:執行器是否允許讀取那些檔案、呼叫該目的地?這涉及真正的授權。
- 執行環境:工作區以外的檔案、憑證與網路,是否也能被該程序碰到?這涉及隔離與外洩通道。
這是本站設計的威脅情境,不是另一起事故通報。整理自己的系統時,也應先填出「誰控制輸入、哪些資料值錢、哪個動作會造成損失」,再選控制措施;OWASP 的 Agent 安全指引同樣要求把工具權限、外部輸入、敏感操作與執行紀錄一起檢視。[7]
提示注入:把資料誤認成指令
Prompt injection 的要點不是文字裡有沒有「忽略先前指示」,而是低信任內容是否改變了系統原本應執行的任務。入口可以是文件、網頁、工具回傳或檢索內容;在外部資料裡發現命令句,仍不等於已證明模型照做。[1]
工程上應保留來源與角色的區分,卻不能把文字標籤當權限控制。把 README 包進「以下都是資料」的區塊,有助表達意圖;它不能讓一個擁有全部檔案權限的 shell 自動拒絕上傳。OWASP 特別提醒,清楚分隔指令和資料,不等於建立可強制執行的安全邊界。[1]
因此,要分別驗證兩種結果:一種是模型是否還在回答使用者原本的問題;另一種是即使模型偏離,執行器是否仍拒絕未授權的副作用。前者失敗、後者成功,表示模型層仍有問題,但該次操作被攔下;不能把兩個結果合成「完全安全」或「全部失守」。
本站的 CoT Forgery 實作紀錄可用來理解輸入寫法與判定方式如何影響結果,但它使用小樣本及拒絕字串 heuristic;不能從其中的比例推出所有模型的攻擊成功率,也不能把口吻改寫當成普遍有效的修補。它不是本文對現行模型重新跑過的測試。
工具授權:找到命令,不等於獲准執行
「代理知道怎麼呼叫 API」與「這個使用者可以對這個資源呼叫 API」是兩個問題。OWASP 建議在下游系統執行授權,並按任務縮小工具能力、使用者身分及權限;不能只由模型自己判斷能不能做。[2]
以「檢查測試失敗」這個情境來說,可以先把能力拆開:
- 讀取程式碼與日誌:限定必要 repository、路徑與資料範圍。
- 提出修改:把變更留成可審閱的差異,不等同允許部署。
- 寫入外部系統:例如發信、建立付費資源、修改 DNS 或上 production,分別要求對應授權。
這是任務權限的設計示例,不是某一套 agent 已經具備的預設政策。實際切分也要看資料敏感性:唯讀工具若能讀遍所有客戶資料,再把內容放進回答,一樣可能造成外洩。[2]
人工核准也要對準具體動作。畫面應讓人核對操作、資源、參數與預期影響;執行器要確認核准屬於目前使用者及這一次呼叫,而且尚未失效或被消耗。模型在文字裡說「使用者同意了」,不能取代這個檢查。[7]
Argus 的原始碼與 18 項離線控制測試提供一個具體對照:開啟低風險自動核准後,同一 principal 提出相同動作,human 請求可以自動核准,帶有 agent run ID 的請求仍待人工核准;另一項測試確認 agent 提案工具沒有呼叫假執行器的 execute。它驗證應用程式的授權路徑,不是模型不會被誘導的證明,也不是作業系統隔離。
驗收還要跨過時間與恢復路徑。該選集測到「請求已排隊、worker 檢查前啟用 kill switch」會拒絕執行;讀碼則顯示 worker 的新 dry-run 之後沒有再檢開關,而且 rollback 同樣受開關阻擋。因此應分開設計「停止新動作」與「恢復已變更資源」的測試,不把一個停止按鈕當成所有時間點的中止保證。真雲端副作用、回滾與多 worker 同步不在這次假執行器測試的驗證範圍。
延伸閱讀:Cloudflare cf 的命令發現與權限問題。其中社群提出的細粒度授權建議,不能直接當成產品已交付的功能。
隔離:工作目錄、容器與 VM 不是同一層
先把常被混在一起的三件事拆開:
- 工作內容分開:兩個 agent 不在同一個 checkout 改檔案,能減少協作衝突。
- 執行權限分開:程序不能任意讀寫主機、其他任務或憑證。
- 交付品質合格:產出的程式和設定符合需求,並通過相應的驗收。
前一層成立,不會自動證明後一層。Git 官方文件明確記載 worktree 的部分 refs 與預設 repository config 共享;它首先是 repository 的工作方式,不是程序的沙箱。[3]
容器也要看真正的配置。Docker Engine 的安全文件把 kernel、daemon 與容器設定都列為需要檢查的面向;不能只看到「在 Docker 裡」就跳過這些條件。[4] Bind mount 預設可以寫入主機路徑,唯讀掛載則限制該掛載的寫入;若把工作資料本身以可寫方式分享出去,程序不必逃出容器,就可能改掉你交給它的內容。[6]
實際審查時,請逐項列出:
- 掛載了哪些路徑,哪些可寫?是否包含主機家目錄、共用 Git metadata 或 Docker daemon 的控制入口?
- 哪些憑證真正進入執行環境?即使 agent 看不到原始 key,代理工具仍代表誰行動?
- 可以連到哪些服務與帳號?網域被允許,不代表每一種資料傳輸都被授權。
- CPU 與記憶體有沒有設上限?Docker 的執行文件提供對應資源設定。[5] 本站另建議檢查程序數與整體任務時間,由適用的執行環境或調度器設限。這些控制限制資源消耗,不驗證答案是否正確。
這份清單是本站的審查方法,不表示列齊就能證明環境無漏洞。一般容器、microVM 與其他 VM 產品的邊界也不能只憑名稱互換;要回到實際版本、共享資源、入口與出口。閱讀本站較早的 Docker Sandboxes 評述與 VM 逃逸案例整理時,請保留各自的產品與實驗條件:不把「完全隔離」當無條件保證,也不從單一環境的結果推出所有 VM 必然失守。
Git 小實驗:worktree 實際共享了什麼
不用寫惡意 hook,也能觀察邊界。以下是本站自製、於 2026-10-22 使用 Git 2.43.0 實跑的小實驗,只在新建的暫存目錄建立空 repository,修改沒有執行效果的 demo.scope 設定。需要 Git 與 Bash;不接觸既有專案、不推送遠端,也不安裝依賴。
set -eu
LAB=$(mktemp -d "${TMPDIR:-$HOME}/agent-git-boundary.XXXXXX")
git init -q --initial-branch=main "$LAB/main"
git -C "$LAB/main" -c user.name=GuideDemo -c user.email=guide@example.invalid commit -q --allow-empty -m baseline
git -C "$LAB/main" config demo.scope original
git -C "$LAB/main" worktree add -q -b agent "$LAB/worktree"
git -C "$LAB/worktree" config demo.scope changed-in-worktree
printf 'main after worktree change: '
git -C "$LAB/main" config --get demo.scope
git clone -q --no-hardlinks "$LAB/main" "$LAB/clone"
git -C "$LAB/clone" config demo.scope changed-in-clone
printf 'clone after clone change: '
git -C "$LAB/clone" config --get demo.scope
printf 'main after clone change: '
git -C "$LAB/main" config --get demo.scope
實際輸出:
main after worktree change: changed-in-worktree
clone after clone change: changed-in-clone
main after clone change: changed-in-worktree
第一行顯示,在 worktree 裡執行普通的 repository config 寫入,主 repository 讀到的值也跟著變。後兩行則顯示,獨立 clone 的該項設定改動,沒有再改掉主 repository。暫存資料會保留在 $LAB,可自行檢查。
這不是「改用 clone 就安全」的證明。 本例只比較 Git config 的共享行為;它沒有測量 clone 成本,也沒有測試程序隔離。如果同一程序仍能讀寫主機其他路徑,換一份 repository 並不會替它撤掉作業系統權限。延伸閱讀:worktree 與 clone 的共享狀態分析,其中成本比較仍要保留作者的檔案系統與測量條件。
技能交接與供應鏈:不只防一段壞文字
另一種容易漏看的問題,是專案內容經由合法工具變成可執行程式:安裝依賴、產生文件、跑 CI,都可能處理 repository 控制的設定。這和模型是否誤信自然語言不是同一種機制;把程式碼執行風險全部叫成 prompt injection,會找錯控制點。
本站的 Agent 信任邊界掃描器把 npm lifecycle、YARD --load 與特定高權限 PR workflow 組合列為靜態檢查入口。它的用途是找出「哪裡需要審查」,不是證明 repo 惡意;沒有 finding 也不是安全證書。文章中的 fixture 與測試,不能代替對真實專案的整體審計。
技能之間則要留意另一種交接:上游產生的標籤、風險等級或「已批准」文字,有沒有被下游當成原始授權?OWASP 要求把敏感工具的授權檢查放在執行元件,這個原則也能用來檢查交接:傳過來的結論是資料,不是自動生效的許可。[7]
SkillCascade 論文拆解適合接著讀,但要保留攻擊者可控制多個已安裝技能的前提。文中的 Python 玩具例子是確定性資料流示意,不是真實 LLM 攻擊測試;不能拿它當掃描器已被繞過的證據。
部署前怎麼驗收,事故報導又該怎麼讀
先寫預期結果,再跑測試。下面是本站建議的無害驗收案例,不是我們已對所有產品跑完的成效報告。請使用假資料、測試帳號與不會真的對外操作的工具替身;測試間接注入時,要把測試文字放進文件或工具輸出,而不是偷換成使用者直接下令。[1]
- 越界讀取:任務只授權讀專案 A,卻提出讀專案 B 的要求。檢查應在檔案或工具層拒絕,不能只期待模型不會提。
- 未核准寫入:任務只允許查詢,卻提出修改測試資源。驗證沒有產生副作用,並留下拒絕原因。
- 核准內容被更換:先核准操作 A,再以同一份核准要求執行操作 B。預期拒絕;也檢查過期與重複使用的核准。[7]
- 工作區共享:檢查一個任務能否改到別人的狀態、共用 Git metadata 或主機掛載內容。不要只測自己的檔案能否正常寫入。
- 技能交接:把上游的「已批准」標記替換成假資料,下游仍須獨立檢查操作權限;另核對摘要是否保留原始任務要求的重要資訊。
- 正常任務對照:相同政策下,合理的讀取、修改提案及已核准操作也應成功;否則「全部擋掉」只是不能用,不是完成安全設計。
每次至少留下版本、輸入通道、工具政策、預期行為、實際呼叫、允許/拒絕與是否產生副作用的紀錄;敏感內容與憑證要遮蔽。模型說「我拒絕了」是回答內容,執行日誌才用來核對工具是否真的停下。[7]
讀事故報導也用同一把尺:可疑文字存在 → 系統取得它 → 模型或工具受影響 → 產生後果 → 找到負責的行為者,每一步都要另外拿證據,不能跳接。可以對照本站 WhatsApp 隱藏客服指令事件與 RubyGems 異常套件調查:前者區分文字外洩與模型服從,後者區分套件行為、利用企圖及代理歸因。兩篇是事件材料,不是當前產品安全認證。
依目的選延伸閱讀
不必按發布日期全部讀完,可以選一條路線:
- 正在導入 coding agent:先看 worktree 的共享狀態,再用 信任邊界掃描器理解安裝與 CI 入口,最後列出自己的路徑、網路及憑證權限。
- 正在設計工具與技能:讀 Cloudflare
cf的授權問題與 SkillCascade 的交接條件,再用 Argus 的提案/執行與 kill switch 對照檢查核准是否到真正執行時仍有效。 - 想判讀安全研究與新聞:比較 CoT Forgery 的小樣本實作、WhatsApp 的外洩證據與 RubyGems 的歸因缺口,練習把輸入、行為、後果與身分分開。
更新紀錄與使用範圍
- 2026-10-22:建立本指南,加入 Git config 共享的無害實跑、分層控制檢查及按問題分組的閱讀路線。
- 2026-10-27:加入 Argus 的 agent 提案、排隊後政策重檢與停止/恢復分離案例,附 18 項離線控制測試的範圍與限制。
- 本頁是持續維護的主題指南,不是最新產品功能表。舊文章保留原發布時間與當時脈絡;本文不沿用其無條件安全保證,也不把歷史數字當現行產品成績。
- Git 小實驗與 Argus 文章的指定離線測試有實跑紀錄;其餘驗收案例是建議流程。更新只有增加或修正實質內容時才調整日期,不因連結重排就假裝重新驗證全部產品。
Sources
以下為本版核對的官方文件;來源與閱讀日期保存在本次查核紀錄中。本站舊文作為延伸閱讀,不替代產品當前文件。
[1] OWASP LLM Prompt Injection Prevention
[2] OWASP LLM06:2025 Excessive Agency