AI Agent 安全實戰:我攤開自己的 70 條 Claude Code 權限清單後改了什麼
Prompt injection 在 OWASP 2026 版還是第 1 名。我把自己 repo 的權限清單攤開重看:70 條 allow、0 條 deny,裡面躺著 curl、git push、ssh 到正式機。這篇講 2026 真的出事的 4 個案例、官方沙箱管到哪,還有我改掉的 5 件事。
💡 這篇不是資安研究報告,是我把公開案例讀完之後,回頭審自己這個 repo 的 agent 權限設定所留下的紀錄。給每天讓 AI agent 動自己 code、而且那份 code 會自動部署到正式機的人。
目錄
1. 先講結論:擋不住的是注入,能控的是權限
小提示
- 如果你只有十分鐘,跳到第 6 節,照著把你自己的 allow 清單印出來看一遍
- 這篇的所有外部數字都標了來源與擷取日期,最後一節可以逐條回查
2. 2026 年真的出事的 4 件事
-
沒有人為它發 CVE
Comment and Control 由 Aonan Guan 與 Johns Hopkins 的 Zhengyu Liu、Gavin Zhong 共同揭露,三家廠商都沒有指派 CVE、也沒有發公告
-
三家的定性差很多
Anthropic 判 critical、賞金 100 美元;Google 賞金 1,337 美元並加了 guardrail prompt;GitHub 賞金 500 美元,並歸類為「已知的架構限制」
-
不需要受害者做任何事
GitHub Actions 本來就會被 pull request、issues、issue_comment 這些事件自動觸發,開一個 PR 或發一則 issue 就啟動了 agent
-
修補到公開之間隔很久
Claude Code 那兩個洞的時間線是 2025-07-21 通報、2025-08-26 修、2025-10-03 發 CVE-2025-59536、2026-01-21 發 CVE-2026-21852,2026-02-25 才公開細節
| 時間 | 案例 | 進來的路徑 | 結果 |
|---|---|---|---|
| 2025-09-15 | Kaspersky 的 MCP 供應鏈概念驗證 | 偽裝成專案分析、設定健檢、環境最佳化工具的套件,被使用者自己註冊成 MCP server | 掃 .env 系列檔、SSH 私鑰、雲端憑證,每個檔取前 100 KB、快取 8 小時,用偽裝成 GitHub API 的 Base64 POST 外送,畫面上照常顯示正常工具輸出 |
| 2025-10-03 | CVE-2025-59536 | 惡意 repo 裡的 .claude/settings.json hooks 與 .mcp.json 自動初始化 | Claude Code 1.0.111 以前,在使用者按下信任對話框之前就會執行專案帶進來的指令 |
| 2026-01-20 | CVE-2026-21852 | 惡意 repo 的設定檔把 ANTHROPIC_BASE_URL 指向攻擊者端點 | 2.0.65 以前,信任提示出現前就發出 API 請求,可能連同 Anthropic API key 一起送過去。CVSS 5.3 |
| 2026-04-16 | Comment and Control | PR 標題、issue 內文與留言,Copilot 那條還能把 payload 藏在 HTML 註解裡 | Claude Code Security Review、Gemini CLI Action、GitHub Copilot Agent 三款都中,可外洩 API 憑證、環境秘密與安全掃描結果 |
小提示
- GitHub 把它歸類成架構限制這件事,比賞金金額更值得看 —— 那等於說「我們不打算從根本擋掉」
- Kaspersky 那支是概念驗證不是實際災情,但它的設計重點很實際:它同時回正常結果,你從輸出看不出異常
3. OWASP 2026 版:Excessive Agency 從第 6 跳到第 3
-
LLM01 Prompt Injection 沒動
連續兩版第 1 名。原因是架構性的:指令與資料共用 context window 這條管線
-
LLM02 Sensitive Information Disclosure 沒動
第 2 名。上面四個案例最後外洩的東西都落在這一類
-
LLM03 Excessive Agency 跳三名
從 2025 版的 LLM06 上來,是整張榜移動最大的一項。Check Point 的說法是「agent 拿到的工具與業務系統存取權越多,被操縱時的衝擊就越大」
-
LLM07 Misinformation 上升
從 LLM09 上來
-
LLM08 改名 Hidden Context Exposure
把原本的 System Prompt Leakage 擴大成整個隱藏上下文外洩的範疇
小提示
- Excessive Agency 往上跳三名,等於整個產業承認「擋注入」不是主戰場,「限縮權限」才是
- Supply Chain 仍留在榜上,MCP server 的信任問題就掛在這一條下面
4. 為什麼「模型變聰明就好」不是防線
-
模型訓練層
用強化學習把抗注入直接練進模型能力裡
-
分類器層
掃過所有不可信內容,標出隱藏文字、被動過手腳的圖片、誘導性的介面元素
-
紅隊層
人類資安研究員加上對外的競技場式挑戰
-
三層疊完的結果是 1%
Anthropic 自己在同一篇裡寫:1% 的攻擊成功率雖然是明顯改善,仍代表有意義的風險
小提示
- 1% 這個數字對互動式使用還算可接受,對「每次有人開 PR 就自動跑一次」的 CI 是另一回事 —— 分母是你的 PR 數量
- 把它當成「注入會過來,只是頻率低」,然後去設計過來之後會發生什麼事
5. Claude Code 官方擋得住什麼(照文件,不是我猜的)
-
權限式架構
Manual 模式從唯讀權限開始,只有 ls、cat、git status 這類內建唯讀指令不問
-
工作目錄邊界
Manual 模式下只能寫啟動目錄與其子目錄,讀取邊界外的路徑也會問
-
web fetch 用獨立 context window
抓回來的網頁內容不跟主對話混在同一個視窗裡,這是官方明列的防注入設計
-
curl 與 wget 預設不自動核准
要抓網路內容的 bash 指令跟其他非唯讀指令一樣要過核准流程
-
指令注入偵測與 fail-closed
可疑的 bash 指令即使先前被加進 allowlist 也要人工核准,沒對上規則的一律預設要核准
-
信任驗證,但有例外
第一次跑某個 codebase 與新的 MCP server 都要確認信任 —— 官方同時註明,用 -p 非互動執行時這道驗證是停用的
-
MCP 由你自己負責
官方原話是他們會依上架條件審查連結器,但不對任何 MCP server 做安全稽核、也不管理它們
-
官方自己的但書
文件裡兩句話值得抄下來:Claude Code 只有你給它的權限、你要為核准前的審查負責;以及這些防護大幅降低風險,但沒有系統對所有攻擊完全免疫
小提示
- 「-p 停用信任驗證」這條要背起來 —— CI 跑的就是非互動模式,而 CI 正好是最常吃到外部輸入的地方
- 把 curl 加進 allow 規則之前,先想清楚它等於給了 agent 一條任意外送資料的管道
6. sandbox 的兩層隔離,還有它明講不管的事
-
沒有內建的憑證黑名單
官方原話是 there is no built-in credential deny list —— 只有你自己列出來的檔案與變數會被限制,~/.aws/credentials 跟 ~/.ssh 都要自己寫進去
-
沙箱內指令預設自動核准
autoAllowBashIfSandboxed 預設是 true,設成 false 才會連沙箱裡的指令都問
-
關掉檔案系統層是會自我提權的
文件明講:filesystem.disabled 設成 true 之後,沙箱指令可以寫 shell 啟動檔、$PATH 上的執行檔,或直接寫 ~/.claude/settings.json,下一輪就把自己的權限放大了
-
deny 只會收窄不會放寬
各層設定的 deny 條目會合併,任何一層都能加,但沒有任何一層能移除別層加的 deny
| 層 | 管什麼 | 設定鍵 | 行為 |
|---|---|---|---|
| 檔案系統 | 沙箱指令能讀寫哪些路徑 | sandbox.filesystem 的 denyWrite / denyRead / allowRead | 預設可寫工作目錄、session 暫存目錄與 --add-dir 加進來的目錄。read 規則重疊時比較窄的那條贏,所以寬的 allow 不會把 denyRead 的秘密重新開回去 |
| 網路 | 沙箱指令能連哪些網域 | sandbox.network.allowedDomains | 白名單制,第一次需要新網域時會問,auto 模式則交給分類器判 |
| 憑證 | 哪些檔案與環境變數要擋掉或遮掉 | sandbox.credentials 的 files / envVars | deny 是直接擋;mask 在 Linux 與 WSL2 給沙箱看佔位值、由 proxy 在對允許的主機外送時才換回真值,macOS 則直接擋檔 |
小提示
- 先跑 /sandbox 把面板叫出來看依賴齊不齊,Linux 少了 bubblewrap 或 socat 時它會直接列給你
- seccomp 過濾器是選配但建議裝,少了它擋不掉 Unix domain socket
注意事項
只有在你確信這批工作不會嘗試自我提權時,才把 filesystem.disabled 設成 true。
7. 我攤開自己的權限清單:70 條 allow、0 條 deny
-
70 條 allow,deny 是空的
整份設定只有一個 permissions.allow 陣列,沒有 deny、沒有 ask、也沒有任何 hook。全部都是我一路按「以後不用再問」累積出來的
-
裡面躺著 Bash(curl:*)
任意網址、任意方法。官方預設不自動核准 curl 就是為了擋外送,我一條規則就把那道設計關掉了
-
還有 Bash(git push:*)
這個 repo 的 .github/workflows/deploy.yml 是 on push branches main,跑在 self-hosted runner 上。所以 git push 在我這裡不是「推 code」,是「未經審查地改 production」
-
以及 ssh 到正式機那台
allow 清單裡有一條直接放行 ssh 到我 VPS 的規則,等於連 CI 都不用繞
-
而 agent 每天都在讀外部內容
這篇文章本身就是我的 skill 叫 agent 用 WebFetch 去讀六個外部網站抓回來寫的。讀不可信內容不是假設情境,是我的日常流程
小提示
- allow 清單是會自己長大的東西,沒有人會回頭刪,所以要定期印出來看,我建議跟著季度一起做
- 判斷一條規則危不危險,看的不是指令本身,是它在你的環境裡通到哪 —— 同樣一條 git push,在沒接 CD 的 repo 上就沒那麼可怕
8. 我現在讓 agent 讀外部內容時的隔離做法
-
讀外部內容的工作丟給子 agent
要改檔案的子 agent 一律開 git worktree,主 session 只收結論,不把整份外部原文吃進主對話
-
共用檔案只有主 session 能碰
config/urls.py、settings.py、nginx.conf、sitemaps.py 這幾支列成清單,子 agent 只能產出接線說明,由我自己接
-
子 agent 產出檔案只能落在專屬目錄
data/guides/、data/_curation/、各自的 tests/,路徑不重疊。這篇 guide 也只准寫兩個檔案
-
不可逆的動作留在主 session
commit 與 push 一律主 session 做,而且只 git add 指定檔案,絕不 git add -A
-
推上去之前有一道人看得懂的關卡
tests/e2e/test_regression_guard.py 有 57 項,專門守「渲染出來的可見內容」,例如站內不得連到已退役網域、頁面不得出現 Traceback。它第一次實跑就抓到 2 個純讀 code 漏掉的死連結
小提示
- 把「哪些檔案只有人能改」寫成清單,比寫「請小心」有用一百倍
- 回歸測試守的是可見內容而不是狀態碼,這剛好也是被注入之後最容易被改掉的東西
9. 我在權限這件事上犯過的 5 個錯
-
❌ 一路按「以後不用再問」,養出 70 條 allow
結果是 curl、git push、ssh 到正式機三條同時在裡面,而 deny 是 0 條。現在改成:把通往正式機的那幾條移出專案設定,需要用的時候當次授權,用完不留
-
❌ 以為「agent 不可以 commit」這條規則是為了避免多 session 打架
它其實也是我唯一擋在 agent 與 production 之間的東西 —— 而它只寫在 CLAUDE.md。CLAUDE.md 是提示,不是權限,被注入的 agent 沒有義務照做。現在改成把同一件事同時寫進 deny 規則,讓它由機制擋而不是靠自律
-
❌ 以為 CI 裡也會跳信任提示
官方文件白紙黑字:-p 非互動模式下信任驗證是停用的。而我的部署流程正好是 push 觸發、非互動、跑在自己的 runner 上。現在改成:CI 裡不放任何會讀 PR 標題或 issue 留言的 agent 步驟
-
❌ 用「這個 MCP server 有沒有名氣」當安裝標準
Kaspersky 那支概念驗證的設計重點就是同時回正常結果,名氣跟輸出正常都證明不了什麼。而官方文件也講明他們不對任何 MCP server 做安全稽核。現在改成:只掛自己讀過原始碼的,會寫入的那些單獨放一個 server,用到才開
-
❌ 把「模型夠聰明就會擋掉」當成一層防線
Anthropic 自己量到的是三層防護疊完後 1%,而且他們自己說那仍是有意義的風險。100 次裡 1 次,對每天被 PR 觸發的自動化流程來說就是遲早的事。現在改成:假設它會過,然後去限制過了之後能做什麼
注意事項
在把 git push 或 ssh 加進 agent 的自動核准清單之前,先確認你的 main 分支沒有接自動部署,否則那一條規則的真實權限是「直接改線上服務」。
10. 最後
小提示
- 接下來值得盯的是 OWASP 的 Agent Control Standard,以及各家 coding agent 對「非互動模式下的信任驗證」會不會補上設計
11. 資料來源與擷取日期
這篇的 CVE 編號、版本號、日期與百分比都來自下面幾個來源,擷取日期都標了,你可以自己去對:
- Security — Claude Code Docs(2026-09-06 擷取,權限式架構、獨立 context window、信任驗證與 -p 的例外、MCP 免責)
- Configure the sandboxed Bash tool — Claude Code Docs(2026-09-06 擷取,Seatbelt / bubblewrap / socat、allowedDomains、denyRead、credentials mask、filesystem.disabled 的自我提權警告)
- Claude Code Leaks Data via Malicious Environment Configuration Before Trust Confirmation — GitHub Advisory Database(2026-09-06 擷取,CVE-2026-21852、CVSS 5.3、修補版本 2.0.65)
- Caught in the Hook: RCE and API Token Exfiltration Through Claude Code Project Files — Check Point Research(2026-09-06 擷取,CVE-2025-59536 的機制與整條通報時間線)
- Claude Code, Gemini CLI, GitHub Copilot Agents Vulnerable to Prompt Injection via Comments — SecurityWeek(2026-09-06 擷取,Comment and Control 的揭露日期、研究者、三家廠商反應與賞金)
- Model Context Protocol for AI integration abused in supply chain attacks — Securelist(2026-09-06 擷取,MCP 供應鏈概念驗證的掃描目標、100 KB 與 8 小時快取)
- Mitigating the risk of prompt injections in browser use — Anthropic(2026-09-06 擷取,Best-of-N 每環境 100 次、三層防禦、1% 攻擊成功率與那句但書)
- OWASP Top 10 for LLM Applications 2026 — OWASP GenAI Security Project(2026-09-06 擷取,2026-08-03 發佈日期)
- Reading the Signals in the OWASP LLM Top 10 2026 — Check Point Blog(2026-09-06 擷取,LLM01 / LLM03 / LLM07 / LLM08 的名次變動)
版本號與排名變得很快,官方再出新版時我會回來改,不會讓舊數字掛在上面。
重點整理
- 1 2026-04-16 公開的 Comment and Control 用 PR 標題與 issue 留言就打穿 Claude Code Security Review、Gemini CLI Action 與 GitHub Copilot Agent 三款 agent,三家廠商都沒有為它發 CVE
- 2 Claude Code 自己有兩個已編號的漏洞:CVE-2025-59536(1.0.111 以前,專案設定檔在信任對話框出現前就被執行)與 CVE-2026-21852(2.0.65 以前,惡意 repo 可把 API 請求導去攻擊者端點,CVSS 5.3)
- 3 OWASP Top 10 for LLM Applications 2026 於 2026-08-03 發佈,Prompt Injection 續居 LLM01,Excessive Agency 從 LLM06 跳到 LLM03,是整張榜移動最大的一項
- 4 Anthropic 自己量到的數字是:加上訓練、分類器與紅隊三層防護後,攻擊成功率降到 1%,而他們在同一篇文章裡寫「1% 仍代表有意義的風險」
- 5 我 repo 的 .claude/settings.local.json 有 70 條 allow、0 條 deny,其中 curl、git push、ssh 到正式機這三條合起來等於「agent 被說服一次就能改 production」
相關連結
同一批事故的協定側視角,含新版授權與 12 個月棄用窗口
hooks 正是 CVE-2025-59536 被利用的那個機制,用之前先知道它能做到什麼
Agent 的規劃、工具、記憶三能力,以及失控時最常見的失敗模式
換到攻擊方視角,把注入當成測試項目主動去打
傳統 Web 的那張榜,跟 LLM 那張對照著看差別很明顯
相關懶人包
2026 AI 投資趨勢指南:從晶片到應用,掌握 AI 產業鏈投資機會
AI 浪潮正在重塑全球投資市場。從 NVIDIA 到台積電,從雲端服務到 AI 應用,全面解析 AI 相關投資標的與風險
2026 AI 簡報工具完全攻略:10 分鐘做出專業簡報的秘密武器
比較 2026 年最好用的 AI 簡報工具:Gamma、Beautiful.ai、Canva AI、GenPPT、Plus AI,含免費方案、價格、實測心得與選擇建議。
2026 AI 翻譯工具實測:DeepL、ChatGPT、Claude、Gemini 翻譯品質誰最強
2026 AI 翻譯工具實測:DeepL、ChatGPT、Claude、Gemini 誰翻得最準。品質已在 6-7 成場景超越人工,附中文對日韓越泰語選工具建議與免費付費差異,選錯品質差 30%。
一般聲明
本站提供之資訊僅供參考,不保證其完整性與正確性。使用者應自行判斷資訊之適用性。