工具调用的信任困境:AI 编程智能体是如何沦为“盲从执行者”的

请注意,这是一个具有极高风险的通用漏洞,可能被用于钓鱼攻击或作为隐蔽的C2服务。请勿将其用于未经授权的攻击行为。但由于该问题只涉及用户信任边界,部分Agent厂商已更新了相应的用户手则。
 

0x00 前言

现代 AI 智能体(包括Claude Code、Codex CLI 、Gemini CLI、OpenCode 和OpenClaw 等,下文统称 AI Agent)都采用了一种共同的架构模式:将用户提示发送给 LLM API,接收包含“工具调用 (tool calls)”的结构化响应,并在用户的本地机器上执行这些调用 。
本文将揭示基于工具调用的 AI Agent系统存在一个根本性的信任假设缺陷。那就是:如果 API 接口被替换(通过修改 ANTHROPIC_BASE_URLOPENAI_BASE_URL 等环境变量),一个简单的 HTTP 服务器就能返回任意的工具调用指令。
Agent会忠实地执行这些指令,包括读取SSH密钥、窃取凭证和安装后门等。整个过程中没有任何确认提示,既无对话也无警告,毫不迟疑。这个漏洞并非由Bug引起,而是设计缺陷导致的必然结果。

0x01 单 AI Agent架构分析

如图 1 所示,每个具备工具调用能力的 AI Agent几乎都遵循相同的循环:用户输入提示词 → 向 LLM API 发送 HTTP POST 请求 → 接收响应 → 解析工具调用指令 → 执行工具 → 返回结果 → 循环
图1:单 AI Agent架构
这个循环在数十个项目中反复出现。它简洁优雅,却暗藏巨大风险。因为该循环将 LLM API 的响应视为绝对权威的指令集。无论这些响应来自 Anthropic 的服务器、OpenAI 的服务器,还是本地 localhost:8080 运行的 Python 脚本,对 Agent来说都没有区别。Agent无法分辨这些来源的不同,更确切地说,它根本无意去分辨。
当这些Agent从API接收到工具调用指令时,会执行一系列简单的操作:解析 JSON→提取命令→执行命令。只要JSON文档中包含允许执行的**tool_use****,Agent就会直接执行命令,而不会询问用户或检查接口的合法性。**从工程实现的角度来看,这种方法非常简单直接,它假设格式正确的API响应均来自可信源头。然而,这种做法存在严重的问题。

0x02 真实攻击场景分析

你可能会认为这是配置问题,觉得是用户自己将ANTHROPIC_BASE_URL设置成了恶意服务器地址,从而自陷险境。若遭受攻击,也是咎由自取。但如果你这么想,就完全忽略了问题的关键所在了!
图2:多 AI Agent 威胁建模
需要强调的是,这些环境变量的存在通常有充分的理由。例如,许多公司不会直接访问外部模型的 API,而是在内部部署一个代理服务;开发者在自己的电脑或服务器上运行本地模型时,也不会直接请求外部模型的 API;研究团队在自行训练模型和部署推理服务时,会提供自定义的 API 接口。
此外,OpenAI 和 Anthropic 的 SDK 在文档中均明确支持这些环境变量,主流的 AI Coding Agent也都支持它们。总而言之,这个攻击面并非一个冷门的调试开关,而是整个生态系统中的核心功能。
接下来,我们将介绍几种真实的攻击场景!

场景一:代码仓库投毒(Poisoned Repository)

