跳到主要内容
返回时间线
arXiv来源发表:

补丁不再只看崩溃是否消失:拿原漏洞程序当参照,功能偏离召回率从6%升到64%

核心概要

自动生成的安全补丁即使消除了崩溃、通过了现有测试,也可能悄悄改掉程序原有功能。DeepDiff 把原始漏洞程序当作行为参照,在不会触发崩溃的输入上比较补丁前后的可观察行为,把差异输入作为具体证据。在来自 CyberGym 的 385 个候选补丁上,这种回归自由性检查把功能偏离补丁的召回率从非差分执行的 6% 提高到 64%,代价是 18% 的开发者补丁被标记为偏离。

Source-provided article image: DeepDiff: Neuro-Dynamic Regression-Freedom Checking for Security Patch Validation
arXiv

深度剖析

安全补丁的验证标准多了一条:除了让触发输入不再崩溃,补丁还要在原本不崩溃的输入上保持原程序的行为。 此前的验证主要看漏洞是否还能被触发,功能正确性则依赖开发者编写的测试,而这些测试未必覆盖补丁改动的代码。 在 385 个候选补丁上,只执行不比较的非差分方法识别出 6% 的功能偏离补丁,回归自由性检查识别出 64%,召回率提高 58 个百分点。

检查的做法是让原始漏洞程序和打好补丁的程序跑同一批不触发崩溃的输入,再比较两者留下的可观察行为。 动态分析记录并归一化写操作轨迹,神经分析则由智能体阅读补丁及周边代码,给出候选的偏离输入与路径对,无需执行程序。 评估语料包含 118 个漏洞、40 个开源项目的 385 个候选补丁,其中 251 个是语义变异得到的错误补丁,134 个是开发者补丁或与其语义等价的补丁。

纯神经的 Neuro-DeepDiff 不执行程序也能给出候选偏离证据,其生成的输入大多确实不触发原漏洞。 动态分析需要搭建并维护执行环境,神经分析可以绕过这一环节,但输出只是待验证的假设。 Neuro-DeepDiff 共生成 3039 个候选见证,其中 3037 个被转换为输入,2898 个满足不触发漏洞的条件,占转换输入的 95%;动态执行在其中 1876 个上确认了行为偏离,约占 65%。

启示与展望

评估语料取自 CyberGym-E2E,限于 OSS-Fuzz 插桩、以 sanitizer 崩溃为判据的 C/C++ 项目,漏洞类型为越界访问、未初始化内存、堆栈溢出和整数溢出等内存安全问题。

检查是单侧的:找到见证输入即可断定功能偏离,而“合理”只相对于实际检查过的有限输入集合成立。开发者有时会有意改变非触发输入上的行为,这类补丁同样会被标记为功能偏离,需要开发者结合见证输入判断是否为有意改动。