面向二进制程序的漏洞挖掘关键技术研究分析
面向二进制程序的漏洞挖掘关键技术研究分析论文关注的研究现状被动发现1.蜜罐2.基于补丁的漏洞发现技术主动挖掘技术1.手工漏洞发现技术2.静态漏洞发现技术3.动态漏洞挖掘技术本文的主要工作roBDD离线细粒度污点分析技术二进制程序的混合符号执行技术1.符号执行需要符号计算系统的支撑,硬件要求高,没有好办法,制约了其发展2.无法处理循环或递归,如果边界条件中有符号变量,很难确定其次数3.没有源代码难以处理系统API的调用问题4.符号在处理矢量数据单元(数组)时面临挑战有源码符号执行面向二进制程序的符号执行校验和感知模糊测试校验和检测点特征分析校验和自动修复技术基于细粒度污点分析的导向性样本生成总结文末提出的展望面向二进制程序的漏洞挖掘关键技术研究分析······王铁磊大佬的论文分析
国内在软件安全漏洞挖掘方向比较活跃的机构包括中国信息安全测评中心、中国人民解放军总参谋部、北京大学、中国科学院软件所、北京邮电大学、解放军信息工程大学、国防科学技术大学、北京理工大学、哈尔滨工业大学、武汉大学等机构和院校。这些单位在漏洞挖掘和管理等方面取得了一定的成绩,但在零日漏洞发现的数量、国际顶级会议论文数、漏洞库的有效利用、漏洞响应管理等方面与美国相比还有较大距离。
论文关注的研究现状总体图,接下来分类介绍
被动发现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之类的
二进制程序中程序调用不明确,caLLrax这种静态分析很困难
二进制程序无害的整数溢出非常普遍。由于整数溢出本身不构成对程序的破坏,程序员甚至编译器会故意利用整数溢出溢出。例如,GCC编译器在O2优化选项下,会把源代码if(x>=-2&&x