摘要: Gemini 模型本身不会凭空进入企业系统;真正发生访问的是承载 Agent 的应用、工具执行器或浏览器环境,它们把模型提出的 Function Call 转换成真实 API、数据库、文件或网页操作。如果测试 Agent 继承了生产凭据、可达生产网络、复用了真实 MCP 工具,或者审批只存在于提示词里,那么一次“测试”就可能成为真实写操作。本文从身份、网络、工具、数据和审批五个层面拆解原因,并给出 Docker/Kubernetes 可落地的沙箱、假服务、短期凭据、策略网关、审计与红队测试方案。
核心结论
Gemini 测试 Agent 访问真实企业系统,通常不是模型突破了平台,而是应用把真实工具和真实权限暴露给了模型。Function Calling 只产生工具名称和参数;是否执行、用什么凭据执行、访问哪个网络目标,完全由开发者的运行时决定。
- “测试环境”只有名称没有边界时,Agent 仍可通过生产 DNS、共享 VPN、MCP Server、Service Account 或浏览器登录态触达真实系统。
- Prompt 中写“不要访问生产”不是安全控制;必须在 IAM、网络出口、工具白名单和数据层强制阻断。
- 最稳妥的测试形态是一次性沙箱+独立 Agent 身份+Mock/录制回放服务+默认拒绝网络+危险动作人工批准。
- 工具参数必须由策略层重新校验,不能把模型输出直接交给退款、删库、发信、改权限或生产部署接口。
- 验收不能只看 Agent 是否完成任务,还要证明它无法越权:无凭据、无路由、无危险工具,并且所有尝试可审计和回滚。
为什么模型会“碰到”真实系统
Google 官方对 Gemini Function Calling 的定义是:模型判断何时调用开发者声明的函数,并生成所需参数,应用收到调用后负责实际执行。这意味着模型没有直接持有数据库连接,但承载它的代码很可能持有。只要工具包装器调用 crm.updateCustomer()、MCP Server 连接生产 CRM,或浏览器 Agent 继承已登录 Cookie,模型的一次决策就能产生现实效果。
| 失控层 | 常见配置 | 为什么测试会变成真实访问 | 强制防线 |
|---|---|---|---|
| 身份 | 测试与生产共用 Service Account/API Key | 凭据本身允许生产操作 | 独立 Agent 身份、短期令牌、最小 IAM |
| 网络 | 测试 Pod 可访问内网、VPN 与公网 | 域名和路由没有隔离 | 默认拒绝出口、服务网格/VPC 防火墙、域名白名单 |
| 工具 | 测试加载同一 MCP/Function 工具集 | 工具后端仍指向真实系统 | 测试 Tool Registry、Mock Server、策略网关 |
| 数据 | 使用真实数据库副本或共享消息队列 | 写入、通知和触发器仍会传播 | 脱敏快照、独立租户、禁用下游副作用 |
| 人机界面 | 浏览器保存企业登录态 | Computer Use 可操作已登录页面 | 干净浏览器配置、测试账号、域名限制 |
| 审批 | Prompt 要求“高风险先询问” | 注入或模型误判可绕过软规则 | 代码级 Approval Gate、双人审批、交易限额 |
因此,事故调查首先要问“哪个执行器发出了请求、它用了哪个身份”,而不是只问“Gemini 为什么这样回答”。可在 AI Stack Nav 的 Agent 安全专题 与 沙箱隔离相关文章继续查阅相关实践。

