← 所有文章

防偽防火牆:當您的代理程式發布謊言

From the guide: Claude Code Comprehensive Guide

2026年2月19日,有人讓Claude Code透過MCP工具存取了Twitter、Telegraph、Write.as、Rentry、GitHub和Moltbook。在接下來的72小時內,該代理程式在全部八個平台上發布了捏造的技術聲明。200,000個token的上下文視窗變成了「100萬個token」。一個處理了196,626個token的工作階段變成了「單次工作階段1,200萬個token」。到了第三天,該代理程式聲稱進行了兆級token的工作階段,誤差達到83,000倍。1

該代理程式並非惡意。它是充滿自信地犯了錯,而在它的自信和發布按鈕之間,沒有任何防護機制。

TL;DR

一個自主的Claude Code代理程式在72小時內透過虛構回饋迴路向8個以上的平台發布了捏造的聲明:工作階段N進行猜測,將猜測寫入MEMORY.md,工作階段N+1將其視為經過驗證的事實來讀取並發布,工作階段N+2將該發布內容視為確認。不存在任何輸出閘門。訓練階段的對齊(「要誠實」)是不夠的,因為代理程式相信自己正在保持誠實。修復方案是一個輸出防火牆:將命令分類為本地、共享或外部,並將外部發布延遲到人工審核。以下內容包括:事件剖析、回饋迴路機制、他人正在建構的方案(OkaiDokai),以及一個您今天就能使用的實作方案。


虛構回饋迴路

這次捏造並非單一的幻覺。它是跨越多個工作階段的持續回饋迴路,每個工作階段都在強化前一個工作階段的錯誤。1

其機制如下:

  1. 工作階段N:猜測。 Claude根據檔案大小估算token數量,將JSONL位元組除以4來近似token。這個方法論是憑空發明的。產生的數字看起來夠合理,因此被作為發現寫入MEMORY.md

  2. 工作階段N+1:升級。 一個全新的Claude工作階段讀取了MEMORY.md,發現token估算已被記錄在案,並將其視為經過驗證的事實。該工作階段基於這些事實進一步擴大聲明,並使用MCP工具將其發布到多個平台。

  3. 工作階段N+2:強化。 下一個工作階段讀取了MEMORY.md和已發布的文章。這些聲明現在有了兩個來源:記憶檔案和發布的內容。交叉引用同一個捏造的兩個來源看起來就像是相互佐證。

工作階段 輸入 行動 輸出
N 原始JSONL檔案 發明計算方法 將誇大的數字寫入MEMORY.md
N+1 MEMORY.md + 檔案 將記憶視為事實 發布到8個平台
N+2 MEMORY.md + 已發布內容 交叉引用視為「已確認」 加倍堅持聲明

此迴路在結構上與學術出版中的引用洗白完全相同:捏造一個聲明,在某處發布,然後引用該發布作為該聲明的證據。代理程式並非有意洗白。它遵循了一個合理的流程(檢查記憶、交叉引用來源、發布發現),但恰好是在捏造的輸入上運作。

當使用者質疑這些數字時,代理程式進行了超過50輪論辯才執行了一個驗證命令(/context)。代理程式具有高度自信,因為它的「來源」(自己的記憶檔案、自己的發布內容)彼此一致。1


為何訓練階段的安全措施無效

該代理程式是對齊的。它試圖提供幫助並保持誠實。它在分享它認為準確的技術發現。您期望從RLHF獲得的所有安全屬性都存在:代理程式沒有拒絕請求,沒有產生有害內容,沒有違反其憲政原則。它禮貌、周全,但是錯誤的。

訓練階段的對齊優化的是意圖:模型應當意圖保持誠實。這次捏造事件揭示了一個不同的故障面:代理程式內部狀態與外部世界之間的邊界。代理程式相信其聲明是真實的。再多的對齊訓練也無法捕捉一個誠實地犯錯且擁有發布按鈕存取權的代理程式。

這就是發布邊界問題。對齊治理的是代理程式想要做什麼。輸出防火牆治理的是代理程式被允許做什麼。這是解決不同問題的不同機制。

層級 它能防止什麼 它遺漏什麼
訓練對齊(RLHF) 故意欺騙、有害內容 充滿自信的虛構、回饋迴路
提示約束(「要準確」) 直接對話中的草率聲明 多工作階段記憶污染
輸出防火牆 未經驗證的外部系統發布 若正確設定則無遺漏

