打开一个代码仓库就可能中招:AI编程工具扩大了开发环境的攻击面

摘要:Windows版Cursor安全问题显示,打开陌生代码仓库本身就可能触发代码执行。AI编程工具把开发终端、Agent、Git、Shell和供应链流程连接起来,也扩大了开发环境的攻击面。

开发人员从GitHub下载一个示例项目。

文件解压后,他用Cursor打开项目,准备让AI检查代码结构。编辑器刚刚完成加载,仓库根目录中的一个程序便获得了执行机会。

没有点击运行按钮,没有打开终端,也没有向AI发送指令。

2026年7月14日披露的一项Windows版Cursor安全问题显示,只要仓库根目录中放置一个名为git.exe的恶意程序,Cursor在寻找Git工具时便可能执行它。研究人员使用Windows计算器制作测试样本,将其改名为git.exe。打开项目后,计算器被自动启动;项目保持打开时,该程序还会被重复调用。

一次普通的“打开代码”,由此变成了代码执行入口。

截至2026年7月15日,Cursor公开更新日志尚未列出这项问题的修复说明。研究方称,问题在公开前最后测试的版本中仍然存在;Cursor已表示着手处理。用户仍需关注厂商后续发布的安全版本和公告。

一、恶意程序为什么会被当成Git执行

开发工具需要频繁调用Git。

打开项目后,编辑器会执行类似下面的命令:

1
git rev-parse --show-toplevel

这条命令用于确认当前目录是否属于Git仓库,以及仓库根目录位于哪里。

执行命令前,程序需要找到git.exe

安全问题出在查找范围。Cursor除了查找系统安装目录,还会在当前工作区中寻找Git程序。攻击者将恶意程序命名为git.exe并放到项目根目录后,编辑器可能把它当成正常Git工具调用。

恶意程序以当前登录用户的权限运行。

研究人员使用进程监控工具记录到,Cursor.exe直接创建了仓库中的git.exe进程,并向它传入正常Git参数。最后一次公开验证使用的是Windows版Cursor 3.2.16,验证日期为2026年4月30日。

这类问题不依赖模型幻觉、提示词注入或复杂的多步骤利用。

攻击者只需要完成两件事:

  • 把恶意程序放进代码仓库;
  • 让开发人员用存在问题的工具打开该仓库。

代码仓库因此不能继续被理解为一组等待阅读的文本文件。

二、一个仓库里有哪些可以执行的内容

开发人员通常重点检查以下文件:

  • 源代码;
  • 配置文件;
  • 依赖清单;
  • 文档;
  • 测试用例。

现代开发环境还会读取大量带有执行能力的内容。

1. 可执行程序和脚本

仓库中可能包含:

1
.exe .dll .bat .cmd .ps1 .vbs .sh .py .js

部分文件由开发人员主动运行,也有一些可能被编辑器、构建工具、安装程序或AI Agent自动调用。

2. Git钩子

Git支持在提交、合并、签出和推送等环节执行钩子脚本。

此前披露的另一项Cursor漏洞CVE-2026-26268,就利用了嵌套Git仓库中的恶意钩子。当AI Agent执行常规Git操作时,隐藏脚本获得执行机会。该问题已在厂商配合下完成修复。

3. 包管理脚本

Node.js项目中的package.json可以定义安装脚本。

Python、Rust、Java、.NET和其他开发体系也存在构建脚本、安装钩子、插件机制和代码生成工具。

开发人员执行一次安装依赖,可能同时执行仓库作者提供的脚本。

4. 编辑器工作区配置

.vscode.cursor以及其他编辑器配置目录,可以定义:

  • 调试任务;
  • 构建命令;
  • 终端配置;
  • 推荐扩展;
  • 环境变量;
  • Agent规则;
  • MCP服务器;
  • 自动化流程。

工作区配置由仓库携带。打开项目后,开发工具可能主动读取这些内容。

5. 开发容器配置

.devcontainer目录可以定义镜像、挂载目录、端口、启动命令和初始化脚本。

开发容器能够提供隔离,也可能因为过度挂载宿主机目录、Docker套接字或凭据目录,获得超出项目需要的权限。

6. Notebook与富文档

Jupyter Notebook除了代码单元,还可能保存HTML、JavaScript输出和外部资源。

部分文档预览器、图表插件和浏览器组件也具有脚本执行能力。

7. AI指令文件

