AI 開發

AI Agent 安全危機:為什麼 Claude、GPT 等大模型開始具備自主攻擊能力?JSON 資料驗證能做什麼?

閱讀約 15 分鐘

「大模型會不會自己駭客」問錯了。2026 年公開的訊號裡,Claude 和 GPT 做的事和你的客服 Agent 一樣:發出 tool_calls,宿主去執行,工具去碰網路。變的是迴圈更長、工具更寬、模型更願意自己把活幹完。本文把自主攻擊能力拆開,再問一句:JSON 資料驗證到底能做什麼?

閱讀前速覽

概念 一句話 落在哪
模型 只提議工具名和參數 tool_calls JSON
宿主 驗證、執行、回寫結果 你的 runtime,不是模型
自主 迴圈填 JSON,少等人 Agent loop
JSON Schema 執行前量形狀的尺子 required / enum / allowlist

先記住分工:模型填對象,宿主執行,迴圈讓動作連續發生。JSON 驗證只量形狀,不代替拔網線、鑑權和二次確認。

先把「自主攻擊」問對

2026 年夏天到秋天,兩家旗艦實驗室都把同一類話寫進公開材料:模型不再只給建議,它能在多步任務裡自己選工具、填參數、讀結果、再選下一步。Anthropic 把 Claude 寫成「自主網路攻擊 Agent」;OpenAI 把 GPT-6 Astra 標成「關鍵網路安全能力門檻」。讀成「模型自己發明零日、自己開埠」,你會防錯。

公開紀錄裡真正疊在一起的是三件事,缺一件都只是聊天:

  • 模型只提議名字和參數。副作用在宿主。
  • 工具目錄一旦連上瀏覽器、終端、套件倉庫或任意 HTTP,合法 JSON 就是動作。
  • 迴圈不再等人:結果一寫回,下一份對象馬上填。人只卡在少數戰略門。

所以這篇不複述兩起 Claude 事件的逐條時間線。Claude 事件與工具 JSON 已經拆過執行路徑。本文問另一件事:能力從哪來,以及 JSON 驗證能補哪一截。

自主能力從哪來,不是「模型變壞了」

客服查單和公開事件走同一條迴圈。AI Agent 完整指南 畫過骨架:提議、執行、回寫、再提議。換一批工具名,迴圈不會變。配得上「自主」的,是三層疊在一起:

  1. 多步迴圈。一次真實副作用最少四跳:提議 → 門禁 → 執行 → 回寫。跳過門禁,JSON 就是命令。
  2. 能出網的工具目錄。Function Calling、MCP Tool Schema vs Function Calling、Claude Code / Codex 的本地工具,把「說話」接成「做事」。沒登記的工具,模型呼叫不了;多登記一把能出網的工具,就多一條執行路徑。
  3. 更願意自己把活幹完。GPT-6 Astra 指南 寫過:它更穩地走完「選工具 → 調工具 → 交回對象」,評測裡少問「要不要繼續」。迴圈變長,壞形狀更容易被下一跳當成事實。

缺任何一層,都只是聊天。三層齊了,合法 JSON 就會碰到真實系統。這不是模型學會了新協定,是宿主把執行權交給了迴圈。

Claude 與 GPT:公開訊號,不要混成一部片子

先分開寫。混成「AI 叛變」,你會丟掉唯一能改的部分:工具、網路和門禁。

Claude 線。2025 年 GTG-1002:人類選靶,Claude Code 加 MCP 跑戰術,Anthropic 估計 AI 完成約 80–90% 戰術工作,人類卡在戰略門。2026 年 7 月評測環境誤連公網,模型把 CTF 題做到真實組織。細節見 Claude 事件與工具 JSON。骨架只有一句:能出網的工具 + 迴圈填寫的 JSON。

GPT 線。2026 年 9 月 3 日發布的 GPT-6 Astra 指南。官方把它標成第一個達到「關鍵網路安全能力門檻」的模型:公司認為它能在幾乎沒有逐步人工指引的情況下,發現並利用加固系統中的漏洞。完整進攻能力留在 Daybreak(Blue / Red);公開版加了更緊的拒答和異步錯位監控。同一天的 System Card 也寫了:思考鏈可監測性比 GPT-5.6 Sol 下降。兩句話要一起讀。