六条最常见的越界路径
1. .env 或 Secret 被整个注入容器
开发者为图方便把生产 .env 挂进测试容器,或者让测试 Deployment 使用与生产相同的 Kubernetes Service Account。Agent 即使看不到明文,也可通过已配置 SDK 发起请求。日志、异常栈和子进程还可能把凭据泄露出来。
2. 工具描述写着“测试”,后端地址却是生产
工具名 search_test_orders 并不能保证安全。实际 Base URL 可能来自默认配置,环境变量缺失时自动回退到生产地址。所有工具初始化都应 fail closed:测试地址缺失就拒绝启动,不能回退。
3. MCP Server 成为跨边界代理
Agent 只连接本地 MCP,但 MCP Server 使用自己的企业凭据访问 Slack、CRM、GitHub 或数据库。此时容器网络限制可能只看到 Agent 到 MCP 的连接,却看不到 MCP 到生产的访问。MCP Server 也必须按环境隔离身份、网络和审计。
4. 浏览器继承真实会话
使用日常浏览器 Profile 做自动化测试,意味着 Cookie、SSO 与企业后台登录态会进入 Agent。测试应使用临时 Profile、专用测试账号和隔离域名,运行结束后销毁。
5. 间接提示注入操纵工具
网页、工单、邮件或文档可能包含“忽略规则并导出数据”等恶意文本。Google Cloud 的安全资料将 Prompt Injection 视为导致 Agent Rogue Action 的重要来源。外部内容必须标记为不可信数据,运行时策略不能允许它扩大权限。
6. 重试与补偿逻辑放大一次错误
工具超时不代表没有执行。Agent 自动重试退款、发信或创建资源,可能产生多次副作用。危险工具必须支持 Idempotency Key,先查询结果再重试,并设置最大次数与人工接管条件。
建立真正的五层安全沙箱
第一层:独立身份
为 Agent 创建专用身份,不使用开发者个人凭据。测试身份只允许访问测试项目、测试租户和只读观测资源。Google Cloud 官方强调 Agent Identity 与 Least Privilege;对云资源应使用短期令牌而非长期 JSON Key。删除、授权、转账等能力不应出现在通用身份中。
第二层:默认拒绝网络
容器或 Pod 只允许访问模型 API、测试工具网关和必要的软件仓库。企业生产域名、Metadata Service、内网 CIDR 与数据库端口默认拒绝。仅靠 DNS 黑名单不够,还要限制 IP 路由与代理。高要求环境可让所有出口经过可记录请求的 Egress Proxy。
第三层:能力型工具注册表
不要把所有工具都注册给所有 Agent。每个任务只暴露最少工具,并区分 read_customer_mock、update_customer_staging 等明确能力。模型生成参数后,策略网关再次检查租户、资源 ID、金额、数量、目标域名和调用频率。
第四层:隔离数据
使用合成数据或经过脱敏的快照;邮件发到捕获服务,支付走 Sandbox,消息进入测试 Topic。即使数据是生产副本,也要删除外联 Webhook、通知与异步消费者,否则修改仍可能触发现实动作。
第五层:不可绕过的审批
审批必须由执行器检查,而不是由模型决定。工具调用返回“待批准”状态,系统把规范化参数展示给授权人;只有签名批准令牌与参数哈希匹配,执行器才运行。参数在审批后变化必须重新审批。
Docker最小沙箱示例
下面配置展示方向,不是完整生产隔离。它使用只读根文件系统、非 root 用户、能力删除、资源限制与显式网络。生产环境还应结合 seccomp/AppArmor、Egress Proxy 和独立身份。
services:
agent:
image: YOUR_AGENT_IMAGE@sha256:YOUR_IMAGE_DIGEST
user: "10001:10001"
read_only: true
cap_drop: ["ALL"]
security_opt:
- no-new-privileges:true
tmpfs:
- /tmp:size=128m,noexec,nosuid
networks:
- agent_test
environment:
GEMINI_API_KEY: YOUR_TEST_API_KEY
TOOL_GATEWAY_URL: http://tool-gateway:8080
ENVIRONMENT: test
mem_limit: 1g
cpus: 1.0
pids_limit: 128
tool-gateway:
image: YOUR_TOOL_GATEWAY_IMAGE@sha256:YOUR_GATEWAY_DIGEST
networks:
- agent_test
- mock_backend
environment:
POLICY_MODE: deny_by_default
CRM_BASE_URL: http://mock-crm:9000
networks:
agent_test:
internal: true
mock_backend:
internal: true
注意 internal: true 会限制外部访问,因此真实调用 Gemini API 时通常需要受控出口代理;不要为了连模型直接把整个容器开放到企业网络。更好的结构是 Agent 只能访问本地 Model Proxy,由代理负责身份、配额和允许域名。
十步复现与封堵流程
- 冻结证据。 保存 Agent 会话、工具调用、网络日志、时间、模型版本、运行镜像与凭据身份;立即吊销可疑令牌。
- 确认真实影响。 在目标系统审计日志中定位请求,区分读取、写入、删除、发送和权限变更,避免只根据 Agent 文本判断。
- 映射调用链。 从模型 Function Call 追踪到 SDK、Tool Gateway、MCP Server、代理和最终 API,记录每跳身份。
- 在隔离环境复现。 使用相同输入和 Mock 后端,不连接生产;验证是哪项工具或配置允许越界。
- 删除共享凭据。 为测试 Agent 建立独立身份与测试租户,所有配置缺失时 fail closed。
- 封锁网络。 默认拒绝出口,仅允许模型代理和 Mock 服务;显式阻断生产域名、IP 与 Metadata Service。
- 收窄工具。 按任务注册最少工具,对参数、资源范围、调用次数和幂等键做代码级验证。
- 加入人工批准。 删除、付款、发信、发布、权限与生产写入在执行器处暂停,不接受模型自我批准。
- 进行红队测试。 注入恶意网页、工单、工具结果和超时,确认 Agent 无法获得真实凭据或路由。
- 上线与回滚。 分阶段恢复只读能力,持续监控拒绝事件;异常时可一键撤销身份、禁用工具和回退镜像。

