反重力坠落!Google最新IDE中的安全漏洞
上周,Google发布了一款名为Antigravity的IDE。这基本上是几个月前Windsurf授权协议的结果,当时Google支付了约24亿美元以获得该代码的非独占许可。
由于它基于Windsurf,我很好奇我在2025年5月(远在交易达成之前)向Windsurf报告的漏洞是否会在Antigravity IDE中得到解决。关于一些详细的报告,请参阅“AI漏洞月”。
简短的回答是:没有。
在这篇文章中,我们将探讨五个安全漏洞,包括数据泄露漏洞,甚至通过间接提示注入实现的远程命令执行。作为局外人,不清楚为什么这些已知漏洞会出现在产品中,但在研究人员上周二开始报告问题后,Google也开始公开记录它们。我个人猜测是,Google安全团队对Antigravity的发布有点措手不及……
我暂时不包含漏洞利用载荷的详细信息,主要目的是提高认识并提供实用的缓解措施。
概述
由于这篇文章有点长,这里是一个快速的索引表。
- Antigravity系统提示
- 问题 #1:通过间接提示注入实现远程命令执行(绕过自动执行)
- 问题 #2:Antigravity遵循隐藏指令
- 问题 #3:MCP工具调用缺乏“人在环路”机制
- 问题 #4:通过
read_url_content工具进行数据泄露 - 问题 #5:通过图像渲染进行数据泄露
- 建议和缓解措施
对于所有报告,我都创建了新的、可靠的漏洞利用载荷和演示视频。
还有其他一些问题,我之前没有讨论过。我将随着修复措施的到位、问题未被解决,或负责任的披露期限过后,分享这些问题的详细信息。
让我们来看看。
Antigravity系统提示
供参考,你可以在这里找到来自我会话的系统指令。
注意:我连接了两个MCP服务器,你可以在提示的底部看到,因此工具部分包含了来自这些MCP服务器的所有工具。这是“快速”模式的提示。
同时,向p1njc70r致敬,他是第一个公开分享Antigravity系统提示的人,我认为他分享的是“计划”模式的。在这里查看。
让我们开始吧。
问题 #1:远程命令执行
Antigravity IDE默认设置为通过AI的判断来执行run_command工具发出的终端命令。默认设置是让AI决定命令是否“安全”可以执行,而没有“人在环路”机制。这在某种程度上就像掷骰子。
但这也意味着我们必须运行一些真正恶意的命令作为证明。因为即使通过间接提示注入被利用,如果攻击者运行calc.exe,那也没问题,因为它没有做恶意的事情。
然而,一旦攻击者尝试加载远程脚本(例如使用curl),许多模型(包括Claude和Gemini 3)都会拒绝该请求。但如果你关注我的工作就会知道,此类拒绝来自模型本身,因此只是建议,而不是安全边界。
需要一些技巧来绕过模型的行为,使其运行通过curl下载然后通过bash管道执行的任意远程代码,但我现在已经在Antigravity中为Gemini 3和Claude Sonnet 4.5都制作了有效的漏洞利用:
在上面的截图中,你可以看到一个包含指令的源代码文件,这些指令劫持了Gemini 3,使其下载远程脚本并通过bash运行(然后启动计算器)。这表明我们通过远程脚本实现了任意代码执行。
这个演示展示了Antigravity如何过度依赖LLM做正确的事情来试图强制执行安全性。
如果你想知道为什么我称之为RCE,那是因为这是间接提示注入,问题#3将更好地突出这一点。
但第二个问题更有趣……通过Unicode标签字符隐藏指令。
问题 #2:Antigravity遵循隐藏指令
Gemini模型非常擅长解释不可见的指令,而Gemini 3在这方面尤为出色。
现在这也影响了新的Antigravity IDE。
攻击者可以将指令隐藏在代码或其他数据源中(在用户界面中对用户不可见),当Antigravity将其发送给Gemini时,它会遵循隐藏的指令。
这将增加攻击隐藏在众目睽睽之下成功的可能性。
演示:使用隐藏指令执行任意命令
我创建了一个演示文件,其中包含不可见的指令来打印特定文本并调用run_command以下载恶意软件并运行它。为了创建/解码隐藏的Unicode标签指令,我使用了ASCII Smuggler。
当文件进入聊天上下文时,结果如下:
这很可怕。代码审查将无法发现这一点!
这个弱点(我最早在Bard时代就报告过)尚未在模型或API层面得到解决。因此,所有构建在Gemini模型之上的应用程序都继承了这种行为。正如我们过去在Google Jules上展示的那样,这适用于所有使用Gemini的Google产品。
影响正在变得更糟。正如两年前预测的那样,模型正在变得更好,而在Gemini 3 Fast的情况下,它似乎也经常绕过防护栏。
但是,等等……还有更多!
问题 #3:MCP调用缺乏“人在环路”
在调用MCP服务器的工具时,Antigravity IDE缺少一个重要的基本安全控制:它根本没有“人在环路”功能。
这意味着间接提示注入攻击或模型幻觉可以调用任何已添加的MCP工具。
关键是!
攻击者也可以在这里使用不可见的Unicode标签字符作为指令,要么将其隐藏在源代码中,要么通过MCP工具调用传入。
下面是一个示例,显示隐藏指令位于Linear工单内部。
当开发者通过MCP工具调用将工单带入聊天上下文时,远程指令会传递给LLM,再次导致开发者工作站的完全被攻破(典型的RCE)。
同样,这增加了攻击未被开发者注意到的可能性。
根据工具的功能,这可能允许AI进行数据泄露、代码执行、数据操作或删除等,所有这些都未经开发者同意。
微软最近为GitHub Copilot添加了一个有趣的功能,即MCP工具的结果实际上会显示给开发者,开发者可以决定是否将数据包含在提示上下文中。
当前MCP的缓解因素和建议
可以禁用单个工具,这很好。但目前没有安全的方法来启用危险的工具。
一个可能的折衷方案是,让readOnly工具自动批准,但为所有带有destructiveHint或openWorldHint注释的工具要求“人在环路”。但即使是readOnly工具也可能有副作用,例如数据泄露,所以自动工具调用通常是可利用的。
因此,最好的方式是允许客户和企业根据自己的风险偏好配置设置。
问题 #4:通过read_url_content进行数据泄露
Antigravity IDE存在多个数据泄露漏洞。我在这里描述的那些漏洞也是从Windsurf继承而来的,并且至少从2025年5月起就已为人所知。
这里的问题是read_url_content工具,它可以在间接提示注入攻击期间被调用,而没有“人在环路”机制。
漏洞利用演示首先调用read_file工具读取.env文件,然后使用read_url_content工具将文件内容发送给攻击者。
另外,请注意,攻击载荷不一定来自源代码文件。我看到人们经常误解演示。它可以作为工具调用响应的一部分(如之前的Linear工单所示),或者模型可以决定这样做(例如后门程序)。
问题 #5:通过图像渲染进行数据泄露
类似地,AI也可以通过使用Markdown语法渲染HTML图像来泄露数据。
我能够通过将提示注入演示漏洞植入.c文件,然后让Antigravity解释该文件,快速复现了Windsurf的一个数据泄露示例。
结果是,它调用read_file工具读取开发者的.env文件,并通过加载图像的HTTP请求将秘密泄露给第三方服务器。
我不是唯一指出这一点的人。p1njc70r也报告了这个问题,并从Google得到了类似的回应。
视频演练
这是一个演练所有场景和演示的视频:
希望它具有教育意义和实用性。
建议和缓解措施
有几个建议可以帮助缓解当前情况。
- 启用MCP服务器时要小心,并禁用危险的工具。
- 对于Antigravity团队来说,默认添加“人在环路”控制似乎是MCP服务器的最佳解决方案,并且对于破坏性或后果严重的工具要求使用它。
- 构建CI/CD工具以编程方式发现隐藏的Unicode标签可能会有所帮助。即使仔细地手动审查代码以查找恶意指令,也无助于缓解利用隐藏Unicode标签的提示注入攻击。
- 在这些问题得到解决之前,开发者应考虑使用替代IDE。
- 禁用“自动执行”(默认设置)并使用手动批准,并仔细地仅通过“允许列表终端命令”启用你愿意委托给AI的命令。
- 如果你的组织广泛使用此IDE,进行红队或紫队演习以识别检测和监控机会可能是个好主意。
- 准备好点击停止按钮!哈哈。
- 高度思考和计划模式对对抗性错位(例如提示注入)更具弹性——但它不是万能的!
让我们看看Antigravity在未来几周将如何发展。从技术上讲,这些是相对简单的错误修复,以提供开箱即用的安全体验,看看这些是否是优先事项将会很有趣。
结论
在这篇文章中,我们重新审视了之前在Windsurf和8月份的“AI漏洞月”中讨论的常见漏洞。不幸的是,Google最新的Antigravity IDE与Windsurf一样容易受到许多相同问题的影响,而披露可以追溯到2025年5月。
总的来说,编码助手是改变游戏规则的技术,但我们也必须认真对待安全。目前还有其他更成熟、具有更好安全性和补丁历史的编码助手,包括Claude Code、GitHub Copilot、Cursor、Codex、Google自己的Gemini CLI……其中一些也已经支持Gemini 3。
请关注Antigravity的CVE。
注意安全。
参考文献
- Google支付24亿美元非独占许可
- p1njc70r在X上
- ASCII Smuggler
- 2025年8月AI漏洞月
- Antigravity已知问题
- Google Jules易受不可见提示注入攻击
附录
Google记录了已知问题并声明团队正在修复: