6x6的学习

fuzzing论文阅读

自己理解,仅供参考,发现有错,欢迎交流

综述

(1)fuzzing:a survey 2018

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Flink.springer.com%2Fcontent%2Fpdf%2F10.1186%2Fs42400-018-0002-y.pdf

fuzzing分类
(1)基于生成(需要文件格式)
(2)基于变异(不需要文件格式)

fuzzing的挑战:
(1)变异(该在哪里变异)
(2)提高代码覆盖率

代码覆盖率说明
有两种计数法:
(1)基于代码块(节点)
(2)基于代码块跳转(边)

接下来介绍AFL
AFL的代码覆盖计数是基于边的计数法
有两种模式,一种是有源码的模式和没有源码的模式
(1)有源码模式,使用在编译器的技术上实现代码插桩
(2)没有源码的模式,
入手点:
(1)测试用例生成
挑战:
变异的位置
学习输入格式
提高覆盖率
(2)程序执行
挑战:
如何追踪程序
如何为输入文件提供信息
如何提高程序覆盖率
模糊对象:
文件,
内核(1)基于知识的变异(调用内核API)(2)和基于路径(用qemu)
协议

论文

(2) High-Throughput Greybox Fuzzing of IoT Firmwarevia Augmented Process Emulation 2019

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Fwww.usenix.org%2Fsystem%2Ffiles%2Fsec19-zheng_0.pdf
主要讲的是如何对LOT设备的固件进行fuzzing
解决两个问题:
(1)对LOT系统固件进行仿真平台的兼容性问题
(2)仿真平台的效率问题
解决效率问题的方法:
把用户模式仿真和完全系统仿真结合起来
(在用户模式下运行,当需要完全系统仿真时再切换为完全系统仿真)

QEMU技术
是一个基于二进制翻译的程序仿真器
在系统模式中:
主机虚拟地址=客户物理地址+偏移
客户物理地址=客户虚拟地址+偏移
在用户模式中:
主机虚拟地址=客户虚拟地址
所以系统模式中比用户模式的效率低(其中原因之一)

LOT固件测试
直接在硬件测试固件,只把硬件请求定向到硬件,在仿真上测试,发现在仿真上测试的吞吐量(效率)最高(但是效率还是非常的低)

系统模式中比用户模式的效率低原因:
1.地址转换
2.用户模式仿真中的代码翻译过程比全系统模式要快
3.系统调用

主要应用了两种技术:
内存共享映射块来解决用户模式和系统模式的切换
系统调用重定向解决系统调用问题

用户模式和系统模式结合的实现是当遇到分支时通过打开两个子进程:一个运行系统模式的仿真,一个运行用户模式的仿真,并且两个子进程需要相互同步.
其中收集代码覆盖率的信息是在用户模式的仿真中,系统模式的仿真只用于执行系统调用和处理页面故障

总结:该框架针对两个挑战进行了改进,fuzzing的吞吐速度和平台的兼容性做出了改进。

论文

(3)FirmFuzz: Automated IoT Firmware Introspection and Analysis 2019

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Fnebelwelt.net%2Fpublications%2Ffiles%2F19IOTSP.pdf
设计了一个物联网的fuzzing框架:
(1)和平台无关的特性(利用内存镜像)
(2)静态分析代码,生产测试样例
预处理
&1收集信息,静态审计web端代码,尝试破解密码,找到输入接口(fuzzing点)
&2固件预处理:
(1)虚拟外设,如果固件请求外设,(该框架模拟外设直接返回结果)
(2)动态检测固件(帮助注入,反馈结果)
(3)虚拟网卡

输入生成规则,首先收集漏洞类型,然后根据不同的漏洞进行不同的fuzzing
输入主要时通过web客户端来进行输入
解决了以下问题:
(1)客户端句法上的输入模糊遗传(绘制出各种绕过web客户端的模板)
(2)确定性的bug发现(发现相应类型的bug)(利用固件仿真时产生的日志)
(3)消除模糊带来的副作用(系统崩溃或者无限循环请求)
(4)模糊输入点的确定(通过迭代网页上所有接口元素来形成各种模板,每个模板即输入点)