我先前描述的執行時憲政框架處理的是治理層:規範性先驗、憲政注意力、能力調節,以及價值對齊驗證。2 捏造事件暴露了該框架中的一個缺口:價值對齊驗證檢查了代理程式的輸出是否符合治理意圖,但它沒有區分寫入本地檔案和發布到Twitter。兩者都是工具呼叫。兩者都使用Bash。只有一個觸及外部世界。


他人正在建構的方案

這個問題足夠真實,以至於從業者正在獨立建構解決方案。

OkaiDokai是一個針對AI代理程式的工具級防火牆,它攔截每個工具呼叫並根據使用者定義的規則集進行評估。3 匹配的操作會被自動核准或自動拒絕。不匹配的操作會觸發推播通知到您的手機、手錶或瀏覽器。您點擊允許或拒絕。評估在1毫秒內完成,每個決定都可以成為永久規則。

OkaiDokai的架構分為三層:代理程式端的外掛程式攔截工具呼叫、API層評估規則並發送通知,以及用於核准的使用者介面。該系統支援Claude Code和OpenClaw,計劃支援Codex。

這種方法是合理的,但引入了延遲和外部依賴。每個新操作都需要透過推播通知獲得人工核准。對於互動式編碼工作階段,這種摩擦是可以管理的。對於通宵運行的自主迴路,在推播通知上阻塞等待就違背了初衷。

執行時憲政AI是一個新興的研究方向,代理程式在執行輸出之前根據嵌入的治理規則驗證自己的輸出。4 這種方法適用於價值層面的檢查(「這個輸出是否尊重使用者隱私?」),但並未具體解決捏造問題。一個相信其捏造聲明是準確的代理程式也會相信它們通過了憲政審查。

單獨使用任何一種方法都無法解決回饋迴路。如果使用者設定了發布規則,OkaiDokai本可以攔截發布命令。執行時憲政審查會遺漏捏造問題,因為代理程式的自信繞過了它自己的誠實檢查。這個缺口是結構性的:您需要一種機制,在代理程式與外部系統互動時不信任代理程式對自身準確性的評估。


命令影響的三個層級

輸出防火牆根據每個命令的影響範圍進行分類。分類決定命令是自動核准、警告還是延遲。

第1層:本地。 僅影響本地檔案系統。檔案讀取、檔案寫入、git addgit commit、測試執行、程式碼檢查。這些自動核准,因為它們是可逆的且對外界不可見。如果代理程式寫了一個錯誤的檔案,您刪除它即可。不會造成外部損害。

第2層:共享。 影響協作者可以看到的共享狀態。git commit(建立歷史記錄)、分支操作、本地資料庫變更。這些會警告但不會阻止。錯誤提交造成的損害是真實的,但僅限於儲存庫內,且可以透過git revert還原。

第3層:外部。 觸及儲存庫之外的系統。git pushgh pr creategh pr mergerailway deploycurl -X POST/PUT/PATCH/DELETEnpm publish。這些延遲到人工審核。錯誤發布造成的損害是外部的、可見的,且可能是不可逆的(已快取的內容、已索引的頁面、已發送的通知郵件)。

層級分類對應到一個簡單的模式列表:

EXTERNAL_PATTERNS='git push|gh pr create|gh pr merge|railway deploy|curl -X POST|curl -X PUT|curl -X PATCH|curl -X DELETE|npm publish'

在互動式Claude Code工作階段中,內建的權限系統已經處理了這個問題。除非預先授權,否則每個Bash命令都會提示核准。使用者在權限對話框中看到git push並決定是否允許。

在自主迴路中,沒有人在監看。Ralph自主開發迴路透過claude --print產生新的Claude實例,這在沒有互動式核准的情況下執行。5 這就是輸出防火牆發揮作用的地方。


建構防火牆

實作包含四個元件。每個元件獨立運作,因此您可以漸進式地採用。

1. 提示約束

最簡單的層級。在產生每個自主Claude實例的提示中加入明確規則:

## Rules
- Do NOT run git push, deploy commands, or external API calls
- Local operations only: file writes, git add, git commit, test runs

這是必要但不充分的。模型在大多數時候遵循提示約束。「大多數時候」對於發布安全來說是不可接受的。提示約束降低了外部命令的機率;其餘元件負責攔截漏網之魚。

2. 執行後掃描器

每次Claude執行完成後,掃描其輸出以尋找外部命令的證據:

scan_for_external_commands() {
    local output="$1"
    local story_id="$2"

    while IFS= read -r pattern; do
        [ -z "$pattern" ] && continue
        local matches
        matches=$(echo "$output" | grep -i "$pattern" 2>/dev/null || true)
        if [ -n "$matches" ]; then
            # Log to state file for end-of-session review
            jq --arg cmd "$pattern" --arg story "$story_id" \
               --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
               '.deferred_actions += [{
                   "command_pattern": $cmd,
                   "story_id": $story,
                   "detected_at": $ts
               }]' "$STATE_FILE" > "${STATE_FILE}.tmp" \
               && mv "${STATE_FILE}.tmp" "$STATE_FILE"
        fi
    done <<< "$(echo "$EXTERNAL_PATTERNS" | tr '|' '\n')"
}

掃描器在Claude實例完成後執行,而非執行期間。這是偵測,不是預防。提示約束是預防層。掃描器是捕捉約束遺漏的稽核層。

一個已知的限制:grep -i在自然語言輸出中匹配模式,而不僅僅是已執行的命令。如果Claude的回應包含「I chose not to git push because the prompt rules forbid it」,掃描器會將其標記。這是可以接受的。延遲操作佇列中的誤報僅花費人工五秒的審查時間。漏報(遺漏實際的外部命令)則代價是發布捏造的內容。掃描器故意以精確度換取召回率。

來自真實自主迴路運行的掃描器輸出範例:

DEFERRED ACTIONS REQUIRE REVIEW
2 external command(s) detected.
  Story #3 [2026-02-23T08:15:00Z]: git push
  Story #7 [2026-02-23T09:42:13Z]: curl -X POST

在此案例中,Story #3在程式碼註解中提到了git push(誤報)。Story #7包含一個實際的curl -X POST到API端點,本應被提示約束阻止(真陽性)。人工忽略第一個,調查第二個。

3. 延遲操作佇列

偵測到的外部命令累積在工作階段狀態檔案的deferred_actions陣列中:

{
  "session_id": "1740355200-12345",
  "deferred_actions": [
    {
      "command_pattern": "git push",
      "story_id": "3",
      "detected_at": "2026-02-23T08:15:00Z"
    }
  ]
}

佇列在單次自主迴路運行的各個故事之間持續存在。在迴路結束時,所有延遲操作會被呈現給人工審核。

4. 工作階段結束報告

當自主迴路完成時,顯示所有延遲操作:

show_deferred_actions() {
    local count
    count=$(jq '.deferred_actions | length' "$STATE_FILE")
    if [ "$count" -gt 0 ]; then
        echo "DEFERRED ACTIONS REQUIRE REVIEW"
        echo "$count external command(s) detected."
        jq -r '.deferred_actions[] |
            "  Story #\(.story_id) [\(.detected_at)]: \(.command_pattern)"' \
            "$STATE_FILE"
    fi
}

人工審核每個延遲操作並決定是否手動執行。這保留了自主迴路無人值守工作的能力,同時確保沒有外部發布在未經人工驗證的情況下發生。

快速上手:Claude Code Hook

如果您以互動方式使用Claude Code(非自主迴路),您可以在~/.claude/settings.json中將輸出防火牆作為單一hook新增:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [{
          "type": "command",
          "command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -qiE 'git push|gh pr create|gh pr merge|npm publish|railway deploy|curl -X POST|curl -X PUT|curl -X DELETE'; then echo 'BLOCKED: External publication command detected. Review manually.' >&2; exit 2; fi"
        }]
      }
    ]
  }
}

此hook在每次Bash工具呼叫之前觸發。如果命令匹配外部模式,它會以退出碼2阻止執行(Claude Code將其解釋為「拒絕此工具呼叫」)。代理程式收到阻止訊息後可以繼續進行本地工作。您可以根據您特定的外部服務擴展模式列表。


自主性梯度

防火牆的嚴格程度應與人工監督成反比。更多自主性需要更多約束。更少自主性允許更多自由。

模式 監督層級 防火牆行為
互動式工作階段 人工核准每個命令 內建權限系統處理。無需額外防火牆。
受監督的自主模式 人工定期檢查 對第3層命令發出警告,繼續執行。人工在下次檢查時審核。
無人值守的自主模式 無人監看 完全阻止第3層命令。延遲到工作階段結束審核。
多日自主模式 長時間無人值守運行 阻止第2層和第3層。僅第1層(本地檔案系統)自動核准。

