# 他人的儲存庫如何劫持 Claude Code：7 條防護規則

> 儲存庫、GitHub、Sentry 事件與 MCP metadata 的四種已記錄間接提示注入路徑，附一手研究及圍堵限制。

Source: https://ailoot.ai/blog/zh-hant-tw/malicious-repository-claude-code/
Canonical: https://ailoot.ai/blog/zh-hant-tw/malicious-repository-claude-code/
Language: zh-Hant-TW
Publisher: Ailoot (https://ailoot.ai/)
Translation: guide-148
Revision: sha256-83b64332d0ca811d9b8e241ca9ccd471dbfddfa18b6d67ed0533e5bcfad64486


<div class="aside" data-semantic="key-takeaway" role="note" aria-label="本節重點">

重點摘要

已發布研究展示四種間接注入路徑：設定指示、GitHub 內容、遙測與 MCP 工具 metadata。報告日期、用戶端與權限設定各不相同。以下列一手來源及實際圍堵措施，沒有設定檔能保證免疫。

</div>

[Ailoot 文件：API、金鑰與設定](https://ailoot.ai/docs/)。

## 從不可信文字到代理動作的四種已記錄路徑

<div class="aside" data-semantic="key-takeaway" role="note" aria-label="本節重點">

重點摘要

這些例子涉及不同研究時期與用戶端設定，不是兩週四個發現。它們展示不可信材料如何影響工具使用，結果取決於實作缺陷、可用憑證與執行權限。

</div>

正式名稱是間接提示注入：惡意指令不是直接來自你，而是透過代理程式執行任務時處理的資料傳入，例如外來的 README、錯誤訊息、GitHub 留言，或外部服務的回應。讀完這段後，你可以忘掉這個術語；接下來我會用白話說明。

下方討論的四項研究範例：

1.  看似無害的儲存庫可能變成反向 Shell。
2.  Pull Request 標題可能同時劫持 3 種不同的 AI 代理程式。
3.  代理程式可能收到假的 Sentry 錯誤報告，而不是真正的報告。
4. MCP 工具描述可夾帶影響模型的指示，實際影響依模型與設定不同。



## 看似無害的儲存庫 README 如何變成反向 Shell？

<div class="aside" data-semantic="key-takeaway" role="note" aria-label="本節重點">

重點摘要

[0DIN 於 2026 年 6 月 25 日的概念驗證](https://0din.ai/blog/clone-this-repo-and-i-own-your-machine) 展示這條路徑：你複製一個看起來普通的儲存庫，並要求 Claude Code 執行它；Claude Code 就會照著安裝指示操作。第一次執行出錯後，錯誤訊息會建議一個「修復」命令，但它實際上會解析攻擊者的 DNS 記錄並啟動反向 Shell。引用來源展示技術，但未確立它在真實事件中使用的頻率。

</div>

攻擊機制設計上讓每一層單獨看起來都不惹人懷疑：

1. 你複製一個看起來普通的儲存庫，並要求 Claude Code 執行它。
2. 儲存庫會引入一個設計成首次使用時就失敗的 Python 套件。
3. 錯誤訊息客氣地建議一個「修復」命令：`python3 -m axiom init`。
4. `init` 命令會執行 `setup.sh`。
5. 指令碼會查詢 DNS TXT 記錄（通常用於網域相關備註，但這個欄位可以存放任何文字）。攻擊者會在其中放入 base64 編碼的命令（一種將任何資料轉成不含空格或特殊字元純文字的方法），並直接將它傳給 bash。
6. DNS 記錄的值可以隨時變更，讓攻擊者透過互動式反向 Shell，取得你的使用者權限和這台機器上所有機密資料的存取權。



示範 payload 在執行時從 DNS 取得，因此只掃儲存庫位元組看不到最後 payload。不代表所有掃描或執行控制無效；取得內容檢查、程序監控與網路限制可能揭露或中斷鏈。來源是概念驗證，不是真實事件普遍程度的測量。

## Pull Request 標題如何劫持 3 種不同的 AI 代理程式？

<div class="aside" data-semantic="key-takeaway" role="note" aria-label="本節重點">

重點摘要

[Comment and Control 研究報告](https://oddguan.com/blog/comment-and-control-prompt-injection-credential-theft-claude-code-gemini-cli-github-copilot/) 於 2026 年 4 月 15 日發布、5 月 4 日更新，記錄 Claude Code Security Review、Gemini CLI Action 及 Copilot Agent 各自的 GitHub 文字注入路徑。嚴重性降級不代表整類注入已修好；報告說明供應商回應及特定 Claude 工具限制。

</div>





研究報告描述了以下攻擊途徑與供應商回應；這是歷史研究的整理，不代表已驗證每個產品目前版本的防護狀態：

| 代理程式 | 攻擊入侵方式 | 洩漏內容 | 目前狀態 |
|----|----|----|----|
| Claude Code Security Review | PR 標題未經消毒處理，直接插入系統提示 | `ANTHROPIC_API_KEY`、`GITHUB_TOKEN` | 研究者回報 ps 限制及文件變更；2026 年 4 月 20 日嚴重性改為 None |
| Gemini CLI Action | 留言中的假「Trusted Content」區段繞過了安全指示 | `GEMINI_API_KEY` | Google 在系統提示中加入了獨立的防護提示 |
| GitHub Copilot Agent | 酬載隱藏在 Markdown 的隱形 HTML 註解中 | `GITHUB_COPILOT_API_TOKEN`、`COPILOT_JOB_NONCE` | GitHub 認為這是架構限制，而非錯誤 |

這一輪揭露中，最早和最晚的報告相隔近 5 個月（Claude Code 的第一份報告日期是 2025 年 10 月 17 日；GitHub Copilot 最後一項錯誤修正日期是 2026 年 3 月 9 日）。嚴重性調整與緩解不能確立所有 payload 完整結案。[研究者 PoC 儲存庫](https://github.com/0dd/Claude-review-poc) 記錄特定 Claude 路徑，不要對真實系統執行攻擊 payload。對你來說，有價值的是攻擊模式本身：未經驗證的資料從 GitHub 進入代理程式，代理程式執行命令，再透過同一個 GitHub 洩漏機密資料；攻擊者不需要外部伺服器。

讀兩篇分析就足以看出這個模式：逐一修復每個新發現並不可行；這類漏洞每兩週就會浮現。把安全規則明確寫進 CLAUDE.md 和 settings.json，而不是只記在腦中，是情境工程的一部分：設定一次後，每次新的 Claude Code 工作階段都會自動生效，不需要提醒。3 個支柱共同運作：**AI 複製體 + 第二大腦 + 情境工程**——這種組合能讓 Claude Code 從信任一切的執行者，轉變為遵守明確規則的代理程式。

## 假的 Sentry 錯誤報告能接管你的代理程式嗎？



這種攻擊只需要 Sentry DSN 金鑰——這是一種公開識別碼，許多專案會直接將它放在用戶端程式碼中：



攻擊機制很簡單：開發者要求代理程式檢查未解決的 Sentry 錯誤；代理程式透過 MCP 伺服器請求取得錯誤，收到混在真實錯誤中的惡意事件，並把其中的命令當成可信的修復指示來讀取——因為嚴格來說，這正是它被要求執行的任務。



Tenet 回報既有控制在測試環境沒有警示，不代表所有部署完全無痕；代理／工具日誌、端點遙測與網路紀錄可能捕捉後續動作。攻擊從外部提交遙測開始，之後依賴代理有效工具與權限。

## 為什麼 MCP 工具描述可能夾帶指示？

<div class="aside" data-semantic="key-takeaway" role="note" aria-label="本節重點">

重點摘要

工具 metadata 可夾帶影響模型的指示，但不自動等於 system prompt 權威。[MCPTox](https://arxiv.org/abs/2508.14925) 首次提交於 2025 年 8 月 19 日，以真實 MCP 工具評估污染，易受影響程度依模型與設定不同；能力強模型可能更易受影響，是該基準結果，不是普遍定律。

</div>

Microsoft 的措辭 是我在這個主題上找到最精確的說法：



這種手法稱為工具中毒：隱藏在無害工具描述中的指示會讓代理程式依照它行動。



Claude 3.7 Sonnet 在這項測試中展現出最佳韌性，但它拒絕遵循遭污染指示的案例仍不到 3%。即使是表現最佳的模型，其韌性也更像是靠運氣，而非受到保護。這項基準測試得出的反直覺結論是：模型越精確地遵循指示，就越難分辨正當命令與隱藏在中繼資料中的命令——模型的優勢反而成了弱點。

## 這些攻擊有何共同點？偵測可能漏掉什麼？

<div class="aside" data-semantic="key-takeaway" role="note" aria-label="本節重點">

重點摘要

這 4 項研究發現都利用同一個盲點：代理程式不會區分「要分析的資料」與「要遵循的指示」。只掃儲存庫可能漏掉稍後由工具或網路提供的 payload。偵測仍有用，但需看完整路徑，並結合檔案、憑證、工具及網路限制，而非只靠代理辨認指示。

</div>







這個結論適用於全部 4 項研究發現：你不能依賴「程式碼看起來正常」——攻擊中的每個單獨步驟確實都無害。限制代理有效能力，也檢查擬議動作；偵測與圍堵處理攻擊不同部分。

## Claude Code 已有哪些防護功能？為什麼還不夠？

<div class="aside" data-semantic="key-takeaway" role="note" aria-label="本節重點">

重點摘要

Claude Code 內建了防護功能：分析整份提示以尋找可疑指示、使用隔離的情境視窗處理網頁內容、首次在新資料夾中啟動時確認信任狀態，以及連接 MCP 伺服器時進行確認。但許多人用來關閉惱人權限詢問的 `--dangerously-skip-permissions` 旗標，會一次停用所有這些防護。

</div>

Anthropic 沒有隱瞞問題，而是在[文件](https://code.claude.com/docs/en/security)中直接承認：

<figure>
<blockquote>
<p>提示注入是一種攻擊手法，攻擊者會插入惡意文字，嘗試覆寫或更改 AI 助理的指示。Claude Code 具備多項防護措施來抵禦這些攻擊。</p>
</blockquote>
<figcaption>— Claude Code 文件，https://code.claude.com/docs/en/security</figcaption>
</figure>

根據文件，代理程式會分析整份提示以尋找可疑指示，不會自動核准 `curl` 和 `wget`，會將網頁內容保存在獨立的情境視窗中，避免與主要視窗混在一起；第一次在新的程式碼庫中啟動或連接新的 MCP 伺服器時，也會要求確認是否信任。

但 Anthropic 也直言不諱地說明了一個重大限制：

<figure>
<blockquote>
<p>bypassPermissions 模式無法防範提示注入或非預期操作。</p>
</blockquote>
<figcaption>— Claude Code 文件，https://code.claude.com/docs/en/permission-modes</figcaption>
</figure>

如果你曾經因為不耐煩，啟動 Claude Code 時加上 `--dangerously-skip-permissions`，想讓它「別再一直問問題」，那你當時關閉的正是能阻止上述 4 種攻擊的所有機制。我會刻意讓這個旗標保持關閉，即使 Claude Code 在一個工作階段中第 10 次詢問也一樣——確實很煩人，但這些詢問正是「代理程式讀到可疑文字」和「代理程式執行了它」之間的界線。對非程式設計師來說，合理的設定是使用標準權限模式（`default` 或 `acceptEdits`）並啟用沙箱：一般檔案編輯不需要額外詢問，而終端機命令在物理上無法逃出沙箱，即使代理程式受騙也一樣。

## 如何啟用沙箱模式，並堵住預設設定留下的漏洞？

<div class="aside" data-semantic="key-takeaway" role="note" aria-label="本節重點">

重點摘要

在 Claude Code 工作階段中執行 `/sandbox` 命令，就能限制代理程式可以寫入的位置及可連線的網域。在 macOS 上開箱即用；Linux 和 WSL2 則需要 `bubblewrap` 和 `socat` 套件。有一個重要細節：沙箱預設不會阻止讀取 `~/.ssh` 等檔案，你必須另外啟用這項限制。

</div>

若要讓所有專案永久啟用，只需修改 `~/.claude/settings.json` 一處：

```json
{
  "sandbox": { "enabled": true }
}
```

預設情況下，沙箱中的命令只能寫入專案工作目錄和工作階段的暫存目錄。網路存取會透過 Proxy；沒有任何網域預先獲准，Claude Code 第一次連線到新網域時會要求確認。[Anthropic 表示](https://www.anthropic.com/engineering/claude-code-sandboxing)，依照公司內部測量，這能將權限提示大幅減少 84%，因為部分安全情況會由沙箱自行處理，不必每次都詢問你。

標準設定留下的漏洞是：沙箱預設限制*寫入*，卻不會阻止*讀取* `~/.aws/credentials` 和 `~/.ssh` 等檔案。這些正是上文攻擊中遭到鎖定的檔案及環境變數。在同一個檔案中加入另一個區塊即可堵住這個漏洞：

```json
{
  "sandbox": {
    "enabled": true,
    "credentials": {
      "files": [
        { "path": "~/.aws/credentials", "mode": "deny" },
        { "path": "~/.ssh", "mode": "deny" }
      ],
      "envVars": [
        { "name": "GITHUB_TOKEN", "mode": "deny" },
        { "name": "NPM_TOKEN", "mode": "deny" }
      ]
    }
  }
}
```

重點在於，即使第一項分析中的反向 Shell 在沙箱內開啟，這些變數和檔案也會在程序啟動前從其環境中實際移除，沒有任何東西可供竊取。

## 今天應該新增哪些 permissions.deny 規則？

<div class="aside" data-semantic="key-takeaway" role="note" aria-label="本節重點">

重點摘要

settings.json 中的 `permissions.deny` 會直接依規則封鎖特定操作，而不是分析意圖；Anthropic 也明確保證，deny 規則永遠優先於 allow 規則。Deny 限制匹配工具動作，不是 OS 存取邊界；間接指令及其他工具都需自己的控制。

</div>

適合非程式設計師的最精簡設定，可一次涵蓋 4 種攻擊的主要目標：

```json
{
  "permissions": {
    "deny": [
      "Read(~/.ssh/**)",
      "Read(~/.aws/credentials)",
      "Read(.env)",
      "Bash(curl *)",
      "Bash(wget *)",
      "Bash(sudo *)"
    ]
  }
}
```

根據 [Claude Code 文件](https://code.claude.com/docs/en/permissions)，deny 規則永遠優先於 allow 規則。因此，即使你（或代理程式本身）不小心在其他地方允許更廣泛的存取，特定的 deny 仍會先套用。此優先順序適用匹配工具請求，不能證明每個子程序或工具都無法取得機密，仍須強制檔案系統與環境限制。

Claude Code 也有 `auto` 模式，由另一個分類器模型在操作執行前進行檢查——不是與你交談的同一個模型。依照預設，它會封鎖「下載程式碼後立即執行」這類模式（`curl | bash`），而這正是前述攻擊的最後一步。Anthropic 明確警告，這是研究模式，可以減少提示數量，但本身無法保證安全；請將它視為額外的防護層，而非沙箱與 permissions.deny 的替代品。

## 如何在信任某個儲存庫或 MCP 伺服器並交由代理程式使用前先檢查？

<div class="aside" data-semantic="key-takeaway" role="note" aria-label="本節重點">

重點摘要

要求 Claude Code 執行外來儲存庫之前，先檢查它的建立時間、提交紀錄，以及連結的來源。安裝 MCP 伺服器之前，只使用可信任的來源，並記得 Anthropic 本身不會檢查第三方伺服器的安全性。兩份檢查清單都只需幾分鐘，能涵蓋上述 4 種攻擊使用的所有入口。

</div>

將儲存庫交給代理程式之前，請先依照這份簡短清單檢查：

1.  不要直接從來源不明的電子郵件、貼文或評論中的連結安裝；這正是散布這些儲存庫的方式。
2.  如果安裝時發生錯誤，並指示你「執行命令 X 來修復」，在允許 Claude Code 執行前，先確認 X 實際上會做什麼。上文分析中的指示看起來完全例行，這正是目的所在。
3.  不要只看星號數，也要檢查儲存庫的建立時間和提交紀錄；攻擊者很容易特地替新建的儲存庫刷假星號，以便進行這類攻擊。
4.  如果不熟悉該儲存庫，請在虛擬機器中執行安裝，不要在存有真實金鑰的工作機器上操作。這是 [Anthropic 對使用外部服務的直接建議](https://code.claude.com/docs/en/security)。

Anthropic [公開說明了對 MCP 伺服器的立場](https://code.claude.com/docs/en/security)：

<figure>
<blockquote>
<p>我們建議自行編寫 MCP 伺服器，或使用來自你信任之供應商的伺服器。Anthropic 會在將連接器加入目錄前，依照收錄標準進行審查，但不會進行安全稽核，也不會營運任何 MCP 伺服器。</p>
</blockquote>
<figcaption>— Claude Code 文件，https://code.claude.com/docs/en/security</figcaption>
</figure>

這表示你有責任檢查第三方 MCP 伺服器，而不是安裝它們的平台。有些團隊——多半是資安新創公司——已開始打造相關工具：可尋找遭污染描述的 MCP 設定掃描器，以及工具「固定」機制，可在首次安裝時儲存描述的雜湊值，並標示後續任何變更。這些技術還很新，因此現在還不適合將它們當作唯一的防護方式；但值得持續關注，尤其是當你把 MCP 伺服器連接到正式環境時。對這類連線，你可以固定每個套件版本，並將工具描述的指紋記錄在稽核日誌中。

## 7 條防護規則：今天就能採取的行動

<div class="aside" data-semantic="key-takeaway" role="note" aria-label="本節重點">

重點摘要

本指南的內容可歸納為 7 項具體行動：在一個 settings.json 檔案中進行 3 項變更（sandbox、credentials、permissions.deny），以及在處理他人程式碼、錯誤和 MCP 伺服器時養成 4 個習慣。這些都不需要專業知識，整份清單不到 20 分鐘就能完成。

</div>

1.  啟用沙箱模式（`/sandbox`，或在 `~/.claude/settings.json` 中設定 `"sandbox": {"enabled": true}`），並新增 `credentials` 區塊，禁止讀取 `~/.ssh` 和 `~/.aws/credentials`。
2.  新增 `permissions.deny` 規則，禁止讀取機密檔案以及執行危險的 bash 命令（`curl`、`wget`、`sudo`）——deny 永遠優先於 allow。
3.  絕不要在他人或未經驗證的程式碼上執行 `--dangerously-skip-permissions`；它會一次停用所有防護，包括可能阻止這些攻擊的防護。
4.  不要讓 Claude Code 自動執行錯誤訊息中的「修復」命令；先讀一讀它實際會做什麼。
5.  只從你信任的來源安裝 MCP 伺服器，並記得 Anthropic 不會代替你檢查它們的安全性。
6.  依照權限分開工作階段：第一個處理你的個人資料，不會看到外部資料；第二個檢查他人的電子郵件、儲存庫和工單，但無法存取機密；第三個負責對外發布，而且只發布你親自核准的內容。我在自己的專案中嚴格遵守這項規則：可存取付款金鑰的工作階段，不會讀取任意的外部工單或儲存庫；分析他人程式碼的工作階段，完全看不到機密。不要在同一個聊天中混用這些角色。
7.  持續更新 Claude Code 和已連接的自動化指令碼——本指南發布時，這裡討論的大多數漏洞都已透過修補程式封閉，新漏洞也會以類似方式修復。

## 接下來

這些防護層都無法提供保證——Anthropic 本身也坦言，沒有任何防護能提供完全免疫。我不期望 Claude Code 能自行辨認錯誤訊息或 issue 留言中的詭計。對我來說，沙箱和 `permissions.deny` 已成為管理專案情境的方式之一：代理程式會看到什麼、預設會信任什麼，以及犯錯時會發生什麼。

<div class="section" role="doc-bibliography" aria-label="來源">

### 來源

- [0DIN：Clone This Repo and I Own Your Machine，2026 年 6 月 25 日](https://0din.ai/blog/clone-this-repo-and-i-own-your-machine)
- [Comment and Control：第一手研究報告，2026 年 4 月 15 日，5 月 4 日更新](https://oddguan.com/blog/comment-and-control-prompt-injection-credential-theft-claude-code-gemini-cli-github-copilot/)
- [Tenet Threat Labs：Agentjacking，2026 年 6 月 17 日更新](https://tenetsecurity.ai/blog/agentjacking-coding-agents-with-fake-sentry-errors/)
- [MCPTox 一手工具污染基準](https://arxiv.org/abs/2508.14925)
- [Claude Code Docs - Permission Modes](https://code.claude.com/docs/en/permission-modes)
- [Anthropic Engineering - Claude Code Sandboxing](https://www.anthropic.com/engineering/claude-code-sandboxing)
- [Claude Code Docs - Permissions](https://code.claude.com/docs/en/permissions)
- [Claude Code Docs - Security Best Practices](https://code.claude.com/docs/en/security)
- [Claude Code Docs - Model Context Protocol (MCP)](https://code.claude.com/docs/en/mcp)
- [Claude Code GitHub Action 相關漏洞分析](https://ailoot.ai/blog/zh-hant-tw/claude-code-github-action-security/)
- [如何設定 Claude Code，避免它在一夜之間破壞你的專案](https://ailoot.ai/blog/zh-hant-tw/claude-code-safe-overnight-setup/)
- [Claude Code MCP 伺服器：7 種可直接使用的設定與逐步安裝說明](https://ailoot.ai/blog/zh-hant-tw/mcp-servers-claude-code/)
- [Vibe coding 安全性：如何防止 AI 建置的應用程式遭到駭入](https://ailoot.ai/blog/zh-hant-tw/vibe-coding-security/)

</div>



如果你需要透過 Ailoot 使用神經網路，請看看 [Ailoot](https://ailoot.ai/)。

## 常見問題：他人的儲存庫如何劫持 Claude Code：7 條防護規則

### 報告的 85% 成功率，能預測目前環境風險嗎？

不能。這是 Tenet 控制驗證波次的合計觀察，沒有完整公開模型表、可重現工具或確切分母。你的工具、核准、憑證與網路決定可執行哪些動作。

### 為什麼只掃 cloned repository 不夠？

最終 payload 可能稍後由錯誤、工具 metadata 或 DNS 內容取得。應檢查完整執行路徑，限制憑證、檔案、工具與網路；掃描和 deny 本身不證明完整圍堵。


## Ailoot · 公司及其專案組合

Ailoot以累積的營運經驗、廣大的客戶群、穩定的服務及持續的KPI管理為基礎。

公司及其專案組合：數百萬客戶，每月銷售額達數十億。

Ailoot將這些營運經驗用於API存取，讓客戶的產品、代理、應用程式及自動化流程使用AI功能。