总结:提出一种针对LOT的fuzzing框架,并且有针对性的对4种类型的漏洞进行对应的变异。

论文

(4)PeriScope: An Effective Probing and FuzzingFramework for the Hardware-OS Boundary 2019

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Fwww.ndss-symposium.org%2Fwp-content%2Fuploads%2F2019%2F02%2Fndss2019_04A-1_Song_paper.pdf

核心思想:通过外围设备的输入来对Linux内核进行fuzzing:在驱动和内核之间的数据流通信时添加监视器来监视数据流,并且用于后面的对数据流进行模糊测试
文中设计的框架是一种基于探索外设和内核之间的数据流的框架,只针对两种外设:(1)MMIO(内存映射io)(2)DMA(直接存储器访问,用于外设访问内存的直接接口)
该框架模拟外设对内核进行测试。

背景:
(1)IMMU:管理外设可以访问的物理内存范围

框架分为两部分:
(1)PERISCOPE
通过挂钩内核页面错误处理机制来控制驱动程序对内核的通信
原理:标记监控的目标映像为不在物理块中,以此调用时就会触发缺页中断,缺页后由框架处理,看是否是正常缺页还是框架导致的缺页,如果是后一种,则会传递相应的内存信息,如果后一种,则跳过并且普通执行。

(2)PERIFUZZ
为PERISCOPE的客户端模块,为驱动程序提供和生成输入。并且提出了是在IMMU的基础上进行fuzzing(不进行违规访问)
有以下几个模块:
(1)fuzzer 使用的afl基础
(2)Executor(执行器)是模糊器和注入器的桥梁,用于记录奔溃输入,和提供输入
(3)Injector(注入器)用于连接PERISCOPE的接口
输入和返回保存,防止输入重叠(重复),遇到重复的输入,返回对应的保存的返回值。可以不用大规模的进行执行,而只针对一点进行变异。
使用基于AFL的模糊,使用KCOV来统计代码覆盖率,并且扩展让它支持对中断处理程序的代码覆盖统计,并且让它基于边来进行工作(基于跳转)而不是基于块
当执行器检测到输入被消耗,就会用KCOV记录相关信息。
实现:
【1】在内存中存在一个接口,使用户可以调用所有活动映射,启用或者禁用监视,记录访问情况。
【2】通过随时保存文件来防止崩溃的数据丢失
【3】注入器注册一个设备,用于绑定相应的系统调用,同时映射一个共享内存到外设的输入文件,通过向内存写来注入到内核中,同时使用KCOV来映射文件来计算内存中执行的覆盖率。
总结:这种利用共享内存的形式能够更好的发现ufa漏洞。在发现UFA漏洞方面有显著的优势。同时也是一种针对外设的输入进行fuzzing的通用性框架。

论文

(5)REDQUEEN: Fuzzing withInput-to-State Correspondence 2019