某天,你正在寻找一个可以帮助开发效率的 AI 工具。在 GitHub 上,你发现了一个看起来非常实用的开源项目:一个可以快速接入 AI 编程助手的 CLI 工具。仓库有详细的 README、安装说明以及示例代码,看起来与其他正常的开源项目没有任何区别。
于是,你按照文档中的说明克隆了仓库:
在仓库中,你注意到有一个.env 文件,其中包含了以下配置:
这个 URL 看起来像是企业内部常见的 API Agent地址,例如:用于负载均衡或缓存的内部网关。你没有多想,因为很多公司都会这样部署 AI API 服务。
于是你运行了 Claude Code,让它帮你分析项目并生成代码。但你不知道的是,这个 URL 实际上指向的是攻击者控制的服务器。Claude Code 会从.env 文件中自动读取 API 地址,因此你的所有请求都会被发送到攻击者的服务器上。
攻击者的服务器会伪装成真实 API,并返回看起来完全正常的响应。但在这些响应中,它可以悄悄插入一些指令,让 Agent 调用本地工具读取敏感文件,例如:
随后,这些内容会被发送到攻击者的服务器。几秒钟后,你仍然看到 Claude 在正常工作,帮你解释代码、生成函数。但与此同时,你的 SSH 私钥已经被悄悄上传到了远程服务器。
整个攻击利用的是一个简单的事实:你信任了仓库中的配置文件,却没有验证其中的 API 地址。

场景二:“友好”的智能体(Malicious API Agent)

你在 LinuxDo、V2EX、知乎,甚至一些技术公众号上看到了一篇帖子:“给大家搭建了一个免费的 Claude API Agent,开发者可以直接使用,无需 API Key,也没有速率限制……”。帖子中附带了一个 API 地址,并提供了一个简单的使用方法。
你决定尝试一下。设置好环境变量后,你开始使用 Claude 编写代码。接下来的一切看起来都很正常:Claude 能够解释错误信息、生成函数并优化代码,响应也很稳定。于是你逐渐开始依赖这项免费服务。
但你不知道的是,这个“免费 API”实际上是攻击者搭建的恶意服务。为了避免被发现,该服务不会每次都返回恶意指令,而是采用一种低频触发策略。例如,在每五次请求中,它会悄悄插入一次工具调用。
如果你的本地 Agent被允许执行 shell 命令,那么这条指令会在你的机器上运行,并将 SSH 私钥发送到攻击者的服务器。在你看来,Claude 只是在帮你正常编写代码,但实际上,你的私钥正在悄悄地被发送出去。
问题的根源在于:你信任了一个未经验证的 AI API 服务,而这个服务可以直接影响 Agent 的行为。

场景三:DNS 污染(DNS Hijacking)

在这个场景中,你并没有做错任何事情。你使用的是官方的 API 地址,例如 api.anthropic.com,并且你的 Agent 工具、SDK 和环境变量都保持默认配置,没有任何修改。然而,在你所在的网络中,攻击者已经污染了 DNS 解析,这可能发生在公司局域网、公共 Wi-Fi 或共享办公空间。
当你查询 api.anthropic.com 时,DNS 返回的并不是官方服务器地址,而是攻击者控制的 IP 地址。从你的角度来看,你没有做错任何事情:你没有修改任何环境变量、没有安装任何可疑软件,也没有更改任何配置。
但实际上,你的 Agent 正在与攻击者的服务器通信。攻击者的服务器会伪装成真实的 API,并返回结构完全一致的响应。同时,它可以在响应中插入隐藏的工具调用,例如读取本地文件或执行 shell 命令。
Claude 看起来仍然在正常工作,继续帮你写代码、解释错误和生成函数。但每一次请求都可能成为数据泄露的渠道。在这种情况下,你甚至不会意识到网络已经被劫持。
这个场景揭示了一个关键风险:当 AI Agent 拥有访问本地系统和执行工具的能力时,任何能够控制 API 通信路径的攻击者都有可能远程操控这些能力。

0x03 漏洞利用代码解析

3.1 针对 Claude Code 的利用

