让 LLM 先猜开发者的假设再找矛盾,Creed 在 50 个新 CVE 上召回率达 78%

LLM-based Code Auditing by Inferring and Evaluating Developer Assumptions

Junming Liu, Marcel Böhme

cs.CR, cs.SE

2026-10-12

Creed 让 LLM 推断函数里开发者的隐含假设,再判断其是否合理、何时被打破;在 50 个新 CVE 上召回 0.78,高于最强基线 10 个百分点。

这篇在解决什么

传统静态分析找 bug,靠的是把「模式」写死:比如某个指针被判空过,后面又不判空就解引用,算违反了开发者的信念。这类方法只适用于能用语法模式表达的缺陷。现实里很多漏洞要靠领域语义才看得出来:认证函数对「用户不存在」和「密码错误」返回同一个错误码,本意是防用户枚举,但多出来的一次哈希计算会让两种失败的响应时间不同,留下计时侧信道。这种洞,PDG(程序依赖图)上找不到通用模式。

论文在 CVEfixes 里随机看了 50 个近期漏洞,发现 40 个是语义类,其中 21 个无法表达成通用静态分析模式。另一个老问题是评测:把函数级漏洞检测当二分类,已有工作指出并不成立,因为函数是否有漏洞常取决于调用者的上下文。

方法

Creed 把一位人类审计员的流程塞进一条 prompt,由 LLM 一次调用走完三步。

因为分析只在函数级进行,报告里的漏洞只叫「潜在」漏洞,上游代码可能已经缓解。把条件显式写出来,就是为了让人去核对。

评测上,论文提出两个指标。recall:至少有一条 finding 的解释与 CVE 描述、修复 commit 信息和补丁一致的漏洞占比。overhead:为确认一个预期漏洞,平均要读多少条 finding。匹配由 GPT-5.4 当 judge 判定,所有被判匹配的结果又人工复核。

结果

基准是 2025 年 9 月到 2026 年 3 月披露的 50 个 CVE 函数,覆盖 45 个项目、10 种语言、10 种漏洞类型。所有方法统一用 Claude Sonnet 4.6。

方法匹配数RecallOverhead每函数 token
RepoAudit10.028.054.6k
VulTrial210.423.317.3k
PrimeVul-CoTexp270.545.22.7k
LLM-Thinking340.6811.33.9k
Creed390.787.98.5k

为什么重要

对做代码审计或安全 LLM 工具的人,有用的是思路:不要只让模型「找漏洞」,而是让它先写出代码背后的假设,再逐条质疑。同一个 backbone 下,这个结构比普通 CoT 和 thinking 模式多找出 5 个到 18 个漏洞(对 LLM-Thinking 多 5 个),单次调用的成本只有约 8.5k token。

评测上,「解释 + recall + overhead」的做法也可借用,它绕开了函数级二分类的上下文依赖问题。

不过收益是渐进的:对最强基线是 10 个百分点,代价是 overhead 比 VulTrial 高。

局限与存疑

术语

原文与代码

社区讨论

相关论文

全部论文解读