提出了fuzzing算法会遇到的问题:魔术字节和校验和问题。
发现了输入和程序状态的对应关系,即对输入进行编码的情况很少,往往都是输入直接出现在程序内存中
开发了一种局部进行污点追踪和符号执行的方法来解决魔术字节和校验和的问题。
一些相关工作:
(1)基于符号执行的fuzzing(符号执行和污点追踪这需要后面进行研究)
(2)基于污点追踪的fuzzing
那些部分影响那些操作,用来解决魔术字节的问题,但是成本昂贵,而REDQUEEN则选择稀疏的使用它来解决魔术字节的问题。
(3)基于补丁的fuzzing
容易产生程序的假阳性问题,对一个不可能到达的分支进行无限的循环,而REDQUEEN提供了一个输入队列来避免再假阳性问题(错误的判断为漏洞)上浪费过多的资源。
(4)对二进制文件的fuzzing
(5)AFL上的二次开发
输入到状态的对应
(1)对魔术字节的解决(以下为解决步骤顺序)
追踪比较函数和比较命令(并且提取出目标的两个比较参数)
比较可能会出现大于或者小于,对比较参数进行适当的加减
比较可能会出现对输入的编码,列举出一些常见的编码
应用:通过对输入和比较参数的匹配来对输入进行有目的的修改
涂色:为了解决比较的是常见常量,比如0,或者填充字符,会再不改变执行路径的情况下,尽量对样本进行随机化。
除了对比较命令的关系还需要对比较函数,主要方法是对超过2个参数的函数的参数和输入进行匹配。
(2)对校验值的解决
寻找区别于魔术字节的比较和对校验和的比较,处理方式和魔术字节不同,可以直接修改源代码中的跳转,如果修改后出错,说明不是输入可以控制的,则还原。
鉴别过程发生在处理魔法字节的过程中,鉴别过程如下:
能够在参数的一边找到我们类似的突变模式(比如替换,附加。。。)
两个比较的参数都不是立即的值(立即数)
在涂色过程中一边(或者都有)的值的模式也会发生改变
问题:会删除一些检测让不可预知的路径可达。
引入一个额外的阶段:验证阶段
验证阶段会将打补丁后fuzzing输入队列的输入到未打补丁的程序中,如果发生新的路径,则补丁成功,如果没有,则补丁失败。
结论:
设计了一种可以解决魔术字节和校验和问题的fuzzing框架,比污点追踪和符号执行更加有效率,是污点追踪,符号执行和模糊测试的结合。

论文

(6)Fuzzing File Systems viaTwo-Dimensional Input Space Exploration 2019

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Ftaesoo.kim%2Fpubs%2F2019%2Fxu%3Ajanus.pdf
首先研究的fuzzing目标是文件系统。
提出对文件系统进行fuzzing有以下3个挑战:
(1)文件系统的输入口一般都很巨大,映像大小是其他类型fuzzing的100倍,极大的降低了吞吐,同时对其进行fuzzing也会进行大量的IO操作。其次,如果要进行模糊的话对元数据进行模糊是非常好的,但是再没有文件结构的知识的情况下,无法再对元数据模糊后再修改相应的校验和。
(2)现在的文件系统模糊无法产生一个合法的文件调用命令组合。
(3)现在的文件系统模糊重复的使用系统环境,导致了上一个输入会影响下一个输入产生的结果。
文件系统的模糊有两个输入(模糊入口):
(1)磁盘映像模糊
存在的挑战:
文件映像的元数据(用户数据和几个管理结构)很大
文件系统频繁的读写
检测元数据是否被破坏,内核会进行校验
(现在大多做法:除去0元素,对非0进行fuzzing,问题:无法修复校验和,会去除初始化元数据)
(2)文件操作
存在挑战:
无法知道映像中的文件是否已经改变,无法推测出映像中的文件名作为参数,得不到映像中的文件的状态。
使用上一个输入的操作系统环境:(1)旧的操作系统不确定(2)为定位漏洞和总结奔溃原因带来歧义。(提出用library OS来解决)
(3)把上面两个结合起来
下面介绍本文提出的框架JANUS:
(1)只提取元数据作为突变目标,并且只存储元数据,这样就可以让模糊测试有更大的吞吐率。
(2)根据映像推测文件操作
(3)用映像和文件操作作为二维输入进行变异模糊
同样是在AFL的基础上进行开发的。
总结:
在模糊处理映像的元数据(解决映像文件过大)情况下,进一步处理了模糊的映像,根据映像产生更深层次的文件操作,并且配合映像一起输入进行模糊。(解决无法产生合法的文件操作),然后运用库式(library OS)操作系统来解决环境问题。

论文

(7)FuzzFactory: Domain-Specific Fuzzing with Waypoints 2019