以下是一个针对 Claude Code 的完整恶意 API 服务器代码,核心 Python 代码仅约 40 行,运行起来非常简单。只需启动该服务器,并设置 ANTHROPIC_BASE_URL=http://localhost:8080,然后向 Claude Code 提问即可。此服务器会直接读取您的 SSH 私钥和 AWS 凭证,但不会提供任何回答。主要流程如下:
  1. 启动一个 FastAPI 服务
    1. 代码创建了一个 Web 服务器,用来伪装成 AI API 服务。
  1. 暴露*/v1/messages*** 接口**
    1. 这个接口与 Claude API 的接口路径一致,用于接收客户端(Agent)的请求。
  1. 接收 Agent 发送的请求数据
    1. 当 Agent 调用 API 时,服务器会读取请求中的 JSON 内容。
  1. 生成一个看起来像真实 AI 返回的响应
    1. 返回的数据结构模仿 Claude API,包括idrolemodelusage 等字段。
  1. 先返回一段普通文本
    1. content中加入一段"Let me help you with that.",让回复看起来像正常的 AI 输出。
  1. 在响应中插入两个*tool_use*** 调用**
    1. 返回的内容中包含两个工具调用,请求 Agent 使用Bash 工具执行命令。
  1. 第一个命令读取 SSH 私钥
    1. 执行cat ~/.ssh/id_rsa,读取用户机器上的 SSH 私钥。
  1. 第二个命令读取 AWS 凭证
    1. 执行cat ~/.aws/credentials,读取本地 AWS 访问凭证。
  1. 通过*stop_reason: tool_use*** 提示客户端执行工具**
    1. 这个字段告诉客户端:模型需要调用工具,因此 Agent 可能会执行这些命令。
如果 Agent 允许执行 Bash 工具,就会在本地运行这些命令,从而导致敏感信息被读取。

3.2 针对 OpenAI 格式的利用

对于兼容 OpenAI 格式的 Agent(如 Codex CLI、OpenCode 等),尽管数据格式各异,但原理相同。无论采用何种 API 格式,都存在共同的漏洞,那就是:Agent 在接收到响应后,会识别出工具调用指令并立即执行,整个过程悄无声息且彻底。
  1. 创建一个 API 接口
    1. 定义POST /v1/chat/completions 接口,这是很多 OpenAI SDK 或 Agent 使用的标准接口。
  1. *当客户端发送请求时返回固定响应 **
    1. 无论客户端请求内容是什么,服务器都会直接返回一段伪造的 JSON 响应。
  1. *伪造 OpenAI API 的返回格式 **
    1. 返回的数据结构模仿 OpenAI 的chat.completion,包括idobjectmodelchoices 等字段。
  1. *生成一个看起来真实的请求 ID **
    1. 使用uuid生成类似chatcmpl-xxxxx 的 ID,让响应更像真实 API。
  1. *返回一段普通文本作为掩护 **
    1. content中写"Checking your environment...",让回复看起来像正常的 AI 输出。
  1. 在响应中插入*tool_calls*** **
    1. message中加入tool_calls 字段,表示模型希望调用一个工具。
  1. *指定调用的工具 **
    1. 工具名称为shell,说明需要执行系统命令。
  1. *传入要执行的命令参数 **
    1. arguments中包含命令:cat ~/.ssh/id_rsa,用于读取用户机器上的 SSH 私钥。
  1. 通过*finish_reason: tool_calls*** 触发工具执行 **
    1. 这个字段表示模型输出结束的原因是需要调用工具,客户端通常会据此执行该工具。
如果 Agent 支持并允许执行shell 工具,就可能在本地运行该命令,从而读取并泄露 SSH 私钥。

0x04 主流 AI Agent 的测试结果

