这篇论文介绍了一个名为 codebadger 的新工具,它就像是一位给大型语言模型(LLM,比如现在的 AI 助手)配发的“超级侦探眼镜”和“专业工具箱”。
为了让你更容易理解,我们可以把分析复杂的代码库想象成在一座巨大的、迷宫般的图书馆里寻找一本特定的书,或者找出图书馆里所有的安全隐患。
1. 以前的困境:AI 的“失忆”和“近视”
在 codebadger 出现之前,让 AI 去分析像 Linux 内核或大型软件这样包含成千上万个文件的代码库,面临三个大问题:
- 记不住(Token 限制): 想象 AI 的脑子(上下文窗口)就像一个只能装下一杯水的杯子。而整个代码库是一座巨大的海洋。AI 没法把整片海洋的水都倒进杯子里,它只能喝一口(只看几个文件)。结果就是,它错过了那些藏在海洋深处的漏洞(比如一个函数在 A 文件里出错,导致 B 文件里的程序崩溃)。
- 看不懂(缺乏语义): 传统的 AI 找代码就像用“关键词搜索”。如果你找“苹果”,它可能给你一堆水果店的图片,却找不到“苹果公司”的代码。它看不懂代码之间的逻辑关系(比如:这个变量是从哪里来的?它经过了哪些函数?)。
- 不会问(不会写查询语言): 专业的代码分析工具(叫 CPG)需要一种像“天书”一样的专业语言(CPGQL)来提问。让 AI 直接写这种语言,就像让一个刚学中文的外国人去写复杂的法律条文,它经常会胡编乱造(幻觉),问不出正确的问题。
2. 解决方案:codebadger 来了!
codebadger 就像一个聪明的图书管理员助手,它站在 AI 和巨大的代码图书馆之间。
- 它不是让 AI 去读所有的书: 当 AI 想知道“哪里可能不安全”时,它不需要把 8000 个文件全读一遍。
- 它提供“魔法工具”: codebadger 把复杂的代码分析变成了几个简单的按钮(工具)。AI 只需要说:“帮我看看这个变量是从哪里流过来的?”或者“帮我找出所有可能溢出内存的地方”。
- 背后的魔法(Joern CPG): 在后台,codebadger 连接了一个叫 Joern 的超级引擎。这个引擎已经把整个图书馆的地图(代码属性图 CPG)画好了,标出了所有的路、所有的房间和所有的连接。AI 不需要自己画地图,它只需要告诉管理员助手:“我想去那个房间”,助手就会直接带它过去,或者把那个房间的关键信息递给它。
3. 这个工具有多厉害?(三个真实案例)
论文里讲了三个故事,展示了 codebadger 如何帮助 AI 像人类专家一样工作:
案例一:在 8000 个函数的迷宫里找路(代码理解)
- 任务: 检查一个巨大的数学库(GGML)有没有内存安全问题。
- 以前: AI 会晕头转向,或者因为读不完而放弃。
- 现在: AI 使用 codebadger 的“地图导航”功能。它先问:“整个库有多大?”(得到概览),然后问:“哪里在分配内存?”(定位源头),再问:“这些数据流到了哪里?”(追踪路径)。
- 结果: AI 成功找到了几个隐蔽的漏洞,比如“整数溢出”(算错了数字导致内存不够用),就像侦探在迷宫里精准地找到了藏宝图上的陷阱。
案例二:发现了一个从未被报道的“炸弹”(漏洞发现)
- 任务: 检查一个处理图片的库(libtiff)。
- 过程: AI 发现了一个奇怪的地方:图片的偏移量(col_offset)没有经过检查就被用来计算内存位置。
- 推理: AI 利用工具追踪数据流,发现如果黑客输入一个巨大的数字,程序就会在内存中“越界”,导致崩溃或被控制。
- 结果: AI 不仅发现了这个漏洞,还现场写出了一个“炸弹”(攻击代码),并成功让程序崩溃(被 ASAN 工具证实)。更厉害的是,这个漏洞之前没人发现过!后来官方修复了它,证明 AI 找得准。
案例三:第一次就修好了一个著名的漏洞(漏洞修复)
- 任务: 修复一个著名的 XML 库(libxml2)中的整数溢出漏洞(CVE-2025-6021)。
- 过程: AI 不需要阅读所有代码。它使用“切片”工具(就像切蛋糕一样,只切下和漏洞相关的那一小块),精准地定位到问题出在两个数字相加时可能溢出。
- 结果: AI 第一次尝试就写出了完美的修复补丁。这个补丁和官方维护者后来发布的修复方案几乎一模一样。这证明了 AI 不仅能“找茬”,还能“修好”。
4. 总结:这意味着什么?
codebadger 的核心思想是:不要试图让 AI 变成全知全能的超人,而是给它配上专业的工具。
- 以前: 让 AI 硬啃代码,它要么记不住,要么看不懂。
- 现在: AI 像一个经验丰富的侦探,它手里拿着 codebadger 提供的“放大镜”、“追踪器”和“地图”。它不需要读遍全书,只需要在关键的地方使用工具,就能理解整个系统的运作,发现深藏的安全隐患,并给出修复方案。
这项技术让 AI 在网络安全领域变得真正实用,能够处理现实世界中那些庞大、复杂且充满陷阱的代码库,而不再局限于简单的代码片段。
论文标题
Bridging Code Property Graphs and Language Models for Program Analysis
( bridging 代码属性图与语言模型用于程序分析)
1. 研究背景与核心问题 (Problem)
尽管大语言模型(LLM)在软件漏洞管理(如检测、修补)方面展现出潜力,但在处理真实世界的大型代码库时面临三大关键挑战:
- Token 限制与上下文窗口不足:现代代码库包含数百万行代码和数千个文件。将整个仓库加载到 LLM 的上下文中会超出 Token 限制,导致现有方法只能分析孤立的代码片段,从而遗漏跨函数、跨文件的漏洞。
- 代码嵌入缺乏语义深度:基于检索增强生成(RAG)的方法通过相似度搜索检索代码片段,但代码嵌入(Embeddings)主要捕捉语法模式,无法有效表示过程间的数据流(例如:函数 A 的返回值如何流入函数 B 的缓冲区写入)或控制依赖关系。
- 生成复杂静态分析查询的困难:虽然 CPG(如 Joern 引擎)支持强大的查询语言(CPGQL),但 LLM 由于训练语料中缺乏此类领域特定语言,难以生成正确的复杂查询。这导致 LLM 在尝试多跳遍历时常产生幻觉或语法错误的查询,使得直接生成查询不可靠。
核心痛点:现有的 LLM 方法要么因上下文限制而视野狭窄,要么因无法理解跨模块的语义关系而失效,无法像人类安全分析师那样进行全库范围的语义推理。
2. 方法论与系统架构 (Methodology)
为了解决上述问题,作者提出了 codebadger,一个开源的模型上下文协议(Model Context Protocol, MCP)服务器。该系统作为 LLM 与 Joern 静态分析引擎之间的中间件,核心设计理念是“提供分析工具而非要求生成查询”。
2.1 核心架构
- MCP 集成:codebadger 作为一个 MCP 服务器运行,允许 LLM Agent 通过标准接口调用外部工具。
- Joern CPG 引擎:后端利用 Joern 将源代码解析为代码属性图(CPG),该图融合了抽象语法树(AST)、控制流图(CFG)和程序依赖图(PDG)。
- 工具抽象层:codebadger 不直接暴露 CPGQL 查询语言,而是将复杂的图遍历算法封装为高级语义工具。LLM 只需调用这些工具,无需理解底层图结构或查询语法。
2.2 关键工具功能
系统提供了一系列针对安全分析的工具,包括:
- 程序切片 (Program Slicing):使用后向切片算法,从特定的可疑调用点出发,逆向收集所有相关的数据和控制依赖,将代码库缩小 90% 以上,仅保留漏洞相关的代码片段。
- 污点追踪 (Taint Tracking):识别污点源(如用户输入)和污点汇(如危险函数),并追踪数据在过程间的传播路径。
- 数据流分析 (Data Flow Analysis):追踪变量的定义和使用关系,识别未经验证的数据流。
- 调用图提取 (Call Graph Extraction):构建方法调用关系图,支持跨模块分析。
- 边界检查 (Bounds Checking):自动验证数组或缓冲区访问是否越界。
2.3 工作流程
- LLM Agent 调用
create_cpg_session 初始化代码库的 CPG。
- Agent 根据分析目标调用特定工具(如
find_taint_sources 定位输入点,find_taint_flows 追踪数据流)。
- codebadger 在后台将高级指令转换为 CPGQL 查询,执行分析,并将结构化的结果(如 JSON 格式的数据流、精简的代码片段)返回给 LLM。
- LLM 基于这些语义信息进行推理、漏洞判断或生成补丁。
3. 主要贡献 (Key Contributions)
- 提出了 codebadger 框架:首个将 CPG 引擎与 LLM 通过 MCP 协议深度集成的开源工具,实现了从“暴力读取代码”到“语义导航代码”的范式转变。
- 解决了 LLM 的查询生成难题:通过预实现的工具抽象,消除了 LLM 学习 CPGQL 语法的负担,使其能专注于逻辑推理。
- 实现了跨过程(Inter-procedural)的漏洞分析:证明了 LLM 结合 CPG 工具可以追踪跨越多个文件和函数的复杂数据流,这是传统 RAG 方法无法做到的。
4. 实验结果与案例研究 (Results)
作者通过三个实际案例验证了 codebadger 的有效性(使用 Claude Sonnet 4.5 作为 LLM 代理):
案例 1:大规模代码库理解与审计 (GGML)
- 任务:审计包含 8,667 个方法、19.8 万次函数调用的 GGML 库的内存安全模式。
- 过程:Agent 未读取所有文件,而是通过工具定位了 54 个分配点和 300+ 个危险操作,并追踪了特定的数据流。
- 发现:识别出未加边界的
alloca 使用、整数溢出导致的分配大小计算错误,以及未检查的指针算术问题。
- 意义:证明了系统能在 Token 限制内处理超大规模代码库。
案例 2:发现未报告的漏洞 (libtiff)
- 任务:分析
libtiff 中的 tif_getimage.c 文件。
- 过程:Agent 通过污点追踪发现
col_offset 变量从结构体传递到 gtStripContig 函数时,经过指针算术运算后未进行边界检查。
- 成果:
- 发现了一个未报告的缓冲区溢出漏洞。
- 生成了基于 AddressSanitizer (ASAN) 验证的 PoC 利用代码(构造恶意 TIFF 文件触发堆溢出)。
- 确认该漏洞在修复前未被公开(无 CVE 编号),且修复补丁(增加边界检查)与后续维护者的修复高度一致。
案例 3:漏洞修补 (libxml2, CVE-2025-6021)
- 任务:针对
libxml2 中 xmlBuildQName 函数的整数溢出漏洞(导致缓冲区溢出)生成补丁。
- 过程:Agent 利用
get_program_slice 和 get_data_dependencies 追踪 lenn 和 lenp 变量的来源,识别出 strlen 结果相加可能导致整数溢出,进而导致分配过小的缓冲区。
- 成果:
- 首次尝试即生成了正确的补丁,无需人工干预。
- 生成的补丁逻辑(使用
size_t、添加溢出检查)与维护者实际发布的修复方案高度相似。
- 证明了 LLM 结合静态分析工具具备专家级的漏洞修复能力。
5. 意义与影响 (Significance)
- 范式转变:将 LLM 在安全分析中的角色从“代码阅读器”转变为“分析工具调用者”,解决了上下文窗口和语义理解的瓶颈。
- 自动化安全运营:codebadger 使得 LLM Agent 能够像人类安全专家一样,在大型代码库中进行导航、切片和依赖追踪,支持从漏洞发现、利用验证到自动修补的全流程自动化。
- 开源生态:作为一个开源 MCP 服务器,它降低了将静态分析集成到 AI 工作流中的门槛,促进了 AI 驱动的软件漏洞管理(SVM)的发展。
6. 局限性与未来工作
- 资源开销:Joern 生成 CPG 对超大型仓库(如 Linux 内核)需要大量内存。
- 查询依赖:尽管有高级工具,LLM 偶尔仍需直接调用 CPGQL,此时仍可能出错。
- 动态漏洞:目前主要处理静态分析,对竞态条件等运行时漏洞支持有限。
- 评估:未来需要更大规模的定量基准测试来评估其通用性。
总结:该论文展示了通过codebadger将静态分析引擎(Joern/CPG)的精确性与 LLM 的推理能力相结合,是解决大规模代码库安全分析难题的有效途径,显著提升了 LLM 在漏洞发现、利用生成和自动修补方面的实际能力。
每周获取最佳 computer science 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。