👍
TCS: 尾随调用序列
定向差分模糊测试
SecretPatch数据集
经过大规模研究之后发现,大部分补丁都会检查输入有效性,如果输入无效则退出。针对同一个PoC在修补之后的程序当中和未修补的程序当中在修补位置会产生不同的执行跟踪。简单来说就是执行同一个PoC在执行最后的N个函数中执行跟踪是不同的。即TCS[尾随调用序列]不同
定位补丁位置的方法: 构建修补之后和未修补二进制程序的调用图并对齐其中的函数,通过静态分析找到具有不同被调用函数的序列的对齐函数,这些对齐的函数将标记为修补函数
针对补丁生成PoC的方法: 采用定向模糊测试方案生成PoC,针对修补过后和修补之前的二进制程序进行差异测试,跟踪测试期间两个二进制程序调用的函数序列,并在最后N个函数不同时确定PoC。
TCS的理论基础是大部分的补丁修补都如图所示,是针对之前版本的漏洞增加校验,如果校验不通过则退出。这表明,如果为修补前和修补后的二进制程序提供同一个PoC,那么在二进制程序中在补丁之后将会有不同的执行流,即使不知道补丁位置,但是通过执行流仍然可以观察到修补前和修补后的二进制程序在函数调用序列的尾部存在分叉。
作者给出定义: TCS,尾随调用序列。在给定程序P和输入I,在程序P退出前的最后N个函数调用表示为TCS(P, I, N)
作者通过针对从1999到2018年中所有关于C/C++的漏洞补丁进行统计,确定在此期间的漏洞补丁有71.3%都具有TCS特征。由此验证了TCS合理性。
首先,针对修补前和修补后的二进制程序首先将其从CFG层面将其对齐,然后通过比较函数调用图来定位补丁位置,最后使用定向差分模糊测试来探索补丁位置,并且使用基于TCS的sanitizer来捕获PoC。
首先,反汇编二进制程序并识别所有的函数和直接调用,然后根据直接调用关系静态构建函数调用图。其次,利用动态执行收集间接调用关系,在动态执行中对于每个间接调用都在函数调用图上增加一条从调用者到被调用者的边。
针对同一个PoC在常理上除了修补相关的函数,调用的大部分函数都是相似的。也就是说在跟踪中两个执行流具有高度相似的函数序列,可以用于对齐两个调用图中的子图。如此可以依赖跟踪来逐渐对齐两个二进制程序中的函数。
针对在未修补二进制的函数调用图中未匹配到的函数和在修补后的二进制函数调用图中未匹配到函数 对其计算相似度
其中表示在修补前函数调用图中使用特定寻址方式的参数数量,表示在修补后函数调用图中使用特定寻址方式的参数数量
通过深度优先算法通用遍历对齐之后的每个函数对的CFG中的所有路径,并且收集每个路径上的被调用函数序列,比较这两组调用函数序列检查是否不同,如果一个调用序列中存在另外一个中不存在的函数调用,则将对其的函数标记为候选Patch函数。
主要架构如图所示,为了同时测试修补前和修补后的二进制程序并检查其TCS,使用相同的输入和相同的运行环境测试两个二进制程序。为了效率其并不会记录所有被调用函数的列表,只会记录最后调用的N个函数。其将驻留在Fuzzer中而不是Binary中,其会在测试用例结束之后比较函数列表缓冲区,如果不同则抛出异常。
本文作者:Du4t
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!