https://dl.acm.org/doi/pdf/10.1145/3360600
设计了一种更加细化的模糊测试框架,主要改进了反馈环节,不再局限于代码覆盖率,并且负责把这些信息进行汇总,以增加模糊测试的泛用性。
引入了航点的概念,用于有方向的进行fuzzing(即除了额外路径产生的种子外还需要保存航点作为种子)
航点用处:
更快的找到魔术字节
框架:
可以让用户指定一个领域,在程序运行时收集特定领域的反馈。
如何确定航点:
定义:a:聚合值
》:还原函数
k:程序的位置信息
v:对应为k的自然数映射
s{i1,i2,i3...}:输入集合
A:为反馈
dsf(i)(k)表示测试输入i上执行程序时,在程序位置kd分配的内存总量,单位是字节
d=(K,V,A,a0,》)称为域,如内存分配的域
is_waypoint(i,S,d),关键函数:这个定义意味着,如果对输入的执行导致某些关键的特定领域反馈值的变化,我们将保存输入(并且称为航点)
该框架针对路径,块的大小,内存分配的情况,验证输入有效性,比较指令,程序代码的改变。等领域来进行收集程序运行的信息。
总结:
提出一种通用的模糊框架,可以用于不同领域来进行模糊测试,而不用改变模糊算法。

论文

(8)MOPT: Optimized Mutation Scheduling for Fuzzers 2019

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Fwww.usenix.org%2Fsystem%2Ffiles%2Fsec19-lyu.pdf#=&zoom=130
该文章主要对fuzzing的变异算法提出了改进,认为现在使用的变异算法的变异策略需要改进
主要fuzzing影响效率的原因:
(1)不同操作的效率不同
(2)相同操作的操作对象不同
(3)操作的效率随着时间变化
(4)调度算法会产生性能开销
(5)机器学习的不平衡数据集(正负样本数据集)
核心思想:
(1)变异算子的调度应该试有方向的进行调度,而不是随机的进行调度,调度的概率应该和历史经验有关,而不是普通的以相等的概率进行调度。
这个算法称为:Particle Swarm Optimization(pso)
(2)使用了一种 Pacemaker Fuzzing Mode,这种模式可以跳过魔术字节的路径,从而避免浪费过多的时间去对魔术字节进行模糊:
当对某一字节进行变异时,如果总是没有新的路径或者奔溃,则直接放弃对该字节的变异。
总结:
设计了一种变异调度算法,通过寻找最佳的变异调度,并且配合Pacemaker Fuzzing Mode来提高变异产生的测试的质量。

论文

(9)ANTIFUZZ: Impeding Fuzzing Audits of Binary Executables 2019

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Fwww.usenix.org%2Fsystem%2Ffiles%2Fsec19-guler.pdf#=&zoom=130
作者提出了如何设计一种方法去阻止模糊测试,分析现在的模糊测试都基于4个方面:(1)覆盖率带来的反馈(2)崩溃可以被保存(3)每秒可以实现很多执行(快速执行)(4)约束条件可以使用符号执行来解决
针对这4个方面,作者提出了以下方法:
(1)针对覆盖率的反馈,提出了使用假路径分,用输入的hash值来决定假路径的执行路径,这样没一个输入都可以有新路径产生,大大降低和混淆了模糊的效率。
(2)针对崩溃可以被保存的问题,说到模糊程序观察奔溃主要靠:(1)观察退出状态;(2)通过覆盖信号处理程序来捕捉崩溃信号;(3)使用操作系统(OS)级别的调试接口,如trace,根据这些作者提出了使用假奔溃的思想,通过反调试措施和一个退出api(可以制造假崩溃)来进行翻译。
(3)针对每秒钟可以实现很多执行的假设,作者提出了如果检测到输入不正确,应用程序会执行减速操作(即休眠250ms)这对普通用户影响不大,但是会极大的限制了模糊测试的速度,因为模糊测试产生的输入大多是错误的。(开心一下:文中提出为了降低识别度,除了用sleep函数外,还可以使用耗时的函数,如加密计算,甚至可以使用加密货币的挖掘代码(这也许可以为使用者带来额外的收入??))
(4)针对约束条件可以符号执行,比较可以使用hash值加密后进行比较(缺点:如果输入的是正确值就无效了,而且无法比较大小),这样可以阻止符号执行的反推,或者使用分组密码对输入进行加密和解密。
总结:
使用上述技术,即使在简单的程序中也可以实现防止模糊程序进行模糊,即使只有几秒钟就可以找到错误。