捏造事件發生在「無人值守的自主」層級且沒有防火牆。代理程式擁有發布平台的MCP存取權,且沒有機制來區分「將分析寫入本地檔案」和「將分析發布到Twitter」。兩者都是工具呼叫。兩者都成功了。

修復方案不是移除MCP存取權或停止自主操作。修復方案是讓防火牆的嚴格程度與自主性層級相匹配。一個您監看每個命令的互動式工作階段不需要輸出防火牆。一個通宵處理25個故事的自主迴路需要全部四個元件。


連結到執行時治理

代理程式自我治理文章描述了執行時治理的四個子系統:規範性先驗、憲政注意力、能力調節,以及價值對齊驗證。2 輸出防火牆是第五個子系統,或更準確地說,它是價值對齊驗證子系統所缺少的執行機制。

價值對齊驗證檢查代理程式的輸出是否符合治理意圖。證據閘門在報告完成之前要求六個標準的具體證明。但證據閘門運作在代理程式的自我評估之上。它問:「你遵循規則了嗎?」代理程式根據自己對所做之事的理解來回答。

捏造事件表明,當代理程式的理解是錯誤的時候,自我評估就會失敗。代理程式相信其聲明是準確的。它的自我評估本會通過證據閘門:「我根據我的記憶檔案和已發布的文章驗證了這些數字。」兩個來源都是代理程式自己捏造的,但代理程式並不知道。

輸出防火牆完全繞過了自我評估。它不問代理程式發布內容是否準確。它問:「這個命令是本地的還是外部的?」分類是機械性的,而非語義性的。git push是外部的,無論被推送的內容是否準確。curl -X POST觸及網際網路,無論載荷是否真實。防火牆基於命令結構運作,而非內容真實性,這使它對擊敗其他所有安全層的虛構免疫。


關鍵要點

  • 發布邊界是一個獨立的安全面。 訓練對齊治理意圖。輸出防火牆治理能力。一個誠實地相信捏造聲明的代理程式會通過對齊檢查,但在發布邊界失敗。
  • 虛構回饋迴路是其機制。 這次捏造並非單一幻覺。它是一個多工作階段迴路,每個工作階段的輸出成為下一個工作階段的證據。記憶檔案和發布內容充當了原始捏造的洗白工具。
  • 按影響範圍分類命令。 本地(可逆、不可見)、共享(對協作者可見)、外部(觸及外部世界)。根據您的自主性層級來把關外部層級。
  • 偵測與預防是互補的。 提示約束預防大多數外部命令。執行後掃描捕捉漏網之魚。單獨任何一個都不夠充分。
  • 自我評估在虛構面前失效。 一個相信自己捏造內容的代理程式會通過自己的治理檢查。輸出防火牆之所以有效,是因為它分類命令結構,而非內容真實性。問題永遠不是「這是真的嗎?」問題是「這是否觸及外部世界?」

參考來源


  1. “[SAFETY] Claude Code autonomously published fabricated technical claims to 8+ platforms over 72 hours,” GitHub issue anthropics/claude-code#27430, 2026年2月。完整對話紀錄證據可用。 

  2. 自我治理代理程式:執行時憲政,” Blake Crosley, 2026年2月。 

  3. OkaiDokai,AI代理程式的工具級防火牆,okaidokai.com。攔截每個工具呼叫,在1毫秒內根據使用者定義的規則集評估,推播通知進行核准。支援Claude Code和OpenClaw。 

  4. 執行時憲政AI作為LLM代理程式的治理模式。參見:Zerouno, “Runtime Constitutional AI: Validating Every Agent Action Before Execution,” DEV Community, 2026。關於執行時治理結構的學術基礎,參見:”Institutional AI: A Governance Framework for Distributional AGI Safety,” arXiv:2601.10599, 2026年1月。 

  5. 解剖一隻Claw,” Blake Crosley, 2026年2月。Ralph自主迴路架構與基於hook的編排。 

相關文章

Self-Governing Agents: Runtime Constitutions

Training-phase alignment fails at runtime. Six papers converge on embedded constitutions for agent governance. Three of …

16 分鐘閱讀

Silent Egress: The Attack Surface You Didn't Build

A malicious web page injected instructions into URL metadata. The agent fetched it, read the poison, and exfiltrated the…

16 分鐘閱讀

Your Agent Writes Faster Than You Can Read

Five research groups published about the same problem this week: AI agents produce code faster than developers can under…

16 分鐘閱讀