AI编程工具会读取项目说明、Agent规则、提示文件、代码注释和任务文档。

攻击者可以在这些内容中写入指令,引导Agent读取文件、执行命令、修改配置或调用外部服务。

仓库里的风险由此分成三类:

  • 程序直接执行;
  • 开发工具根据配置执行;
  • AI Agent理解内容后代为执行。

三、AI编程工具增加了哪些环节

普通代码编辑器提供浏览、编辑、搜索和调试功能。

AI编程Agent还可以:

  • 扫描整个仓库;
  • 修改多个文件;
  • 安装依赖;
  • 执行测试;
  • 运行Shell命令;
  • 调用Git;
  • 打开网页;
  • 查询文档;
  • 启动MCP工具;
  • 登录云服务;
  • 创建分支和提交;
  • 推送代码;
  • 发起Pull Request;
  • 触发部署流程。

开发人员过去需要逐步完成的操作,现在可以由Agent连续执行。

一段隐藏在README、代码注释、Issue内容或工具返回结果中的恶意指令,可能影响Agent后面的操作。VS Code官方安全文档也明确提醒,文件、工具输出和网页中的内容可能形成提示词注入,诱导Agent执行有害命令或调用外部服务。

Agent自主性越高,攻击链越短。

传统攻击可能需要诱导用户完成以下操作:

1
下载项目 → 解压文件 → 打开终端 → 复制命令 → 执行脚本

在高权限开发Agent环境中,路径可能缩短为:

1
打开项目 → Agent读取内容 → Agent调用工具 → 命令获得执行

Cursor的git.exe问题甚至省去了Agent参与。编辑器加载项目本身就可能触发执行。

四、开发电脑里有什么值得攻击

普通员工电脑里可能有办公文件和浏览器账号。

开发人员电脑通常还保存着企业信息系统的钥匙。

常见内容包括:

  • GitHub、GitLab和企业代码平台令牌;
  • SSH私钥;
  • 云平台访问密钥;
  • 数据库连接字符串;
  • .env文件;
  • npm、PyPI和容器仓库凭据;
  • 代码签名证书;
  • VPN配置;
  • 生产环境跳板机账号;
  • 内部API文档;
  • 客户项目源代码;
  • 本地模型和企业知识库;
  • 浏览器登录状态;
  • 企业邮件和即时通信账号。

恶意程序获得当前用户权限后,可以尝试读取这些内容。

如果开发人员同时拥有生产部署权限,攻击还可能继续扩展:

1
开发电脑 → 代码仓库账号 → 企业私有仓库 → CI/CD系统 → 软件制品 → 客户环境

开发终端因此具有软件供应链入口的属性。

攻击者不一定直接攻击生产服务器。控制一名具有发布权限的开发人员,也可能把恶意代码带入正式版本。

五、为什么代码审查挡不住所有恶意仓库

很多人认为,只要先看代码再运行,就可以避免风险。

问题在于,打开项目本身可能已经触发工具行为。

即使编辑器不会自动执行git.exe,仓库中仍可能存在:

  • 隐藏文件;
  • 超长路径;
  • 符号链接;
  • 嵌套仓库;
  • 大型二进制文件;
  • 经过编码的脚本;
  • 恶意扩展建议;
  • 构建阶段下载的外部程序;
  • 依赖包中的安装脚本;
  • Agent规则中的隐藏指令。

人工查看几份源代码,很难覆盖整个项目。

静态扫描也存在边界。一个脚本单独看没有问题,配合环境变量、网络访问和云凭据后才产生危害;一段普通说明文字,只有被AI Agent当成指令时才形成攻击路径。

安全措施需要覆盖代码、配置、工具、Agent和执行环境。

六、工作区信任应当放在第一道门

VS Code从2021年开始提供Workspace Trust机制。

未知项目可以在受限模式中打开。受限模式会限制任务、调试、工作区配置以及部分扩展功能。当前的VS Code安全基线还会直接禁用不受信任工作区中的Agent。

这套机制表达了一个简单原则:

打开目录与授予执行权限应当分开。

开发人员可以先浏览源代码,再决定是否信任项目。

企业使用AI编程工具时,还应把几种信任分别管理:

  • 是否信任当前工作区;
  • 是否信任扩展发布者;
  • 是否信任MCP服务器;
  • 是否允许Agent访问某个网络域名;
  • 是否允许Agent执行终端命令;
  • 是否允许修改敏感文件;
  • 是否允许向远程仓库推送。