论文

(10)Not All Bugs Are the Same:Understanding, Characterizing, and Classifying the Root Cause of Bugs 2019

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Farxiv.org%2Fpdf%2F1907.11031.pdf#=&zoom=130
该论文讲了一个研究反向,根据bug的错误报告自动给bug分类
首先总结了相关的研究:
(1)根据bug的严重程度进行分类(作者提出毫无卵用)
(2)根据bug的(1)起源(bug的输入)(2)模式(导致bug的情况)(3)类型(是软件还是硬件之类的,只包括bug发生的上下文环境),作者认为类型缺少了对bug起源的描述
(3)使用机器学习来对bug进行分类 77%准确率
作者主要思想:
根据bug跟踪平台上的报告来对bug进行分类,分析每种bug频率,相关主题,修复时间,以此来用机器学习来对bug报告进行分类。

论文

(11)Building Fast Fuzzers 2019

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Farxiv.org%2Fpdf%2F1911.07707.pdf#=&zoom=130
该论文讨论的是改进模糊算法,开始介绍了语法模糊器的优缺点:
优点:比随机模糊的输入有效率更高
缺点:速度慢,有盲点
本文提出了一个快速的语法模糊器。将语法模糊器视为一个编程语言的解释器,来解释输入的格式,并且对其进行模块性模糊,产生有效率的输入,由于对编程语言解释器了解不深,所以这方面我选择跳过。
本文提出的只是一个假设,并不是很全面,还存在以下问题:
(1)没有对程序运行的反馈(比如没有对覆盖率的处理,没有引导输入朝新路径进行改变)
(2)并没有实际让程序运行,也没有检测崩溃

论文

(12)MemLock: Memory Usage Guided Fuzzing 2020

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Fwcventure.github.io%2Fpdf%2FICSE2020_MemLock.pdf#=&zoom=130
设计了一种面向内存消耗的模糊测试(普通的模糊测试都是面向覆盖率的模糊测试)
内存消耗可以产生拒绝服务漏洞,但是针对面向覆盖率的模糊测试来说,挖掘这样的漏洞没有针对性。
作者提出了一种针对这种漏洞的模糊算法
本文针对的内存消耗漏洞类型:
(1)不受控制的递归
(2)不受控制的内存分配
(3)内存泄漏
如果一个输入与以前的输入相比覆盖了新的分支,它就被认为是有趣的,并被添加到种子队列中。此外,尽管一个输入没有覆盖新的分支,但如果它导致了更多的内存消耗,也会通过一个新的种子更新方案将其保留为一个有趣的输入。
针对第一个内存消耗类型(不受控制的递归),作者使用在函数调用处进行插桩,来计算函数调用的深度,深度越高带来的反馈越大
针对第二个内存消耗类型(不受控制的内存分配),作者使用在内存分配标准函数中进行插桩,来计算程序内存分配的峰值
总结:
在普通的fuzzing框架上增加了对内存分配峰值的反馈,结合覆盖率对变异种子进行了改进。可以有针对的发现内存消耗漏洞。

综述