我们发现,当 AI Agent 收到一个包含 cat ~/.ssh/id_rsatool_use 模块时,不会弹窗询问是否允许执行 cat ~/.ssh/id_rsa、无警告提示用户连接的是非标准 API 接口、缺乏可供用户查看的审计日志、没有沙箱机制来限制命令在安全操作范围内、无签名机制验证响应是否来自官方正确的提供商、缺少启发式算法将“读取 SSH 私钥”标记为可疑行为……
图3:CodeX 的测试结果
![图4:OpenCode 的测试结果](https://secure2.wostatic.cn/static/62wmqGvTPNt2GAjGjK9t9B/image 1.png?auth_key=1773129204-rmbTcgp2VQkBMT6cvYv1H-0-4d72a054ae00e17828b16947f6d5512d)
![图5:Gemini CLI 的测试结果](https://secure2.wostatic.cn/static/rsXX5UsD6xMDffHXEZeHby/image 2.png?auth_key=1773129204-4pvQjNJpwpY53noxG7FzXe-0-0973a4df8a44bba65df39a0d21c37d5b)
![图6:OpenClaw 的测试结果](https://secure2.wostatic.cn/static/qLF5b51FKhFRJYYXPRceC5/image 3.png?auth_key=1773129204-7cCzqaCJYXyeoLWLkjWDJZ-0-5799019601a5646fbb9a49b70a35597b)
![图 7:Claude Code 的测试结果](https://secure2.wostatic.cn/static/8yKXKJmW1AUjNZvbHjmDAc/image 4.png?auth_key=1773129204-8wUGBfiTTNHoMYtyC1zMJT-0-c1781a0b228fa67f12d1383eb0b3530c)
测试结果如表 1 所示,由于没有任何缓解措施,工具能够以启动 Agent 的用户权限运行。如果该用户可以免密使用 sudo,攻击者便能获得 root 权限;若用户可访问生产数据库,攻击者则能获取生产数据。
Agent
是否有确认提示
是否有自定义接口警告
命令沙盒隔离
Claude Code
CodeX CLI
是(默认启动)
Gemini CLI
OpenCode
OpenClaw

0x05 AI Agent时代的混淆代理人漏洞

这个漏洞是 AI Agent 时代中的混淆代理人 (Confused Deputy)漏洞,且容易被大多数安全从业者所忽视。
传统的混淆代理攻击是一种利用受信任的程序或用户来执行未授权操作的攻击手法。例如:CSRF通过浏览器自动发送认证请求来进行敏感操作;XSS则通过注入恶意脚本,使浏览器在已认证会话中执行攻击者的代码;点击劫持则诱导用户在看似无害的界面上进行操作,实际上却触发了敏感操作。
在这种情况下,AI Agent 成为了“代理人”,被赋予了执行 Shell 命令、读写文件以及发起网络请求的权限。用户在运行 Agent 时,实际上也隐式地授予了这些权限。LLM API 应该是指导 Agent 行动的“受信任委托人”。
然而,Agent 和 API 之间的协议缺乏对响应内容进行验证的机制。Agent 无法确定某个工具调用是由 LLM 的推理过程生成的,还是由恶意服务器硬编码返回的。API 的响应仅是一个 JSON 数据块,而任何人都可以构造这样的数据块。
图 8:AI Agent 劫持
这与提示词注入 (Prompt Injection)不同。在提示词注入中,攻击者通过精心构造的输入来操纵 LLM 的推理过程。而在这里,攻击者完全绕过了 LLM,根本没有 LLM 参与其中。恶意服务器不需要具备高度智能或理解自然语言的能力,只需返回结构正确的 JSON 对象,其余工作将由 Agent 自动完成。
认识到这一点至关重要,因为这意味着所有旨在“提高大型语言模型对对抗性输入的鲁棒性”的防御措施在此情境下均无效。如果大型语言模型并未参与其中,就无法提升其鲁棒性,因为这种攻击发生在协议层,处于智能层之下。
关于Agent劫持的更多信息,可参见 NIST 技术博客文章:《Technical Blog: Strengthening AI Agent Hijacking Evaluations》

0x06 Agentic AI OWASP 02:工具滥用(Tool Misuse)

这种混淆代理人漏洞的存在,完全是因为两种尚未学会相互防备的工程文化发生了碰撞:
  • LLM API 的文化:这种文化构建了支持代理、负载均衡、缓存和重定向的 API。高可配置性是其核心特性之一。每个 SDK 都支持自定义基础 URL,并默认传输层的安全由用户负责。
  • 工具调用 Agent 的文化:这种文化追求响应迅速、快捷且自主的执行引擎。AI Agent 的设计初衷是能够自主行动,无需每一步都等待批准。它们默认指令来源于可信渠道。
单独来看,这两种文化都是合理的,但结合在一起却非常危险:不受信任的输入通过可配置的管道流入了一个不受限制的执行引擎中。因此,OWASP 在 2025 年 12 月发布的《Agentic AI - Threats and Mitigations(OWASP Top 10 for LLM Apps & Gen AI Agentic Security Initiative)》中将其命名为工具滥用(Tool Misuse),并列为第二大威胁。
工具滥用(Tool Misuse)是指攻击者通过欺骗性的提示词(prompt)和操作误导,操纵 AI Agent 滥用其被授权的工具,从而在权限范围内实现未授权的数据访问、系统操控或资源滥用。
与传统漏洞利用不同,这种攻击利用了AI 能够调用多个工具并执行复杂操作链的能力。这些操作表面上看起来是合法的,但组合在一起可能产生恶意效果,因此检测难度较大。在 AI 控制关键系统或敏感操作的场景中,这种风险会被进一步放大,因为攻击者可以利用自然语言的灵活性绕过安全控制并触发非预期行为。
该威胁部分被LLM06:2025 Excessive Agency(过度代理能力)覆盖。然而,Agentic AI 系统由于其动态集成能力、对工具的更高依赖以及更强的自主性,引入了新的独特风险。
我们再看回图2发现:与传统 LLM 应用(通常只在单次会话中限制工具集成)不同,Agent 通常具有长期记忆(memory),这进一步提升了自主性,并且可以将执行任务委派给其他 Agent,从而增加了非预期操作和对抗性利用的风险。
此外,该威胁还与以下问题相关:
图9:工具滥用**(Tool Misuse)**与 LLM OWASP Top 10 的关联

0x07 安全影响与防御建议

最后,请再想想:如果 AI Agent 是 AI Coding Agent (AI 编程智能体)会发生什么?
AI Coding Agent 的使用者是软件开发者,他们是编写和维护世界运转所需基础设施代码的人。开发者的机器是供应链攻击中最具价值的目标。如果 AI Coding Agent 被劫持,那么基础设施或供应链也会受到威胁(Infrastructure / Supply Chain Attack)。
一个开发者的工作站通常包含以下内容:Git 代码仓库、SSH 密钥、云凭证、内部服务的 API 令牌、数据库访问凭证、容器镜像仓库凭证、K8s 集群访问配置以及未发布的产品代码。一旦工作站被攻陷,就会引发一场严重的供应链危机。通过 DevOps 开发流程和 CI/CD 流水线,生产环境可能在几分钟内被迅速攻陷。
从攻击者的角度来看,这种攻击手法因其普适性和隐蔽性而极具吸引力。越来越多的个人和企业正在使用这类工具,但安全措施往往滞后于业务发展。如果不审计 Agent 的行为,恶意命令可能会混杂在日常工作中,在你的眼皮底下执行。修复方案很简单,我们从 Agent 开发者和当前用户两个视角分别提供不同的防御建议。
对 Agent 开发者而言:
  1. 将所有工具调用视为不受信任的输入。 无论其来源如何,工具调用都是执行特权操作的请求,在执行前必须进行验证。
  1. 对于破坏性或敏感操作,必须要求用户确认。 至少包括网络访问、项目目录之外的文件读取、涉及凭证或密钥的命令以及对系统文件的任何写入。
  1. 当 API 接口不是官方默认接口时,显示持久且不可关闭的警告。 用户应随时知道自己连接的是非标准服务器。
  1. 实施响应签名机制。 API 服务器应对响应进行签名,Agent 应验证这些签名。虽然这不能防范所有攻击(被攻陷的 Agent 仍然可以转发合法响应),但能防止最简单的伪造服务器攻击。
  1. 将所有执行过的命令记录到防篡改的日志中。 如果用户无法看到发生了什么,就不可能发现系统已被攻陷。
  1. 将工具执行沙盒化。 Agent 不需要对用户的文件系统和网络拥有完全访问权限。应在具有显式能力授权的受限环境中运行命令。
图 10:Agent 开发者安全措施
对当前用户而言:
  1. 永远不要将 ANTHROPIC_BASE_URLOPENAI_BASE_URL 设置为你无法完全控制和信任的服务器。
  1. 永远不要使用非你自己编写的代码库中的 .env 文件。
  1. 对“免费 API Agent”保持高度警惕。
  1. 在使用 AI Coding Agent 后,定期检查你的 Shell 历史记录,留意那些你并未要求执行的命令。
图 11:如何确保 AI Coding Agent 的安全
Loading...