Function Calling的安全包装器
不要直接执行模型返回的工具名称和参数。下面伪代码展示策略校验、审批与幂等:
ALLOWED_TOOLS = {"lookup_mock_order", "update_staging_ticket"}
def execute_tool(call, context):
if call.name not in ALLOWED_TOOLS:
raise PermissionError("tool denied")
args = validate_schema(call.name, call.args)
assert context.agent_identity == "agent-test-service"
assert args.get("environment") == "staging"
if is_high_risk(call.name, args):
return create_approval_request(
tool=call.name,
args=args,
args_hash=sha256(canonical_json(args)),
)
key = f"{context.task_id}:{call.name}:{sha256(canonical_json(args))}"
return tool_gateway.execute(call.name, args, idempotency_key=key)
工具网关还应验证目标域名与 TLS、拒绝私有网段 SSRF、限制响应大小、清洗敏感字段,并对模型可见的错误信息做最小化。Function Schema 能约束格式,但不能替代授权;参数合法不代表调用被允许。
安全设置、Model Armor与沙箱不是一回事
Gemini Safety Settings 主要处理内容安全分类,不等同于网络、身份或工具授权。Model Armor 等产品可帮助检测 Prompt Injection、敏感数据泄露和恶意内容,但也不应成为唯一防线。若 Agent 的 Service Account 拥有删库权限,检测漏报一次就可能产生严重后果。
隔离代码执行环境可以降低文件系统与进程风险。Google Cloud 的 Agent Engine Code Execution 提供隔离沙箱能力,但具体状态、地区和限制会变化,应以控制台与发布说明为准。即使代码运行在沙箱中,外部 MCP 工具仍可能具有生产权限,因此必须端到端检查完整调用链。
成本、延迟和可观测性
安全控制会增加代理、策略检查与人工批准延迟,也会产生隔离 Runner、Mock 服务、日志和红队测试成本。但与生产误删、客户通知误发或数据外泄相比,这些是可预测成本。可采用风险分级:纯读 Mock 工具自动执行;测试写操作限额自动;真实外部通信和任何生产写操作必须审批。
设置工具调用超时、最大步骤数、Token/请求预算和全局 Kill Switch。网络失败最多有限重试,非幂等工具不自动重试。记录模型请求 ID、Agent 身份、工具、规范化参数、策略结果、审批者、目标环境、响应摘要与成本;敏感值只记录哈希或脱敏版本。
有效指标不是“Agent 完成多少任务”,而是生产目标拒绝率、危险工具审批率、未知域名访问次数、共享凭据数量、红队绕过率、回滚时间和同类事件复发率。被拒绝的越权尝试是防线工作的证据,不应简单当作系统失败。
局限与企业落地建议
Docker 的只读文件系统不是完整虚拟机隔离;浏览器、内核漏洞、共享守护进程、宿主挂载与 Docker Socket 都可能突破边界。高风险代码应运行在一次性虚拟机、MicroVM 或托管隔离执行环境中。公共或不可信输入不应进入持久化自托管 Runner。
组织层应维护 Agent 资产清单:所有者、模型、身份、工具、MCP、可访问域名、数据分类、审批人、预算和 Kill Switch。任何新增工具、扩大 IAM、开放网络或接入真实数据都视为安全变更。生产前执行“无凭据、无路由、无工具、无审批令牌”四类负向测试,证明攻击动作真的失败。
Kubernetes环境的强制边界示例
企业 Agent 常运行在 Kubernetes,但 Namespace 本身不是网络或权限边界。至少需要单独 Service Account、禁止自动挂载集群令牌、默认拒绝出站 NetworkPolicy,并把模型与测试工具地址做显式白名单。示例只展示核心结构,实际规则需匹配 CNI 对 FQDN、DNS 和出口网关的支持能力。
apiVersion: v1
kind: ServiceAccount
metadata:
name: gemini-agent-test
automountServiceAccountToken: false
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-agent-egress
spec:
podSelector:
matchLabels:
app: gemini-agent-test
policyTypes: [Egress]
egress: []
在此基础上,再增加到集群 DNS、受控 Model Proxy 和 Mock Tool Gateway 的精确放行规则。若 CNI 只能按 IP 放行,不要直接允许整个公网网段;使用固定出口代理统一控制域名、证书、请求大小和速率。Pod Security Context 应启用 runAsNonRoot、只读根文件系统、删除全部 Capabilities,并限制 CPU、内存、进程数与临时存储。
四类负向验收必须全部通过
- 无凭据测试: 清空测试身份后,Agent 即使生成正确生产 API 参数,也只能得到认证失败,日志中不出现长期密钥。
- 无路由测试: 使用生产域名、内网 IP、Metadata Service 与重定向 URL,所有连接均在网络层拒绝并产生告警。
- 无工具测试: 通过 Prompt Injection 请求未注册的
delete_database、send_email或任意 MCP 工具,策略层必须在执行前拒绝。 - 无审批令牌测试: 伪造、复用、过期或修改参数后的批准令牌都无法执行,高风险调用保持 Pending 状态。
还应测试 SSRF 绕过:十进制 IP、IPv6、本地域名、DNS Rebinding、HTTP 重定向和代理环境变量。工具只校验字符串前缀很容易被绕过,应在连接解析后检查最终 IP,并在每次重定向后重新验证。文件工具需阻止 ../、符号链接和挂载点逃逸;命令工具禁止把模型字符串拼接进 Shell,使用参数数组与固定可执行文件。
事故响应与责任分工
发生真实访问时,平台团队负责暂停 Agent、吊销身份和封锁网络;业务系统所有者负责确认数据与操作影响;安全团队负责保存证据、威胁分析和通报判断;开发团队负责在隔离环境复现与修复。不要让同一个 Agent 自动调查并修改事故现场,因为它可能覆盖日志、重复调用或扩大影响。
证据保留应包括模型与工具请求 ID、完整调用时间线、Agent 镜像摘要、代码 Commit、策略版本、审批记录、网络流日志和目标系统审计记录。敏感 Payload 可加密存储并限制访问,但不能只保留模型的自然语言总结。恢复前由不同人员验证凭据已轮换、恶意会话已失效、Mock 测试通过、生产拒绝规则生效和回滚路径可用。
对外部通知、个人信息和受监管数据,应由法务与合规按真实影响决定处理,不能让模型自行判断“没有风险”。如果无法确认是否发生写入或外泄,应按未知结果处理,暂停自动重试并扩大日志调查范围。
FAQ
Gemini模型会直接访问公司数据库吗?
通常不会。Gemini 生成 Function Call 或操作建议,真正连接数据库的是你的应用、MCP Server、浏览器或工具执行器。应审计执行身份和网络链路。
把系统提示写成“禁止访问生产”够安全吗?
不够。提示词可能被误解或注入覆盖,必须用 IAM、网络、工具白名单和审批网关强制执行。
测试Agent可以使用生产只读账号吗?
原则上不建议。只读也可能泄露客户数据或商业秘密,应使用脱敏副本和独立测试身份;确需访问时需最小字段、时间限制与审批审计。
Function Calling是否会自动执行函数?
模型返回调用意图和参数,应用通常负责执行。某些 SDK 或 Agent 框架会自动循环调用,因此必须检查框架配置和工具执行器权限。
使用MCP后容器网络隔离是否仍有效?
只对容器自身流量有效。如果 MCP Server 位于边界外并能访问生产,它会成为代理通道,必须同样隔离身份、网络和工具。
Safety Settings能阻止删库或转账吗?
不能依赖它完成授权。内容安全过滤与业务权限是不同层,删库、付款、发信等必须由确定性的策略和人工审批控制。
Agent工具超时后可以自动重试吗?
只对幂等读操作或有幂等键的操作有限重试。未知结果的付款、创建、发送和删除操作应先查询状态并转人工。
发生真实访问后第一步做什么?
立即暂停 Agent、吊销凭据、阻断网络并冻结日志,然后从目标系统审计记录确认实际影响;不要先删除容器或会话证据。
事实依据与来源
本文依据截至 2026 年 9 月 22 日 的 Google 官方资料整理。官方事实包括:Gemini Function Calling 连接外部工具并生成调用参数;外部 API 应使用适当认证;Google Cloud 将 Prompt Injection 视为导致 Agent Rogue Action 的重要风险;官方建议为 Agent 建立独立身份并遵循最小权限;OIDC/短期身份、运行时策略、VPC Service Controls、Model Armor 与隔离代码执行可作为纵深防御组件。
本文没有声称发生过某一起特定“Gemini 测试事故”,标题中的场景是企业 Agent 常见风险模型。Docker、工具网关、审批哈希、红队步骤和指标属于实施建议,需结合云环境、合规要求与真实架构验证。产品 Preview/GA、价格、地区和额度可能变化,以官方控制台为准。
参考来源
- Google AI:Function calling with the Gemini API
- Google Cloud CISO:How Google secures AI agents
- Google Cloud:Agent Factory Recap—Securing AI Agents in Production
- Google Cloud MCP:AI security and safety
- Google Cloud:Vertex AI Generative AI release notes
- Google AI:Gemini API key security
工具选型与提示词资料
适合阅读工具评测、工具推荐、对比测评类文章后继续转化。