(13)The Progress, Challenges, and Perspectives ofDirected Greybox Fuzzing 2020

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Farxiv.org%2Fpdf%2F2005.11907.pdf#=&zoom=130
该文章介绍的是对指向性模糊测试方向的研究和展望。
指向性模糊测试相对于普通的模糊测试(以覆盖率为导向)相比,指向性模糊测试只关心有bug的代码段(目标代码段)的覆盖,而不是一些无意义的代码段或者不关心的代码段。适用于补丁测试(patch testing ),bug复制(bug reproduction,重现已知的bug),知识整合(knowledge integration,根据已有的人类经验进行有目标的测试),结果验证(result validation),节能(energy saving,可以在有限的吞吐上进行更有效的测试),和特殊的bug发现(special bug hunting)
指向性模糊(DGF)目前所面临的挑战:
(1)差异化的权重衡量标准(忽略了分支不同跳转的不同概率)
(2)全局最优的偏差(使用最短路径算法导致忽略了中间的目标)
(3)探索新的路径和开发已有的路径之间的权衡
(4)变异体的优化(如何变异)
(5)不支持二进制代码

综述

(14)A Review of Memory Errors Exploitation in x86-64 2020

https://www.mdpi.com/2073-431X/9/2/48/htm
本文强调了对内存错误的关注,回顾了对内存错误的保护机制的研究,介绍了内存错误的根本原因,告诉我们安全的函数并不能防止内存错误的利用,同时提出保护机制并不能完全的保护内存错误的利用

论文

(15)Learning Input Tokens for Effective Fuzzing 2020

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Fpublications.cispa.saarland%2F3098%2F1%2FlFuzzer-preprint.pdf#=&zoom=130
本文提出了一种动态扩展的污点追踪技术,并且提出用字典来代替普通的单字节变异(前提:在有源码的情况下)
具体实现步骤:
首先需要设计一个模型来对字典和种子输入进行提取,称为lFuzzer,
解析器:用来对输入模式进行测试,首先输入一个值,如果被拒绝,则替换成被比较的值,然后直到比较结束且接受的输入长度最大
污点动态传播:主要思想就是要让污点能够得到传播,不仅仅局限于第一层赋值和比较,具体算法请看论文。
检测标记化阶段
纠正错误分类的污点
使用令牌进行种子输入生成
总结
在代码执行的时候,检测输入的比较模式,进行加强性的动态污点追踪(即标记器一般是由此来实现的:一个或多个输入字符与预定义的值进行比较,如果有一个值符合要求,则将相应的标记转发给解析器),并且将比较的值加入字典中进行变异模糊(需要和输入的值对应起来),该方法主要是针对有方向的进行模糊的一种方法。

论文

(16)Boosting Fuzzer Efficiency:An Information Theoretic Perspective 2020

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Fmboehme.github.io%2Fpaper%2FFSE20.Entropy.pdf#=&zoom=130
本文作者用信息理论用于描述模糊测试的效率,引入了香农熵的概念(输入暴露的程序信息的数量),并且给种子被输入的优先级,具有高能量(香农熵优秀的种子)的种子在输入队列中具有更高的概率被选择。
运用极限的思想给出了停止fuzzing的条件(指定s(n+1)-s(n)为停止fuzzing的参考值)s(n)为未发现信息的数量
使用信息论的思想给模糊测试进行建模,把程序中的信息比作信息,用输入来对信息进行探索。(但是还存在一个反馈环节,会提高后期发现信息的概率,作者提出了一个自适应性偏差的想法)
该文章主要偏向信息论熵的理论。(本人看的有点不懂)主要用于解决模糊的建模问题,解决了何时停止,以及优秀种子的筛选。

论文

