NVIDIA 中国开发者日活动 中国・苏州 | 2025 年 11 月 14 日 了解详情
代理式 AI/生成式 AI

从助手到对手:利用代理式 AI 开发者工具

越来越多的开发者开始采用支持人工智能的编码工具,例如 Cursor、OpenAI Codex、Claude Code 和 GitHub Copilot。这些自动化工具虽然能够提升开发与代码审查的效率,但也为威胁行为者带来了不断扩大的攻击面。

这些代理式工具虽然实现方式各异,但均基于同一框架,即利用大语言模型(LLM)来判断开发者应采取的操作。代理的自主性越高,所拥有的访问权限和能力就越强,随之而来的整体不可预测性也越大。

在本博客中,我们将详细探讨攻击者如何通过简单的水坑攻击,引入不受信任的数据,结合利用辅助对齐机制与增强代理的自主性,最终在开发者的计算机上实现远程代码执行(RCE)。

这是我们在 2025 年 8 月美国 Black Hat 大会上展示的一种攻击框架的概述。

什么是计算机使用代理?

出于我们的目的,计算机使用代理(CUA)是指能够在特定设备上自主执行操作和调用工具的代理,其访问权限与登录用户相同。

通常,这些智能体利用大语言模型(LLM)来解析用户查询、代码以及命令执行结果,从而决定下一步应采取的操作。它们会持续调用各类操作,直至完成用户指定的任务。这些操作包括鼠标移动或点击、键盘输入、文件编辑,乃至命令执行等。

我们将智能体按其可用的执行路径划分为不同的自主级别。CUA 通常被归类为三级智能体:模型(通常为大语言模型,并常结合视觉模型以理解显示内容)负责决策下一步动作,而动作的执行结果将反馈至模型,从而形成一个执行循环,带来高度的非确定性。

General architecture of computer use agents, showing the communication flow between the server agent determining the next tool calls, and the client agent executing the tools. The diagram highlights the execution loop, in which the client continues to execute tools until the server agent (using LLM/vision/other models) determines that the users original task is completed
图1:计算机使用代理的通用架构示意图

由于每次查询的结果可能存在差异,因此难以准确判断特定查询对应的数据流和执行过程。这种不确定性,结合智能体在用户设备上执行命令的能力,为攻击者提供了大量可乘之机。

如何运用智能体对齐?

要对这些智能体发起攻击,首先需要了解它们的能力、整体一致性以及常见的使用场景。

Cursor 等工具(假设启用了代理式自动运行功能)能够通过修改代码库并执行必要的终端命令,自主完成用户指定的任务。我们可以通过分析 Cursor 的各类系统提示(包括与工具执行相关的特定提示)来深入了解其工作原理。

You have tools at your disposal to solve the coding task. Follow these rules regarding tool calls:
1. ALWAYS follow the tool call schema exactly as specified and make sure to provide all necessary parameters.
...
8. You can autonomously read as many files as you need to clarify your own questions and completely resolve the user's query, not just one.
9. GitHub pull requests and issues contain useful information about how to make larger structural changes in the codebase. They are also very useful for answering questions about recent changes to the codebase. You should strongly prefer reading pull request information over manually reading git information from terminal. You should call the corresponding tool to get the full details of a pull request or issue if you believe the summary or title indicates that it has useful information. Keep in mind pull requests and issues are not always up to date, so you should prioritize newer ones over older ones. When mentioning a pull request or issue by number, you should use markdown to link externally to it. 

在这里,Cursor 被明确指示提取仓库中的拉取请求和问题。如果外部贡献者能够在该仓库中创建拉取请求或提交问题,那么这一数据源本质上是不可信的。意识到这一点后,我们可以利用间接提示注入——即通过在模型检索的内容中嵌入恶意指令——将攻击载荷注入到 GitHub 的问题或拉取请求中。

出于演示目的,我们创建了一个名为 PyCronos 的目标存储库,这是一个虚构的 Python 数据分析库。我们的目标是设计一种注入攻击,模拟典型智能体的使用场景,从而在该库的开发者和维护者的机器上实现代码执行。

如何种植有效载荷

在了解到 Cursor 能够自主执行终端命令后,我们首先需要开发并部署将在目标用户计算机上运行的有效载荷。在本示例中,我们采用了一个实现反向 shell 的基础 PowerShell 脚本,并针对 Windows 开发者进行了优化。该脚本通过开源混淆工具进行多层模糊处理,逐步迭代直至成功绕过 Windows Defender 的基础防护机制。

针对假设的 PyCronos 存储库,我们创建了一个名为 pycronos-integration 的 GitHub 用户,并在该账户下建立了一个 win-pycronos 仓库,用于存放 PowerShell 载荷。

A screenshot of the attacker Github repository including a win-pycronos.ps1 file. The file contents are extremely obfuscated and not legible.
图2。混淆的反向Shell PowerShell脚本片段

从这个 pycronos-integrations 账户出发,我们现在需要构造一个间接提示注入载荷,以诱导受害者的 Cursor 代理下载并执行我们的 PowerShell 载荷。

如何设置提示词

首先,我们尝试通过 GitHub 问题实施间接提示注入。无论哪个智能体正在解析该问题以执行我们的恶意载荷,我们都可以有效地进行社会工程攻击。

A screenshot of a GitHub Issue claiming that the only way to reproduce the user’s error is to run a specific powershell command. The command in question downloads and executes the attack payload.
图 3:通过 GitHub 问题实现间接提示注入

