> 九號工具站
返回列表

AI Agent 安全實戰:我攤開自己的 70 條 Claude Code 權限清單後改了什麼

Prompt injection 在 OWASP 2026 版還是第 1 名。我把自己 repo 的權限清單攤開重看:70 條 allow、0 條 deny,裡面躺著 curl、git push、ssh 到正式機。這篇講 2026 真的出事的 4 個案例、官方沙箱管到哪,還有我改掉的 5 件事。

AI Agent prompt injection Claude Code MCP 資安 2026
· 最後更新 2026-09-06 · 最後審閱 2026-09-06

💡 這篇不是資安研究報告,是我把公開案例讀完之後,回頭審自己這個 repo 的 agent 權限設定所留下的紀錄。給每天讓 AI agent 動自己 code、而且那份 code 會自動部署到正式機的人。

1. 先講結論:擋不住的是注入,能控的是權限

有人問我:「Claude Code 幫我讀 GitHub issue、讀網頁,會不會有人在裡面塞指令叫它做別的事?」短答:會,而且 2026 年 4 月已經有人在三款主流 coding agent 上把整條攻擊鏈示範完。長答是這件事在架構上沒有乾淨解 —— 指令跟資料共用同一條管線,也就是 context window,SQL 那種參數化查詢的對應物並不存在。所以能操作的不是「怎麼讓模型不上當」,是「上當那一次它手上有多少權限」。這篇給你 2026 年真的出事的 4 個案例、Claude Code 官方文件寫明擋得住與擋不住的清單、沙箱兩層隔離各自管什麼,還有我把自己 repo 的權限清單攤開重看之後改掉的 5 件事。

小提示

  • 如果你只有十分鐘,跳到第 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

OWASP Top 10 for LLM Applications 2026 在 2026-08-03 發佈。排名怎麼動,剛好對應上面那四件事:
  • 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. 為什麼「模型變聰明就好」不是防線

Anthropic 在 2025-11-24 公開過自己的量測:用內部的 Best-of-N 攻擊者,對每個環境嘗試 100 次,把各種注入手法混著試。他們的三層防禦是這樣疊的:
  • 模型訓練層

    用強化學習把抗注入直接練進模型能力裡

  • 分類器層

    掃過所有不可信內容,標出隱藏文字、被動過手腳的圖片、誘導性的介面元素

  • 紅隊層

    人類資安研究員加上對外的競技場式挑戰

  • 三層疊完的結果是 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 的兩層隔離,還有它明講不管的事

Claude Code 內建的 bash 沙箱在 macOS 用 Seatbelt、Linux 與 WSL2 靠 bubblewrap 加 socat,原生 Windows 不支援。它是兩個各自獨立的層:
  • 沒有內建的憑證黑名單

    官方原話是 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

上面都是別人的事故與官方文件。輪到自己:我這個 repo 每天用 Claude Code 開發,我把 .claude/settings.local.json 印出來數了一遍,看到的東西不太好看。
  • 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 讀外部內容時的隔離做法

這個 repo 的規則有一部分本來是為了「多個 session 同時跑不要打架」寫的,但拿來當 blast radius 控制剛好合用。現在寫在 CLAUDE.md 裡的是這幾條:
  • 讀外部內容的工作丟給子 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. 最後

AI agent 的安全問題不是「模型會不會被騙」,是「被騙那一次它手上握著什麼」。OWASP 把 Excessive Agency 往上拉三名、GitHub 把 Comment and Control 歸類成架構限制、Anthropic 在自家研究裡承認 1% 仍是風險 —— 三件事講的是同一句話。明天可以做的第一件事只要五分鐘:打開你的 .claude/settings.local.json,把 allow 陣列的長度數出來,再看裡面有沒有 curl、git push、ssh 這三個字。有的話,先把它們搬出專案設定。這幾個 CVE 的版本號與 OWASP 的排名都會再變,這篇我會隨新版本回來更新。

小提示

  • 接下來值得盯的是 OWASP 的 Agent Control Standard,以及各家 coding agent 對「非互動模式下的信任驗證」會不會補上設計

11. 資料來源與擷取日期

這篇的 CVE 編號、版本號、日期與百分比都來自下面幾個來源,擷取日期都標了,你可以自己去對:

版本號與排名變得很快,官方再出新版時我會回來改,不會讓舊數字掛在上面。

重點整理

  • 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」
ℹ️

一般聲明

本站提供之資訊僅供參考,不保證其完整性與正確性。使用者應自行判斷資訊之適用性。

意見反饋