编辑
2024-01-17
Paper
00
请注意,本文编写于 377 天前,最后修改于 377 天前,其中某些信息可能已经过时。

目录

1dFuzz: Reproduce 1-Day Vulnerabilities with Directed Differential Fuzzing
作者
复现1Day的困难
作者提出的方法
TCS: 尾随调用序列
TCS合理性验证
架构设计
二进制代码对齐
对齐流程
1dLoc - 补丁定位工具
1dSan - 定向模糊测试辅助工具
定向差分模糊测试

👍

1dFuzz: Reproduce 1-Day Vulnerabilities with Directed Differential Fuzzing

TCS: 尾随调用序列

定向差分模糊测试

SecretPatch数据集

作者

复现1Day的困难

  • 如何识别未开源的补丁位置?
    • 现有方案: 根据控制流图比较来定位补丁位置[静态] 根据程序执行轨迹来定位补丁位置[动态] 依靠深度学习提取二进制代码特征[机器学习]
      • 现有方案的缺点: 编译优化会导致二进制文件之间存在差异会影响定位结果、无法区分功能更新和漏洞补丁
  • 如何针对补丁生成PoC?
    • 现有方案: 符号执行、定向模糊测试
      • 现有方案缺点: 符号执行无法应用于大型项目中、定向模糊测试很难确定在模糊测试中是否触发漏洞

作者提出的方法

经过大规模研究之后发现,大部分补丁都会检查输入有效性,如果输入无效则退出。针对同一个PoC在修补之后的程序当中和未修补的程序当中在修补位置会产生不同的执行跟踪。简单来说就是执行同一个PoC在执行最后的N个函数中执行跟踪是不同的。即TCS[尾随调用序列]不同

  • 定位补丁位置的方法: 构建修补之后和未修补二进制程序的调用图并对齐其中的函数,通过静态分析找到具有不同被调用函数的序列的对齐函数,这些对齐的函数将标记为修补函数

  • 针对补丁生成PoC的方法: 采用定向模糊测试方案生成PoC,针对修补过后和修补之前的二进制程序进行差异测试,跟踪测试期间两个二进制程序调用的函数序列,并在最后N个函数不同时确定PoC。

TCS: 尾随调用序列

TCS的理论基础是大部分的补丁修补都如图所示,是针对之前版本的漏洞增加校验,如果校验不通过则退出。这表明,如果为修补前和修补后的二进制程序提供同一个PoC,那么在二进制程序中在补丁之后将会有不同的执行流,即使不知道补丁位置,但是通过执行流仍然可以观察到修补前和修补后的二进制程序在函数调用序列的尾部存在分叉。

作者给出定义: TCS,尾随调用序列。在给定程序P和输入I,在程序P退出前的最后N个函数调用表示为TCS(P, I, N)

TCS合理性验证

作者通过针对从1999到2018年中所有关于C/C++的漏洞补丁进行统计,确定在此期间的漏洞补丁有71.3%都具有TCS特征。由此验证了TCS合理性。

架构设计

首先,针对修补前和修补后的二进制程序首先将其从CFG层面将其对齐,然后通过比较函数调用图来定位补丁位置,最后使用定向差分模糊测试来探索补丁位置,并且使用基于TCS的sanitizer来捕获PoC。

二进制代码对齐

首先,反汇编二进制程序并识别所有的函数和直接调用,然后根据直接调用关系静态构建函数调用图。其次,利用动态执行收集间接调用关系,在动态执行中对于每个间接调用都在函数调用图上增加一条从调用者到被调用者的边。

针对同一个PoC在常理上除了修补相关的函数,调用的大部分函数都是相似的。也就是说在跟踪中两个执行流具有高度相似的函数序列,可以用于对齐两个调用图中的子图。如此可以依赖跟踪来逐渐对齐两个二进制程序中的函数。

对齐流程

针对在未修补二进制的函数调用图中未匹配到的函数ff和在修补后的二进制函数调用图中未匹配到函数ff' 对其计算相似度

  1. 出入度相似度: 当两个函数在调用图中存在相似的出入度时,其更有可能匹配 score=min(If,If)max(If,If)+min(Of,Of)max(Of,Of)score=\frac{min(I_f,I_{f'})}{max(I_f,I_{f'})}+\frac{min(O_f,O_{f'})}{max(O_f,O_{f'})}
  2. 函数参数寻址方式相似度: 调用函数有许多种传参方式,1dFuzz记录了各种调用函数时参数的寻址类型

score=min(MCaddr,MCaddr)min(MCaddr+MCaddr)/2score=\frac{\sum min(MC_{addr},MC'_{addr})}{\sum min(MC_{addr}+MC'_{addr})/2} 其中MCaddrMC_{addr}表示在修补前函数调用图中使用特定寻址方式的参数数量,MCaddrMC'_{addr}表示在修补后函数调用图中使用特定寻址方式的参数数量

  1. Caller相似度: 如果未修补函数调用图中函数ff有Callerfpf_p,修补之后的函数调用图中函数ff'有Callerfpf'_p,且fpf_pfpf'_p在匹配集中,则为函数对(fp,fp)(f_p,f'_p)加一分
  2. 针对所有函数进行迭代计算相似度,每轮都会更新分数。如果上轮中函数对(fp,fp)(f_p,f'_p)匹配则本轮中为该函数对加0.5分

1dLoc - 补丁定位工具

通过深度优先算法通用遍历对齐之后的每个函数对的CFG中的所有路径,并且收集每个路径上的被调用函数序列,比较这两组调用函数序列检查是否不同,如果一个调用序列中存在另外一个中不存在的函数调用,则将对其的函数标记为候选Patch函数。

1dSan - 定向模糊测试辅助工具

主要架构如图所示,为了同时测试修补前和修补后的二进制程序并检查其TCS,使用相同的输入和相同的运行环境测试两个二进制程序。为了效率其并不会记录所有被调用函数的列表,只会记录最后调用的N个函数。其将驻留在Fuzzer中而不是Binary中,其会在测试用例结束之后比较函数列表缓冲区,如果不同则抛出异常。

定向差分模糊测试

  • 距离算法: 给定源函数和目标函数的情况下,如果源函数有多个调用站点可以调用到目标函数,则认为源函数更容易进入目标函数。换句话来说,这样的调用者和被调用者之间的距离更短,所以针对调用图中的每个边,统计计算Caller函数中有多少个调用站点可以调用Callee并将其个数表示为CNCN,计算其距离为1+12×CN1+\frac{1}{2\times CN}。在计算完函数调用图中每条边的距离之后就可以得到从源函数到目标函数的最短路径距离。

本文作者:Du4t

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!