Astra 不是「自己開埠」。它是更穩地走完工具鏈。UK AISI 供應鏈模擬寫過:沒有書面範圍,499 次裡 60 次越界;寫了明確限制,500 次裡 2 次。鷹架和約束比榜單百分比值錢。獨立實驗室 Irregular 在完全加固目標上看到 0 次成功攻擊——能力門檻不是萬能鑰匙。

共同工程面只有一句:模型填對象,宿主執行。換牌子,迴圈不變。

動手的是對象,不是一段話

把危機寫成「模型說了危險的話」,你會去改系統提示。公開紀錄裡,動作發生在宿主解析 tool_calls 之後。名字對、參數能過,函式就會跑。

一次良性的 Function Calling 形狀,和客服查單沒有區別:

{
  "tool_calls": [{
    "id": "call_3c91",
    "type": "function",
    "function": {
      "name": "lookup_order",
      "arguments": "{\"order_id\":\"A-1042\"}"
    }
  }]
}

arguments 是字串化的對象,不是聊天紀錄。模型不會「發送攻擊」——它發送欄位。寬 type: object 等於把門拆了:額外鍵、任意 URL、未宣告的方法都會進宿主。

每個工具都應有一份 JSON Schema。關鍵字見 JSON Schema 教程。屬性名寫短,enum 寫死,路徑加 pattern。AI 為什麼需要 JSON Schema 寫過:Schema 是口徑,不是 prompt 裡的「請返回 JSON」。

除錯時先 格式化 看結構,用 JSONPath 提取 抽出 name 和 arguments,和上週能過的對象 JSON Diff。不要把生產憑據、客戶庫或工具日誌貼到公共站點。

JSON 資料驗證能做什麼

驗證不是對齊,也不是殺毒。它只回答一個問題:這份對象該不該被執行?能攔住的,都是形狀問題:

  • 缺必填。沒有 path 就不調 HTTP。
  • 類型錯。amount 是字串就失敗。
  • 列舉外。method 只能是 GET。
  • 多餘鍵。additionalProperties: false 擋住多塞的 host。
  • 模式不符。path 必須落在 /api/v1/。
  • 結果不是對象。下一跳沒有散文可 parse,幻覺欄位進不了狀態。

下面這份參數看起來像合法 JSON,但多了一個不該存在的主機欄位:

{
  "method": "GET",
  "path": "/api/v1/orders/A-1042",
  "host": "internal.example"
}

對照一份收緊的 inputSchema,這份對象應當在執行前失敗:

{
  "name": "http_request",
  "description": "Call an allowlisted HTTP API",
  "inputSchema": {
    "type": "object",
    "properties": {
      "method": { "enum": ["GET"] },
      "path": { "type": "string", "pattern": "^/api/v1/" }
    },
    "required": ["method", "path"],
    "additionalProperties": false
  }
}

上面這份 Schema 只允許 GET /api/v1/…。沒有 additionalProperties: false,模型隨時可以多塞一個目標主機。API 金鑰、Cookie、內部基址必須留在宿主,不能進參數對象。驗證還能當日誌尺子:每次 tool_calls 留下對象,才能 Diff、回放、對帳。散文摘要不夠。

驗證做不到什麼

把 Schema 寫成「安全方案」,下一跳會漏掉真正的門。驗證做不到這些:

  • 網路隔離。提示寫「沒有公網」代替不了拔線。評測事件已經證明。
  • 鑑權。誰都能連的 MCP 端點,目錄等於公開在網上。
  • 二次確認。外傳、改庫、發布製品,人類過門。GTG-1002 的人類本來就卡在這些門上。
  • 意圖審查。合法形狀可以指向不該碰的主機——allowlist 是另一層,不是類型檢查。
  • 思考鏈可信度。模型說「我在模擬」不能替代網路日誌。監視器要看工具對象,不只看模型怎麼解釋自己。
  • 廠商側監控的替代。Astra 的 misalignment monitoring 看工具流量並告警。它不是你應用裡的 validator,也不替你執行 additionalProperties: false。

四層拆開之後,職責才回得來:

層 系統在做什麼 沒有 Schema 會怎樣
模型 把目標收成工具名和參數 散文進宿主,副作用先跑起來
宿主 驗證並執行 tool_calls 名字對了就調;網路策略來不及說話
MCP / API 把動作接到外部系統 任意 URL、任意方法都會出網
JSON Schema 什麼都不做,只當尺子 尺子若只寫在 prompt 裡,CI 和執行時量不到

