Google 推出代码安全 AI Agent,可自动识别和修复关键软件漏洞,直接提升代码质量和开发效率。
Raluca Ada Popa、Four Flynn
利用先进 AI 修复关键软件漏洞
今天,我们将分享 CodeMender 的早期研究成果。CodeMender 是一种由 AI 驱动的新型 Agent,能够自动提升代码安全性。
众所周知,软件漏洞非常难以发现和修复。即使借助 fuzzing 等传统自动化方法,开发者仍然需要投入大量时间。我们在 Big Sleep 和 OSS-Fuzz 等 AI 项目上的探索,已经证明 AI 能够在经过充分测试的软件中发现新的零日漏洞。随着 AI 驱动的漏洞发现不断取得突破,仅靠人类将越来越难以跟上其发展速度。
CodeMender 通过一套全面的代码安全方案来帮助解决这个问题:它既能被动响应,即时修补新发现的漏洞;也能主动防御,通过重写并加固现有代码,在此过程中彻底消除某一类漏洞。在构建 CodeMender 的过去六个月里,我们已经向开源项目上游提交了 72 项安全修复,其中一些项目的代码规模高达 450 万行。
CodeMender 的 AI Agent 能够自动创建并应用高质量的安全补丁,帮助开发者和维护者专注于他们最擅长的事情——构建优秀的软件。
CodeMender 利用近期 Gemini Deep Think 模型的思考能力,打造出一个能够自主调试并修复复杂漏洞的 Agent。
为实现这一目标,CodeMender Agent 配备了一套强大的工具,使其能够在修改代码之前对代码进行推理,并自动验证所做的修改,确保其正确且不会引发回归问题。
尽管大语言模型正在快速进步,但代码安全方面的任何错误都可能造成高昂代价。CodeMender 的自动验证流程会从多个维度确保代码修改的正确性,只将高质量的补丁提交给人类审核。例如,这些补丁需要修复问题的根本原因、在功能上保持正确、不引发回归问题,并遵循代码风格规范。
在研究过程中,我们还开发了新的技术和工具,让 CodeMender 能够更有效地理解代码并验证修改,其中包括:
高级程序分析:我们开发了基于高级程序分析的工具,涵盖静态分析、动态分析、差分测试、fuzzing 和 SMT solver。CodeMender 使用这些工具系统性地检查代码模式、控制流和数据流,从而更准确地识别安全缺陷的根本原因和架构弱点。
Multi-agent 系统:我们开发了多种专用 Agent,使 CodeMender 能够分别处理底层问题的不同方面。例如,CodeMender 使用一个基于大语言模型的评审工具,突出显示原始代码与修改后代码之间的差异,以验证拟议修改不会引入回归问题,并在必要时进行自我修正。
为了有效修补漏洞并防止其再次出现,CodeMender 会使用 debugger、源代码浏览器和其他工具来定位根本原因并设计补丁。我们在下方的视频轮播中展示了两个 CodeMender 修补漏洞的示例。
下面这段内容展示了 Agent 在分析 debugger 输出和代码搜索工具的结果后,如何推理 CodeMender 所生成补丁对应的漏洞根本原因。
虽然这个示例中的最终补丁只修改了几行代码,但漏洞的根本原因并不明显。在这个案例中,崩溃报告显示的是堆缓冲区溢出,但真正的问题出在其他地方——解析过程中对 Extensible Markup Language(XML)元素进行了错误的栈管理。
在这个示例中,CodeMender Agent 成功设计出一个非简单补丁,解决了复杂的对象生命周期问题。
Agent 不仅找出了漏洞的根本原因,还修改了项目中一套完全定制的 C 代码生成系统。
我们还将 CodeMender 设计为能够主动重写现有代码,改用更安全的数据结构和 API。
例如,我们部署 CodeMender,为广泛使用的图像压缩库 libwebp 中的部分代码添加 -fbounds-safety 注解。应用 -fbounds-safety 注解后,编译器会在代码中加入边界检查,防止攻击者利用缓冲区溢出或下溢执行任意代码。
几年前,威胁攻击者曾利用 libwebp 中的一个堆缓冲区溢出漏洞(CVE-2023-4863),实施 iOS 零点击攻击。如果使用了 -fbounds-safety 注解,这个漏洞以及项目中大多数已添加注解区域内的其他缓冲区溢出漏洞,都将永久失去被利用的可能。
在下方的视频轮播中,我们展示了 Agent 的决策过程,其中也包括验证步骤。
在这个示例中,CodeMender Agent 被要求解决 bit_depths 指针上的以下 -fbounds-safety 错误:
CodeMender 的另一项关键能力,是自动修正由其自身添加的注解所引发的新错误和测试失败。下面是一个 Agent 从编译错误中恢复的示例。
在这个示例中,CodeMender Agent 修改了一个函数,随后使用已配置为检查功能等价性的 LLM judge 工具,验证功能是否仍然保持不变。当工具检测到失败时,Agent 会根据 LLM judge 的反馈进行自我修正。
尽管 CodeMender 的早期成果令人鼓舞,但我们仍采取谨慎的推进方式,将可靠性放在首位。目前,CodeMender 生成的所有补丁在提交至上游之前,都会由人类研究人员审核。
借助 CodeMender,我们已经开始向多个关键开源库提交补丁,其中许多补丁已经被接受并合入上游。我们正在逐步扩大这一流程,以确保质量,并系统性地处理来自开源社区的反馈。
我们还将逐步联系那些对此感兴趣的关键开源项目维护者,向他们提供 CodeMender 生成的补丁。通过持续吸收这一过程中的反馈并不断迭代,我们希望最终将 CodeMender 发布为所有软件开发者都能使用的工具,帮助他们保障代码库的安全。
未来几个月,我们还将分享多项技术和研究成果,并计划以技术论文和报告的形式发布。借助 CodeMender,我们才刚刚开始探索 AI 在提升所有人所用软件的安全性方面所蕴含的巨大潜力。
Alex Rebert、Arman Hasanzadeh、Carlo Lemos、Charles Sutton、Dongge Liu、Gogul Balakrishnan、Hiep Chu、James Zern、Koushik Sen、Lihao Liang、Max Shavrick、Oliver Chang 和 Petros Maniatis。