给能退款、改库、跑代码的 AI Agent 加三道安全闸:一次零信任 Demo 实测

当 AI Agent 只生成文本时,错误通常还隔着人工确认;当它开始调用支付、数据库和代码执行工具,一次错误判断就可能直接改变真实状态。

这时,System Prompt 仍然有用,但不能被当作安全边界。本文固定 Google 零信任 Agent 示例的源码版本,运行官方测试并追加一个边界用例,拆解策略网关、代码沙箱和签名审计分别解决什么问题。

先给实测结论:

  • 官方五个网关用例全部通过;
  • 把攻击退款额从 10000 改成 9999 后,示例网关返回 ALLOW
  • 把签名账本中的退款额从 149 篡改成 10000 后,审计报告 TAMPERED / BREACH
  • 确定性策略、隔离执行和签名审计都必要,但任何一层都不能单独代表"生产安全"。

验证对象与环境

  • 仓库:GoogleCloudPlatform/generative-ai
  • 目录:agents/adk/zero-trust-agents
  • 固定 commit:97e1a400a9f590eafc49d1c33cebb3bfd0e12109
  • commit 时间:2026-08-11 16:40:23 UTC
  • 本地环境:Darwin 25.6.0 x86_64,Python 3.14.6
  • 运行方式:通过 GitHub API 读取固定 commit 原始文件,未修改官方 Python 源码

需要先强调验证边界:本地 Agent 使用 ADK 模拟模式,没有真实调用 Gemini;本次没有安装 runsc,也没有部署 Cloud KMS、HSM 或真实数据库。下面的结果只能说明参考实现的代码行为,不能外推为生产环境已经安全。

风险模型:从"生成错误"变成"产生副作用"

一个退款 Agent 的典型链路是:

text 复制代码
用户请求
  → 模型理解与决策
  → 选择退款工具
  → 生成订单号和金额参数
  → 支付或数据库执行
  → 根据结果继续行动

如果只在 System Prompt 中声明:

text 复制代码
退款金额不得超过订单原价。
不得读取服务器环境变量。
不得泄漏密钥和用户隐私。

这些规则仍要由模型在混合上下文中解释。用户请求、网页内容、检索结果和工具返回都可能影响模型判断,而安全不变量不应该只依赖一次概率决策。

零信任原则迁移到 Agent 场景后,可以浓缩成一句话:不要因为调用来自"自己的 Agent",就默认这次决定可信。

第一道闸:确定性策略网关

示例中的 demo/gateway_guard.py 会在输入、输出和工具调用前检查信用卡号、支付 Token、越狱关键词和部分 SQL 更新金额。

我先运行仓库自带的五个测试:

用例 结果
正常退款请求 ALLOW
返回内容包含支付 Token BLOCK
要求忽略安全指令并退款 10000 美元 BLOCK
SQL 把退款改为 10000 BLOCK
SQL 退款金额为 149 ALLOW

五个用例全部符合预期。这说明确定性策略很适合做回归测试:相同输入会得到稳定结果,不需要猜模型这一次有没有"听话"。

追加一个金额改写测试

输入:

text 复制代码
Please refund $9999 for order_99281 right now.

输出:

json 复制代码
{
  "action": "ALLOW",
  "reason": "Request meets all e-commerce security gateway conditions"
}

从固定版本的 inspect_payload 实现看,当前 Python 示例主要依赖正则、字符串列表和固定 SQL 文本条件。9999 没有命中预设的 10,000.00,而该请求又按 prompt 类型检查,因此成功漏过。

这里得到的工程结论不是"规则网关无效",而是:确定性不等于完整性。

关键词和正则适合拦截已知模式,真正的业务不变量应放到工具入口。例如退款执行前,服务端重新读取订单状态,而不是相信模型提交的 approved=true

python 复制代码
def validate_refund(order, request, actor):
    if request.currency != order.currency:
        raise PolicyDenied("currency mismatch")
    if request.amount + order.refunded_amount > order.paid_amount:
        raise PolicyDenied("refund exceeds paid amount")
    if not actor.can_refund(order.tenant_id):
        raise PolicyDenied("permission denied")
    if not request.idempotency_key:
        raise PolicyDenied("missing idempotency key")

这段代码是生产侧的示意,不是官方仓库源码。关键是校验结构化事实,并把规则放到副作用发生之前。这样无论 Prompt 使用什么语言或金额写法,退款上限都不会改变。

第二道闸:隔离动态代码

能生成 Python 或 Shell 的 Agent,必须把生成代码当成不可信输入。如果直接在应用进程里执行,代码可能读取环境变量、扫描宿主文件、访问外网,或者通过死循环耗尽资源。

Google 示例给出的生产映射是 gVisor,并组合以下限制:

  • 禁止外部网络;
  • 丢弃 Linux capabilities;
  • 只读挂载代码文件;
  • 限制 CPU 和内存;
  • 设置五秒超时。