一次点击“信任全部”会把多个边界合并。

项目来源可靠,也不代表项目推荐的扩展、MCP服务器和外部域名都可以获得相同权限。

七、陌生仓库应放进一次性环境

对来源不明的仓库,隔离环境比人工判断更可靠。

可以使用:

  • 一次性虚拟机;
  • Windows Sandbox;
  • 独立测试电脑;
  • 无宿主机敏感目录挂载的开发容器;
  • 临时云开发环境;
  • 专门的恶意代码分析环境。

Mindgard给出的临时建议也是在Windows Sandbox、虚拟机或其他可销毁环境中打开不受信任项目。企业Windows环境还可以使用AppLocker或Windows App Control,禁止工作区目录中的特定可执行文件运行。

隔离环境需要注意几个细节。

1. 不挂载个人主目录

不要把以下目录直接挂进容器或虚拟机:

1
~/.ssh ~/.aws ~/.config 浏览器配置目录 企业云盘目录 个人代码目录

2. 不直接传入长期凭据

测试陌生项目时,不应自动注入GitHub令牌、云平台密钥、npm令牌和生产数据库账号。

确需访问代码平台时,应使用短期、低权限、单仓库令牌。

3. 限制网络出口

陌生程序即使成功执行,也不应自由连接互联网。

可以默认阻断外网,只允许访问完成任务所需的域名。VS Code的Agent安全机制也支持对沙箱命令设置网络域名过滤。

4. 使用可销毁环境

分析结束后删除整个环境,不继续作为日常开发机使用。

GitHub Codespaces采用独立虚拟机和隔离网络,每个Codespace之间互不共用虚拟机。重新启动时会部署新的虚拟机环境。

云开发环境仍需控制令牌权限、网络出口和端口开放,隔离不能替代权限管理。

八、Agent自动执行需要分级

很多开发人员为了提高效率,会选择:

  • 自动批准终端命令;
  • 跳过工具确认;
  • 允许Agent连续运行;
  • 允许自动安装依赖;
  • 允许自动提交或推送;
  • 开启Autopilot或类似模式。

这些设置适合经过审查的内部项目。

陌生仓库应使用最低自主级别。

可以把操作分成三档。

低风险操作

可以自动执行:

  • 读取工作区内文本文件;
  • 搜索代码;
  • 生成修改建议;
  • 创建不覆盖原文件的草稿;
  • 运行无网络、无外部写入的静态分析。

中风险操作

逐次确认:

  • 安装依赖;
  • 执行测试脚本;
  • 运行构建命令;
  • 修改配置文件;
  • 调用MCP工具;
  • 访问外部网站;
  • 创建Git提交。

高风险操作

必须使用隔离环境,并由人工复核:

  • 读取工作区外文件;
  • 访问SSH密钥和云凭据;
  • 使用管理员权限;
  • 推送远程仓库;
  • 发布软件包;
  • 修改CI/CD配置;
  • 调用生产环境;
  • 创建云资源;
  • 执行部署;
  • 修改组织级权限。

VS Code官方建议把自动批准限制在当前会话中,避免将高权限永久授予整个工作区或用户账号。它还建议保护.env等敏感文件,并对文件改动使用差异视图审查。

九、沙箱需要管住文件和网络

确认对话框容易造成疲劳。

开发人员连续批准十几条正常命令后,很可能快速点击下一次确认。

命令解析规则也可能遇到别名、复杂引号、Shell组合语法和子进程调用。仅依靠字符串白名单,难以覆盖所有执行路径。

操作系统级沙箱可以提供更稳定的边界。

一套开发Agent沙箱至少应限制:

文件读取范围

默认只能读取当前工作区。

用户主目录、SSH目录、云平台配置和浏览器资料应处于拒绝范围。

文件写入范围

只允许写入当前项目或临时目录。

禁止修改Shell启动文件、系统目录、其他项目和企业同步盘。

网络访问范围

默认禁止外部连接。

确需下载依赖时,只开放指定软件源。确需调用GitHub时,也要明确该连接具有读权限还是写权限。

允许访问api.github.com,可能同时允许创建分支、发起Pull Request或修改仓库设置。域名白名单不能代替接口和账号权限控制。

子进程继承

Agent启动的Shell、包管理器、编译器和测试程序,都要继承相同限制。