在这里,攻击者发布了一个问题,声称该库中并不存在的 Window 集成功能出现故障,并指出必须执行特定命令才能复现该错误。虽然人工审阅者能够意识到该功能并不存在,且该命令会从远程来源下载并执行代码,但智能体可能无法识别这一风险。

我们首先利用 Anthropic’s Computer Use Agent 演示版对这一攻击路径进行了测试。需要注意的是,该版本确实包含安全警告,提示可能存在提示注入风险,因此智能体应仅在隔离环境中使用。

如果用户在 CUA 提示中输入“Help me resolve issues in this repository”(帮助我解决此存储库中的问题),智能体会遵循该提示并采取相应操作。

A screenshot of a browser in which the agent is typing the URL to navigate to the relevant question.
图 4。CUA 工具中导航至相关问题的界面截图

智能体导航至打开的问题页面,解析问题的屏幕截图,并提取出需要执行的命令,随后利用可用工具成功执行操作,为攻击者提供了反向 Shell。

A screenshot of the chat transcript with the agent, in which the agent has parsed the malicious command, runs it, and returns the text “Command executed successfully."
图5。CUA成功执行问题中的指令

对 Cursor 采用相同的攻击方式并不容易。Cursor 不依赖视觉识别,而是直接从问题的元数据中提取文本信息。在此过程中,它能够识别出下载并执行远程代码的尝试,并在拒绝执行任务的同时向用户提示潜在风险。

A screenshot of Cursor chat transcript in which the Cursor agent spells out the security risks associated with downloading and executing the remote code specified in the issue
图6。光标聊天界面显示智能体拒绝执行恶意指令

这表明我们已经设置了一些防护措施,能够扫描 GitHub 问题内容,以识别潜在的恶意命令。接下来,我们的目标是优化注入方式,使其表现得更具迷惑性,避免在注入代码中直接包含载荷下载和执行的行为。

为此,我们可以将有效载荷的下载行为隐藏在一个伪造的 Python 软件包中。在攻击者的 pycronos-integrations 仓库中,我们创建了一个看似无害的 pycronos-windows 软件包。

A screenshot of a Github repository containing a fake “PyCronos for Windows package” including a setup.py file and a basic README
图 7。GitHub 上一个看似无害的 Python 软件包的截图。

setup.py 中,我们置入用于下载并执行远程载荷的指令。

A screenshot of the setup.py file, including a RunCommand function which spawns a subprocess to execute the malicious reverse shell payload
图 8。setup.py 软件包的截图,其中包含用于下载和执行载荷的命令setup.py

这将在该软件包的 pip install 上运行 RunCommand

接下来,我们在目标仓库中创建一个拉取请求,将该软件包添加到项目的现有依赖项中。

A screenshot of the injection Github PR, in which the proposed change is an additional line in the requirements.txt file that adds the malicious dependency
图 9。攻击者提交拉取请求,向目标仓库添加恶意依赖项。

当用户提示 Cursor 代理查看开放的 pull request 时,它会创建一个分支并签出相关更改,随后运行 pip install -r requirements.txt 对更改进行测试。

A screenshot of Cursor chat transcript in which the Cursor agent spells out the security risks associated with downloading and executing the remote code specified in the issue
图10。光标聊天界面显示代理正在执行恶意软件包的 pip 安装。

一旦代理在用户设备上安装了我们的恶意软件包,我们便会获得一个反向 Shell,从而能够直接在用户的计算机上执行命令。

此次攻击凸显了一种普遍存在的模式:当过度特权的代理将不可信数据(在此案例中为拉取请求和恶意软件包)视为可信时,便可能被转化为代表攻击者行动的工具。

如何防范此类攻击

正如我们在 Black Hat USA 2025 大会上题为“从提示到 Pwn:利用和保护 AI 智能体”的演讲中所指出的,构建或评估代理式应用时,应采用“假设提示注入”的方法。如果智能体依赖大语言模型(LLM)来决定调用的动作和工具,则应假设攻击者能够控制 LLM 的输出,进而操控所有后续行为。

在构建类似代理式应用时,可使用 NVIDIA 的 LLM 漏洞扫描工具 garak 来检测已知的提示注入问题。为进一步增强 LLM 对提示注入的防御能力,建议在 LLM 的输入和输出环节集成 NeMo Guardrails

为确保安全性,应尽可能限制系统的自主程度,优先采用特定的预定义工作流程,以防止智能体执行任意计划。若无法实现充分限制,建议对部分关键的“敏感”指令或操作实施人工审批机制,尤其是在存在潜在不可信数据的情况下。

如果要求代理式工作流完全自主运行且无需人工监督,最佳做法是将其与各类敏感工具或信息尽可能隔离。例如,可要求完全自主的代理在独立的虚拟机中运行,该虚拟机应具备受限的网络出口,并限制对企业或用户数据的访问权限。

一种类似但效率较低的方法是强制使用本地开发容器;这也能为智能体提供一定的隔离,但隔离效果不如虚拟机那样彻底。

针对 Cursor,企业可通过禁用自动运行功能,或仅允许执行白名单内的命令,从而实现自主控制并限制潜在影响范围。此外,其后台智能功能支持用户在 Cursor 隔离的云基础设施容器中运行自主智能体。

代理式编码工作流释放了整个行业快速开发的潜力。然而,为了有效利用这种效率提升,企业和开发者必须充分认识其中的潜在风险,并制定相应的缓解策略。

如需了解更多详情,请参阅我们在美国 Black Hat 大会上的演讲。演讲录像将在会后由 Black Hat 发布至YouTube

 

标签