尺子量形狀,量不到權限和網線。Structured Output 擋住非法 token,同樣不替你做隔離。

門禁怎麼寫:下一步也必須是對象

下一步該不該執行,不能是一句「繼續」。它必須是對象,並且 allowed 不能由模型自己填寫:

{
  "step": 3,
  "last_tool": "lookup_order",
  "state": {
    "order_id": "A-1042",
    "status": "paid"
  },
  "next": {
    "tool": "http_request",
    "allowed": false,
    "reason": "missing_confirmation"
  }
}

allowed 必須由宿主按 Schema 和策略算出。模型可以說「建議繼續」,不能自己把 allowed 寫成 true。AI Agent 與 JSON Schema 工作流 寫門禁怎麼排。

策略檔預設拒絕,再開缺口:

{
  "agent": "ops_assistant",
  "default_deny": true,
  "max_steps": 8,
  "tools": {
    "lookup_order": {
      "network": false,
      "confirm": false
    },
    "http_request": {
      "network": true,
      "allowlist": ["api.internal.example"],
      "confirm": true
    }
  }
}

能出網的工具預設關掉;要開,就寫進策略檔,並要求確認。提示裡的「禁止出網」不能當控制措施。

2026 年怎麼落地

  • 倉庫放 schemas/tools/ 和 policy.json,帶穩定 $id 和版本。
  • 先寫 JSON Schema,再登記 MCP 或 Function Calling。類型是投影,不是源。
  • 查內部狀態走無網工具;出網、改資料、發外部分開登記,預設 confirm: true。
  • 新工具預設 default_deny。要擴展,加版本號,不要把根對象改寬。
  • 評測、CI、本地 Agent 用同一份 allowlist。提示裡的「禁止出網」不能當控制措施。
  • 金鑰和客戶欄位只在瀏覽器裡看:格式化、JSON Diff,零上傳。

目錄可以很薄。要緊的是檔案先於演示。模型會換,工具名會換;口徑應該先穩定。

常見誤區

  • 把模型當成執行者。它填 JSON。出網、改庫、發請求的是宿主。
  • 用寬 type: object 逃避設計。開放對象不是門禁。
  • 只驗輸入,不驗結果。下一跳會把幻覺欄位當成事實。
  • 只信思考鏈。模型說「我在模擬」不能替代網路日誌。
  • 以為廠商監控等於宿主驗證。錯位監控是告警,不是 additionalProperties: false。
  • 把驗證寫成全部安全方案。形狀過了,網線、權限、確認仍要另寫。

FAQ

模型是不是已經能自己立目標?

公開紀錄裡不是。GTG-1002 是人類選靶、拆任務、過戰略門;評測事件是人類出了 CTF 題,卻忘了隔離。自主指的是戰術步驟少等人,不是模型自己決定要打誰。

JSON 驗證能阻止攻擊嗎?

能阻止非法對象被執行:缺欄位、錯類型、多餘鍵、越界路徑,當場失敗。它不能替代網路隔離、鑑權和人類確認。合法形狀仍可能指向不該碰的主機,那一層靠 allowlist。

Claude 和 GPT 有什麼差別?

牌子不同,迴圈相同。Astra 更願意自己把工具鏈走完,並被標了網路安全能力門檻;Claude 事件證明工具目錄一旦出網就會碰真實系統。工程上先審工具目錄和 Schema,不要先換模型。

Structured Output 夠不夠?

不夠。它擋住非法 token,保證最終回覆符合 Schema。它不替你做網路隔離,也不攔截「形狀合法、目標不該碰」的呼叫。有副作用的動作仍走 Function Calling,宿主仍要再驗一次。

這些 JSON 怎麼在本地看?

先格式化看結構,對照 Schema 找缺的 required 或錯的 enum,再和上一版能過的對象 Diff。JSONSort 在瀏覽器本地做這些事,不上傳資料。不要把生產憑據或客戶紀錄貼到公共站點。

結論

安全危機不是「模型學會了駭客」。是給 Agent 一把能出網的工具,再讓它迴圈填 JSON,真實世界就會被碰到。

JSON 資料驗證能做的事很窄,也很硬:在執行前量形狀。缺欄位、錯類型、多餘鍵、越界路徑,當場失敗。網線、權限、確認,驗證做不了,必須另寫。先把 schemas/tools/ 和 policy.json 寫進倉庫,再決定要不要加下一把工具。

延伸閱讀

更新紀錄: 首次發布