智能化漏洞挖掘技术总结

全文基于《从自动化到智能化:软件漏洞挖掘技术进展》进行提炼、总结、修改。1.静态漏洞挖掘技术

1.1面向源代码

面向源代码的漏洞挖掘主要采用基于中间表示的分析和基于逻辑推理的分析技术。
基于中间表示的分析技术主要包括数据流分析、控制流分析、污点分析、符号执行等。Pixy采用了取值分析、污点分析、指针别名分析等静态分析技术实现对PHP源码中的SQL注入和跨站脚本等漏洞的检测。Prefix采用了静态符号执行技术模拟执行C/C++源码程序,并采用约束求解对程序中的部分路径进行检测。Melange采用数据流分析的框架,通过对程序进行数据流、控制流等复杂分析检测安全相关的漏洞,并支持对大型C/C++源码程序的分析。
基于逻辑推理的分析技术主要是指模型检测,如MOPS、BLAST、SLAM是典型的面向C程序的模型检测工具,其基本思路是将程序结构抽象为状态机(布尔程序),然后基于归纳的安全属性对状态机进行遍历,检测其中存在的漏洞。

1.2面向二进制

面向二进制程序的静态漏洞的挖掘技术由于缺少源代码中的结构化信息,面临着值集分析(vaule-set analysis,VSA)与控制流恢复不精确的问题。当前,二进制静态漏洞挖掘技术主要包括基于模式匹配和基于补丁比对的技术。
在基于模式匹配的漏洞挖掘技术方面,GUEB提出了二进制程序中UAF漏洞模式,首先抽象出二进制函数中的内存模型,然后采用VSA分析技术追踪堆分配和释放指令相关的操作变量,并基于此建立UAF模式。LoongChecker使用了称为半仿真的二进制静态漏洞挖掘技术。通过VSA分析和数据依赖分析(data dependence analysis,DDA)技术实现对变量地址的追踪和数据流依赖分析,并采用污点分析技术检测潜在的漏洞。Saluki使用了路径敏感和上下文敏感的数据依赖分析,并采用完备的逻辑系统推理检测程序中的漏洞。
在基于补丁比对的漏洞挖掘技术方面,PVDF以二进制漏洞程序(带有权限提升漏洞)和补丁作为输入,从比对中提取多维属性描述的漏洞语义信息,并应用于后续的模糊测试中。BinHunt通过对二进制程序和带补丁的二进制程序间的比对提取漏洞相关的语义信息。具体而言,就是把二进制程序翻译成中间表示,并在此基础上构建控制流图,基于控制流图对比程序间的差异,提取相关的约束,然后采用符号执行技术进行验证,以此找出补丁对应的漏洞。

2.动态漏洞挖掘技术

常用的动态漏洞挖掘技术包括模糊测试、符号执行等

2.1

模糊测试(fuzzing)是一种自动化或者半自动化的软件测试技术,通过构造随机的、非预期的畸形数据作为程序的输入,并监控程序执行过程中可能产生的异常,之后将这些异常作为分析的起点,确定漏洞的可利用性。根据程序内部结构分析的量级轻重程度分,模糊测试技术主要可以分为白盒、黑盒、灰盒模糊测试。其中,白盒模糊测试是在对被测试程程序内部结构、逻辑进行系统性分析的基础上进行测试;黑盒模糊测试把程序当成黑盒处理,不对程序内部进行分析;灰盒模糊测试介于黑盒和白盒模糊测试之间,在对程序进行轻量级分析的基础上进行测试。按样本生成方式划分,模糊测试的测试输入可分为基于变异和基于生成2种方式。其中,基于变异的模糊测试在修改已知测试输入的基础上生成新的测试用例,而基于生成的模糊测试则是直接在已知输入样本格式的基础上生成新的测试输入。
下面介绍基于变异的模糊测试、基于生成的模糊测试和其他优化策略。

2.1.1基于变异的模糊测试。

在基于变异的模糊测试方面,研究人员借助程序执行环境信息和程序分析技术,有导向性地辅助、引导模糊测试的变异,具有代表性的工作有AFL、VUzzer、Honggfuzz、libFuzzer、Steelix、T-Fuzz、AFLFast、AFLGo、Driller等。
AFL 官网:https://lcamtuf.coredump.cx/afl/
VUzzer 源码:https://github.com/vusec/vuzzer
Honggfuzz 源码:https://github.com/google/honggfuzz
libFuzzer 源码:https://github.com/Dor1s/libfuzzer-workshop.git
T-Fuzz 源码:https://github.com/HexHive/T-Fuzz
AFLFast 源码:https://github.com/mboehme/aflfast
AFLGo源码:https://github.com/aflgo/aflgo
Driller源码:https://github.com/shellphish/driller

2.1.1.1代码覆盖率制导。

AFL使用进化算法(evolutionary algorithms)生成测试输入,在正常输入的基础上,通过简单的反馈回路的方式评估测试输入的质量。AFL会保留任何能触发新路径的测试输入,并对其进行变异及检查能否触发崩溃。AFL通过哈希函数检测分支覆盖筛选种子的方式具有较高的误报率,其哈希位图(bitmap)只有64 kB大小,导致普遍存在哈希碰撞的情况,进而导致其分支覆盖统计存在漏报,进而影响种子筛选,间接影响了代码覆盖率的增长。CollFuzz采用静态控制流图信息作为辅助,并设计了能避免哈希碰撞的基本块ID分配策略,从而实现比AFL更精确的分支覆盖检测。

2.1.1.2污点分析辅助。

BuzzFuzz使用动态污点分析技术自动定位影响程序脆弱点的测试输入中的字段,然后保留其他语法部分内容,只对这些字段进行变异。这样既能通过语法检查,也能有针对性地进行变异,提高漏洞挖掘的效率。TaintScope使用污点分析技术推断程序中与校验和处理相关的代码,以此帮助模糊测试工具绕过校验和检查。

2.1.1.3符号执行制导。

Driller采用模糊测试和符号执行交替探索程序执行路径,解决模糊测试陷入代码覆盖率增长慢的情况,这样能引导模糊测试探索到程序更深层次的节点,也能直接避免符号执行可能带来的路径爆炸问题.不过基于符号执行增强的模糊测试技术仍然会受限于符号执行中的约束求解问题,符号执行的引入可能会弱化模糊测试本身的可扩展性。

2.1.1.4控制流和数据流信息制导。

VUzzer在“轻量级”的动、静态分析基础上提取了程序的控制流和数据流信息引导变异。具体而言,VUzzer先在静态控制流分析基础上计算基本块的权重,然后在动态执行时筛选权重更高即路径更深的执行路径对应的测试输入为种子文件,并用动态污点分析定位变异点。相比AFL、Driller,VUzzer有更好的种子筛选、路径探索策略以及污染点定位、变异策略,能定向引导探索更深的执行路径,并定点变异。

2.1.2基于生成的模糊测试。

基于生成的模糊测试主要基于模型或者语法生成能满足程序语法和语义检查的测试输入,常用于高度结构化的测试输入生成。

2.1.2.1基于模型的模糊测试。

Peach、Spike是典型的基于模型的模糊测试工具,通过对输入格式定制编写数据模型(dat

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值