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 写进仓库,再决定要不要加下一把工具。

延伸阅读

更新记录: 首次发布