面向二进制程序的漏洞挖掘关键技术研究分析
······王铁磊大佬的论文分析
国内在软件安全漏洞挖掘方向比较活跃的机构包括中国信息安全测评中心、中国人民解放军总参谋部、北京大学、中国科学院软件所、北京邮电大学、解放军信息工程大学、国防科学技术大学、北京理工大学、哈尔滨工业大学、武汉大学等机构和院校。这些单位在漏洞挖掘和管理等方面取得了一定的成绩,但在零日漏洞发现的数量、国际顶级会议论文数、漏洞库的有效利用、漏洞响应管理等方面与美国相比还有较大距离。
论文关注的研究现状
总体图,接下来分类介绍
被动发现
1.蜜罐
一种安全资源,防被扫描、攻击和攻陷。。
捕获攻击,针对漏洞攻击逆向分析。
2.基于补丁的漏洞发现技术
比对二进制文件,定位补丁修复点
主动挖掘技术
1.手工漏洞发现技术
2.静态漏洞发现技术
数据流挖掘技术:解决空指针解引用、内存多次释放的问题。斯坦福大学的MC系统,和其孵化出的代码静态扫描软件Coverity已被应用。同样可用于处理格式化字符串漏洞,但CQual好像有局限性。
自动机可描述漏洞模式,结合软件模型理论遍历代码空间,检测疑似安全漏洞,如UNO,MOPS,SLAM。此处有两图的文字介绍
时序安全漏洞(TemporalVulnerability)是–种典型的可以用自动机刻画的漏洞类型。程序执行过程中很多操作(例如API调用)应该满足严格的时序关系:一旦执行过程中这种时序关系被破坏,就对应一个潜在安全问题。MOPS用下推自动机(Pushdown Automata)PDA表示程序控制流图,用有限状态自动机FSA刻画安全漏洞。下推自动机本质上是一个带有堆栈数据结构的有穷自动机。下推自动机的这种特性很容易用于表示函数间的调用关系。判断程序是否违反安全属性的问题转换为判断两个自动机求交是否为空的问题,MOPS系统能够做到检测结果无漏报(完备性),但是MOPS是数据流不敏感的分析,无法跟踪数据依赖关系,导致MOPS误报率很高。
与MOPS系统类似,SLAM是一种基于谓词抽象技术的软件模型检验器,主要用于检测Windows操作系统驱动程序是否满足用户定义的属性;约束。SLAM的核心技术是谓词抽象,将每个变量都抽象为只有0/1两种取值。这种过近似(Over-Approximations)抽象方法导致SLAM误报较为严重。所以微软将SLAM集成到Windows驱动开发平台中,在驱动开发阶段生成编译警告,辅助开发人员发现安全隐患。
复杂数据约束关系模式:抽象解释理论->符号执行技术(开放性难题)
3.动态漏洞挖掘技术
事件空间遍历:CMC通过枚举不同事件(收到报文、通信超时、内存分配失败)。同样FiSC应对文件系统,从空磁盘开始,每个状态枚举所有可能的操作(文件创建删除、磁盘镜像挂载卸载,及各种格式)
输入空间遍历:处理海量数据(fuzz)
程序执行路径遍历:样本生成。混合符号执行和细粒度污点分析。
本文的主要工作
提出绕过校验和防护机制的方法。
提出了roBDD离线细粒度污点分析技术,降低了细粒度污点分析内存需求
提出了基于细粒度污点分析的导向性样本生成方法。以及基于混合符号执行的智能样本生成方法。
提出了一种整数溢出漏洞模型,并配套设计了二进制程序的脆弱性构件识别方法,结合基于惰性检测的挖掘方法,有效缓解路径爆炸。
roBDD离线细粒度污点分析技术
TaintReplayer,基于二进制植入平台Pin实现
BDD 二元决策树,除终点外出度均为2
详情见roBDD那篇论文的分析
二进制程序的混合符号执行技术
污点分析只记录了传播,没记录关系。如果在某处,某变量被重新赋值为常数,那么应当去掉其关系。
符号执行的问题:
1.符号执行需要符号计算系统的支撑,硬件要求高,没有好办法,制约了其发展
2. 无法处理循环或递归,如果边界条件中有符号变量,很难确定其次数
3.没有源代码难以处理系统API的调用问题
4. 符号在处理矢量数据单元(数组)时面临挑战
Prefix/Prefast已经成为微软内部标准源代码静态检测工具之一。源码->AST->拓扑排序->为每个过程生成相应模型,最后静态模拟执行路径并用约束求解进行检验。这是一种过程间的符号执行,有效检测指针变量使用的相关漏洞。路径结束时检测路径上是否存在资源泄露,合并路径结果,建立摘要,再打开的时候就可以直接应用,加速模拟。
混合符号执行:运行时判断哪些代码需要经过符号执行,这样一来符号执行被充分利用了程序的运行时信息,提高了分析准确性。
代码植入是混合符号执行的重要支撑
有源码符号执行
EXE和DART都是基于源码植入平台CIL实现,KLEE是基于LLVM实现的。
存在过度依赖源码、针对单一语言、运行平台,无法评估第三方模块的问题。
面向二进制程序的符号执行
在线符号执行、离线符号执行
面向底层指令和面向中间代码的符号执行。
在线符号执行基于二进制代码植入技术,这很容易导致破坏原逻辑,尤其是代码混淆过的或者并发、多线程的情况。
离线符号执行指先计算程序执行轨迹,再在轨迹重放时进行符号计算。
中间代码的符号执行:SymReplayer。基于中间语言VEX
校验和感知模糊测试
现有模糊测试中的约束规范生成系统:SPIKE,PEACH,Protos。
校验和检测点特征分析
对于一般的检测形式,H(D)==T(C)
ffdds
-
大量真实程序分析得到,程序需要做big-endian到little-endian的转换。
- 高依赖度。D关于全体,C关于几个字节
- 行为差异性:随机生成的总为False,标准样本总为True
- 无负效应性,C用完之后就没用了
所以具体来说,方式为:找到正常样本中高污点依赖分支,找到畸形样本中高污点依赖分支,定位程序差异点,识别校验和域。类似于Tupni的校验和域识别方法
关于特例:有可能样本是分多个块的,然后每个快单独计算校验和;也有一个检测会需要多个分支点的情况,如MD5在32位体系需要4个int进行检验,
本文的解决办法:TaintScope会特别跟踪被修改的字节,只有一个分支语句即满足高污点依赖,又受修改字节影响时,才记录该分支;使用Bestar来查找复合分支结构,如果其中一个分支点被定义为检查点,则进一步检查该复合分支中的其他谓词。
一般,3-5个正常样本和10几个畸形样本足够定位校验检查点
校验和自动修复技术
校验和感知的模糊测试技术主要由三部分构成。首先,TaintScope在细颗粒度污点分析的基础上,识别程序执行过程中的高污点依赖度分支点,并进一步定位目标程序处理正常样本和急性样本时的路径执行差异点,准确识别校验和检测点;接下来,TaintScope在校验和检测点修改目标程序,禁止目标程序检测输入数据的完整性。TaintScope生成大量畸形数据,对修改后的目标程序进行测试。最后,针对导致修改后程序崩溃的畸形样本,TaintScope在混合符号 执行技术的基础上,增加了对符号地址的推理,实现了校验和自动修复技术,能够修复畸形样本,使之通过原始程序的校验和检查。
测试时尝试只修改校验和域,查看H(D)是不是没有变化,没有变化说明是对的。
总的来说,本文的方法不适用于消息认证码和数字签名,能识别也无法生存正确的,所幸用的不多。
混合符号执行能够对执行轨迹进行深度的安全分析,因为到达malloc的样本也不一定能够触发整数溢出漏洞。混合符号执行就能够带符号值计算其是否可能触发了,但混合符号执行的效能还是不太有效。
由于混合符号执行技术在整数溢出漏洞上表现出了较好的效果,因而接下来文章重点介绍了这方面的内容。
对于二进制程序的整数溢出中遇到的困难:
-
二进制程序难以准确确定变量类型,unsigned还是signed之类的
-
二进制程序中程序调用不明确,caLL rax这种静态分析很困难
-
二进制程序无害的整数溢出非常普遍。由于整数溢出本身不构成对程序的破坏,程序员甚至编译器会故意利用整数溢出溢出。例如,GCC编译器在O2优化选项下,会把源代码if(x >= -2 && x<=0x7ffffffd)编译生成:
mov eax, x; // eax=x add eax, 2; // eax = eax+2 js target
这段二进制代码中,将源程序中两个谓词判断简化为-一个谓词判断,虽然极大的x会使add指令会发生溢出,GCC正是利用了溢出的性质,简化了谓词判断。检测过程中,不能将这种对程序不造成破坏的良性溢出识别为整数溢出漏洞。
基于细粒度污点分析的导向性样本生成
如BMP,像素的改变并不会触发异常,头控制信息才会影响分配。
导向性就在于此,变异这些敏感的位置。在保留原始样本的正常结构时,将关键数据片段修改为异常的值。
总结
本文以面向二进制程序漏洞挖掘为总体目标,针对静态分析高误报率、静态符号执行面临的执行空间爆炸和校验和机制导致模糊测试失效等问题,重点研究了细颗粒度污点跟踪、混合符号执行、校验和感知模糊测试、反馈式畸形样本生成、整数溢出漏洞建模与检测等关键技术,对上述问题提出了解决方法。
- 提出了一种校验和感知的模糊测试技术。该技术综合运用了混合符号执行与细颗粒度动态污点跟踪,自动定位程序中校验和检测点、修复畸形样本的校验和域,成功绕过程序中的校验和检查机制。
- 提出了两种反馈式畸形样本生成技术:基于细颗粒度污点分析的导向性测试样例生成和基于混合符号执行的测试例生成技术。基于细颗粒度污点分析的导向性测试例生成有效地降低了变异空间范围,提高了模糊测试的效率:作为导向性模糊测试的重要互补,基于混合符号执行的测试例生成技术能够对单条执行轨迹进行深度安全分析并生成高代码覆盖率的样本。此外,这两种样本生成技术都可以与校验和感知模糊测试技术相结合,提高模糊测试系统漏洞挖掘能力。
- 将整数溢出漏洞抽象为一个source-sink模型。在该模型指导下,提出程序脆弱性包络提取方法;进而通过静态符号执行技术遍历脆弱性包络,避免了对整个代码空间遍历,有效缓解了路径爆炸问题。
- 提出一种基于roBDD的污点分析方法,并实现了原型系统TaintReplayer。Taint Replayer采用离线污点分析模式,在对程序执行轨迹的重放过程中,采用roBDD描述污点属性,进行细颗粒度污点分析。实验结果表明,roBDD结构降低了污点分析对内存的需求,显著提高了污点分析的性能。
文末提出的展望
- 在未来工作中我们将重点研究如何更好的结合两类漏洞挖掘的方法,发挥两类挖掘技术各自优势、弥补两类技术的不足,实现灵活高效的动静结合的漏洞挖掘方法,并对已有挖掘系统进行整合和改进。进- -步,我们将研究构造健壮的、功能丰富的、可扩展性强的综合性漏洞挖掘研究平台,从基础设施层面为漏洞挖掘提供控制流分析、数据流分析、切片分析、代码插桩等支撑技术。
- 其他复杂漏洞模型分析与检测方法研究。
- 本文提出的路径爆炸缓解办法在大型程序上还没有较好的效果,未来,基于云计算平台并行化漏洞挖掘工作吸引了众多研究人员的高度关注。如何结合不同漏洞模型、设计并行化漏洞挖掘算法是本文未来工作的一个重点。
- 对抗策略下漏洞可利用性研究。面对地址随机化、数据执行保护等防护策略的广泛应用,如何自动化判定漏洞是否可以被利用,以及如何自动生成攻击样例,对攻防双方都有着重要的意义。在操作系统防护能力不断增强、攻击越来越困难的情况下,漏洞可利用性分析将成为下阶段的研究重点。