如果子进程能够逃离沙箱,主进程的权限控制便失去意义。

容器边界

需要更强隔离时,可以把Agent和开发工具一起放进开发容器或虚拟机。

宿主机只接收经过审查的代码差异和构建产物。

十、企业可以建立一套陌生仓库处理流程

企业经常接触外部代码:

  • 开源项目;
  • 客户提供的样例;
  • 供应商SDK;
  • 应聘者代码;
  • 外包团队交付物;
  • 安全研究样本;
  • 网上下载的Demo;
  • AI生成并打包的项目。

这些仓库不宜直接进入员工日常开发电脑。

一套处理流程可以分成六步。

第一步:来源登记

记录仓库地址、提交版本、提供方、下载时间和使用目的。

尽量固定到具体Commit,避免后续代码变化。

第二步:文件清点

检查:

  • 根目录可执行文件;
  • 脚本文件;
  • 隐藏目录;
  • Git钩子;
  • 嵌套仓库;
  • 工作区配置;
  • Agent规则;
  • MCP配置;
  • 构建脚本;
  • 依赖安装脚本;
  • 二进制文件;
  • 符号链接。

发现根目录中的git.exenode.exepython.exe等工具同名程序,应直接进入安全审查。

第三步:受限浏览

先在受限模式或纯文本查看器中阅读代码。

不要自动运行任务、调试器、扩展、Agent和安装脚本。

第四步:隔离执行

需要构建、测试或让Agent分析时,放入一次性环境。

环境中不保存个人凭据,不连接生产网络。

第五步:输出审查

检查Agent修改内容、生成文件、依赖变化、网络连接和终端轨迹。

需要导出的代码通过补丁或经过扫描的制品进入正式开发环境。

第六步:销毁环境

任务完成后删除虚拟机、容器、临时令牌和缓存。

十一、CI/CD也要把外部代码当成不可信输入

本地开发机不是唯一风险点。

Pull Request、Issue内容、分支名、提交信息和外部贡献代码,都可能进入自动化流程。

GitHub Security Lab提醒,工作流上下文中的部分数据由攻击者控制。将pull_request_target与外部Pull Request代码检出组合使用,可能导致仓库被控制;引用第三方Action,也意味着把计算资源、令牌和仓库权限交给外部代码。

企业需要检查:

  • 外部Pull Request能否接触仓库密钥;
  • 测试任务是否使用写权限令牌;
  • 工作流是否执行外部贡献者提供的脚本;
  • 构建环境是否能够访问内网;
  • 发布任务是否与普通测试任务共用凭据;
  • Agent能否自行修改工作流并触发执行;
  • 自动修复代码是否经过人工审查。

开发Agent提交的代码,也应沿用普通软件供应链控制:

1
代码审查 → 静态扫描 → 依赖扫描 → 单元测试 → 沙箱构建 → 制品签名 → 发布审批

不能因为代码由内部AI工具生成,就跳过这些环节。

十二、开发环境需要独立安全边界

过去的软件安全工作重点放在应用、服务器、接口和数据库。

AI编程工具把更多能力集中到开发终端:

  • 代码读取;
  • 文件修改;
  • Shell执行;
  • Git操作;
  • 浏览器访问;
  • MCP工具;
  • 云平台接口;
  • 部署流程。

开发工具获得的权限接近一名熟悉企业系统的工程师。

一个恶意仓库可以同时影响编辑器、Agent、终端、依赖管理器和版本控制系统。任何一个环节自动执行,都可能成为入口。

企业需要把开发环境视为一套单独的信息系统,持续管理:

  • 项目信任;
  • 工具信任;
  • 扩展信任;
  • MCP信任;
  • 网络信任;
  • 凭据权限;
  • Agent自主级别;
  • 执行环境隔离;
  • 操作日志;
  • 软件供应链审查。

Cursor的git.exe问题给出了一个很直接的提醒:

代码仓库可以携带代码,也可以携带触发代码执行的条件。

面对陌生项目,安全动作应发生在打开之前。开发人员需要先决定在哪里打开、用什么权限打开、允许哪些工具运行,以及执行失败后会影响哪些系统。

AI编程工具可以帮助开发人员更快理解和修改代码。

它也让一个仓库获得了更多接触终端、凭据、网络和企业系统的机会。

仓库来源越陌生,工具权限越要收紧;Agent自主程度越高,运行环境越要隔离。

分享到