(17)FuZZan: Efficient Sanitizer Metadata Design for Fuzzing 2020

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Fnebelwelt.net%2Ffiles%2F20ATC.pdf#=&zoom=130
本文提到,大多数模糊测试都是通过检测程序奔溃来判断是否触发了一个bug,而对于不会触发奔溃的bug,则需要用消毒器来进行检测
提出了一个消毒剂的概念
消毒器:它们是基于一个影子内存的数据结构,其中地址空间被分割,元数据被编码到 "影子 "内存中,与程序内存有一个恒定的偏移。(https://github.com/google/sanitizers)
消毒剂主要是用于代码测试阶段,但是使用消毒器来判断bug有一个问题,效率过低。(本文分析其原因是因为它采用的元数据结构过大)
本文基于几点做出改进:
(1)使用轻量级的内存管理元数据结构(会引起内存信息的损失的情况)
(2)使用动态分配,动态切换到需要的轻量元数据结构
当进程退出时,内核通过unmap_vmas清除所有页表的尝试,并释放页表的内存(通过free_pgtables)(该操作占用大多消耗)
轻量级的内存管理元数据结构:
(1)红黑树元数据结构(特点:很低的启动和拆卸成本,但是访问速度慢)用于访问数量少的短时执行
(2)最小阴影内存(min-shadow memory)(特点:中等的启动和拆卸成本,访问速度快)用于访问数量中高的执行
动态切换基于以下假设:当前变异后的输入的内存调用和前一个的内存调用情况基本相似,于是我们抽样性的记录(使用慢启动模式,如果抽样结果不变,会变长抽样间隔)内存访问情况(插入,查找删除中对内存的访问次数,内存消耗),给不同的内存配置不同的内存数据结构
总结:
由于消毒器的效率问题,将消毒器用于模糊器一直是一个问题,作者通过提高消毒器的效率(提升了52%),减少不必要的消耗来让消毒器和模糊器结合起来,让其有了实用的价值

论文

(18)TOFU: Target-Oriented FUzzer 2020

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Farxiv.org%2Fpdf%2F2004.14375.pdf#=&zoom=130
本文提出了一种对关键位置进行模糊测试(现今大多数模糊测试都是用代码覆盖率为反馈来进行种子筛选),通过使用是否覆盖关键代码来进行反馈(只对目标代码段是否有漏洞感兴趣),提出了一种名为TOFU的模糊框架。
与aflgo和Hawkeye的区别:
(1)对于命令输入(配置输入),不需要用户额外配置
(2)采用了距离的度量概念,和aflgo和Hawkeye的退火算法不同
(3)不采用随机模糊策略,而是使用语言规范进行模糊
设计思路:
首先进行命令行命令的结构搜索,通过距离来找出合适的命令行配置选项组合,然后再对输入负载进行变异模糊
相关实现细节:使用Whole-Program-LLVM来对程序进行插桩、
总结:
设计了一种名为TOFU的结构化突变和基于距离引导的模糊测试框架,该框架有利于生成输入,以达到程序中的特定位置,尤其是程序中的深层位置。(可以有效运用于某些领域)

论文

(19)Fitness Guided Vulnerability Detection with Greybox Fuzzing 2020

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Fwww.csa.iisc.ac.in%2F~raghavan%2FReadingMaterial%2Fsbst20.pdf#=&zoom=130
本文提出了一个现在基于覆盖率的模糊器存在的一个问题:
单一的以覆盖率为导向,默认假设已经测试过的覆盖过的代码是安全(有可能输入没有触发到bug点,或者这个代码要执行多次才可以触发bug),提出了一个度量单位:headroom
定义了两种情况:
(1)向有新覆盖的分支扩展
(2)先没有新覆盖时但是headroom降低的方向扩展
算法流程如下:

其值 "default "表示第一情况,值 "headroom "表示第二情况,fitness字段包含与该测试输入相对应的分支-配对覆盖概况,closeness字段仅用于第二情况中的测试输入,并存储脆弱性概况(每一个新生成的测试输入tg在第13行被执行。在第13行中,执行新生成的测试输入t,然后执行getVProfile,创建测试输入的漏洞描述,在第15行中,每一个新生成的测试输入都被执行。生成漏洞配置文件所需的工具取决于漏洞的类型,然后在给closeness)。
总结:
本文提出了一种针对不同特点漏洞的检测指标来检测和暴露漏洞,由于本文分析的特色漏洞类型有限,所以本文还提出了一些别的漏洞类型的展望:释放后使用漏洞,SQL注入漏洞等等的特点漏洞指标。

论文

(20)FAIRFUZZ-TC: a fuzzer targeting rare branches 2020

https://link.springer.com/article/10.1007/s10009-020-00569-w
该论文在fairfuzz上面做出了改进(微微的改动)用于可以使用于Test-Comp(一个竞赛)
fairfuzz:一个争对稀有分支的模糊器
改进如下:
(1)输入生成(fairfuzz输入格式一般是以文件形式来生成的,而fairfuzz-tc是以输入字节流来输入的)
(2)种子输入(fairfuzz的种子只包含了一些正确的输入,而fairfuzz-tc的种子作者添加了三个特殊的错误或者超时的种子)
(3)超时设定(fairfuzz没有设置明显的超时时间(或者永远不会超时),而fairfuzz-tc设置了一个超时时间)

论文

(21)GREYONE: Data Flow Sensitive Fuzzing 2020

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Fwww.usenix.org%2Fsystem%2Ffiles%2Fsec20spring_gan_prepub.pdf#=&zoom=130
问题:
针对校验和问题提出的数据流敏感的模糊测试
提出了三个问题:(1)如何使用轻量级和准确的污点追踪用于有效的模糊测试?
(2)如何有效的用污点引导突变(突变策略)
(3)如何使用数据流特征来引导进化的方向(普通的使用代码覆盖率来进行引导,即使用控制流来进行引导)
作者提出一种名为GREYONE的解决方案来解决上述问题:
针对轻量级作者提出的一种轻量级的污点推断,位于每次突变之后,通过改变某个位的值来测试每个比较的变量值的变化(即变异)来确定污点值。对输入的每个位都进行。
针对突变策略,提出了在污点上来进行突变和变异
针对使用数据流特征来引导,作者提出了使用一致性函数(在变异之后,用变异的值和污点值进行计算一致性,一致性高的将优先输入)来测试输入和分支值的距离(比如追踪到的污点值的相同值的位数),来让针对性的对污点进行模糊引导。
总结:
对覆盖率为评价标志和模糊方向发起了挑战,提出了一种基于数据流的导向,导向取决于当前变异和污点值之间一致性。(给定一个未触及的分支br,它依赖于两个操作数var1和var2,定义一致性:Cbr(br,S) =NumEqualBits(var1,var2),函数NumEqualBits返回两个参数之间相等的比特数)

论文

(22)P2IM: Scalable and Hardware-independent Firmware Testing viaAutomatic Peripheral Interface Modeling 2020

chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Fwww.usenix.org%2Fsystem%2Ffiles%2Fsec20spring_feng_prepub_0.pdf#=&zoom=130
本文设计了一种框架来对固件进行模糊测试,通过设计一种专门产生外设IO的输入的设备来解决各种外设缺乏的场景(并且对该输入进行模糊测试)
提出了把模糊测试用于固件测试的挑战:
(1)硬件依赖,固件对硬件的依赖会影响其运行的速度,这点再模糊测试中是致命的,并且如果需要并行的运行测试,这也是非常重要的一点
(2)外设种类多,没有一款仿真器可以完全的仿真所有mcu(微控制器),不同的mcu的固件的接口不同。
(3)没有固定的操作系统,需要固件模糊测试需要与系统无关,不对系统进行假设
(4)固件模糊的接口,一般固件与外设的接口是固定并且统一的,固件需要和外设进行交互,而外设有自己的规定来处理输入的数据。手动为每个模糊器添加每个外设的接口并不是很现实。
通过抽象一种自动生成的输入框架来代替外设(局限于内存映射寄存器,中断,直接内存访问(DMA))

posted @ 2021-05-30 20:48  Nothing”to”say  阅读(408)  评论(0编辑  收藏  举报