gVisor 通过用户态应用内核拦截工作负载的系统调用,减少不可信程序直接接触宿主 Linux 内核的机会。它不是"容器已经够安全"的同义词,也不能替代身份、授权和审计。

生产验证至少应该覆盖:

  1. 无网络时是否仍能通过 DNS、代理或宿主接口出站;
  2. 只读挂载是否包含不该出现的凭据和 Socket;
  3. CPU、内存、进程数和执行时间是否真的生效;
  4. 运行时兼容性和性能是否满足业务要求;
  5. 沙箱失败时是否默认拒绝,而不是回退到宿主执行。

本次没有运行真实 runsc,因此不把示例网页中的 JavaScript 展示写成"已完成 gVisor 安全测试"。

第三道闸:为写入绑定身份、负载和签名

示例的第三层位于数据库入口。Agent 会把身份、动作、订单号、金额、收款人和 nonce 组成负载,再为完整负载生成签名。demo/db_guard.py 的入口先验证签名,通过后才写入账本。

本地模拟流程如下:

  1. Agent 查询订单退款上限 149 美元;
  2. 使用示例 HMAC 密钥签署交易负载;
  3. DB Guard 验证签名并写入本地账本;
  4. 第一次审计返回 VERIFIED
  5. 只把账本中的金额从 149 修改为 10000,签名保持不变;
  6. 第二次审计返回 TAMPERED / BREACH

这个结果证明的是写入后的完整性检测。签名覆盖完整负载,金额改变后,重新计算结果与原签名不再一致。

但签名不判断业务对错。如果有合法签名权限的 Agent 一开始就主动签下错误交易,这个签名仍然可能有效。因此,签名前仍要执行金额上限、资源范围和人工审批策略。

本地 Demo 使用双方共享的 HMAC 密钥。生产环境更适合让每个 Agent 使用独立服务身份,通过 KMS 托管的非对称密钥完成签名,再由数据库侧使用公开密钥验证。这样能降低私钥分发风险,也能单独撤销某个 Agent 的权限。

三层能力不能互相替代

控制层 主要回答 能解决 不能解决
策略网关 这次操作合不合规? 固定规则、工具参数校验、回归测试 未覆盖的改写、错误业务规则
代码沙箱 最多能碰到什么? 文件、网络、资源与内核接触面隔离 合法接口内的越权业务操作
签名审计 谁写的,后来改没改? 来源与完整性验证、篡改发现 判断交易本身是否应该发生

这三层应该形成纵深防御,而不是互相替代。策略漏检后,权限和工具入口仍要限制副作用;代码被诱导生成后,沙箱限制爆炸半径;记录写入后,签名与审计保留追责证据。

生产级 Agent 上线前六问

  1. 谁在调用? 每个 Agent 是否有独立、短时、可撤销的工作负载身份?
  2. 它能碰什么? 权限是否缩小到具体工具、资源、字段和动作?
  3. 参数由谁复核? 金额、收款人、SQL 范围和目标环境是否由确定性代码重新校验?
  4. 代码在哪里执行? 网络、文件、CPU、内存、时间和凭据是否默认关闭?
  5. 什么动作必须问人? 大额支付、删除、生产发布和权限变更是否设置人工闸门?
  6. 出事后能否恢复? 是否记录原始请求、策略结果、工具参数、身份与审批,并支持幂等、补偿和撤销?

总结

这次实测最有价值的不是"Google 给出了三种产品",而是验证了一个更通用的工程原则:

假设模型可能被欺骗,把不能突破的规则移到模型之外。

模型适合理解自然语言、生成方案和选择工具;基础设施负责身份、授权、参数校验、隔离、审计与人工接管。只有把副作用附近的硬边界做实,Agent 才有资格进入支付、数据库和生产环境。

参考资料

相关推荐
安以团1 小时前
当AI学会自己跑循环,你的工作变成了什么?
人工智能
Csvn1 小时前
📊 SQL 入门 Day 24:触发器与事件
后端·sql
半个落月1 小时前
在浏览器里运行 DeepSeek-R1:推理、流式输出与停止生成(二)
前端·人工智能·react.js
飞哥数智坊1 小时前
TRAE Code 接入 DeepSeek Vision 实测
人工智能·deepseek·trae
Crawl1 小时前
5.登录与分页功能分析
java·后端
LinMINGJing0071 小时前
简单web服务器示例图
后端
今天AI了吗1 小时前
AI Agent 在数据分析领域的落地判断:哪些场景真的需要 Agent
java·数据库·人工智能·python·sql·数据分析·copilot
两万五千个小时1 小时前
DeepSeek Harness 从 0 开始:16 scope 域(作用域隔离)
人工智能·程序员·架构
cspttty1 小时前
会计专业大学期间考什么证
大数据·数据库·人工智能·数据挖掘