论文阅读笔记——PathAFL:Path-Coverage Assisted Fuzzing_pathafl path-coverage assisted fuzzing

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

2(A、B、D)时将记录新的边缘

B

D

BD

BD,因此与路径

2

2

2相关的测试用例现在将添加到种子队列中。然而,边缘覆盖并不能追踪边缘被命中的顺序,因此一些详细信息可能会丢失。我们使用下图中的简单程序和其控制流图来说明这个问题,该程序以

8

8

8个字符作为输入。当输入为abcd**‼**cdef!!时,程序将崩溃。
在这里插入图片描述
14. 路径覆盖率:基于路径覆盖的方法跟踪整个执行路径,包括命中的顺序边缘,从而记录最丰富的信息。几乎不可能为真实世界的应用程序实现路径覆盖,因为程序中有太多的循环和条件,路径的数量会激增。海量路径将带来较大的运行时开销,并可能降低模糊处理的效率。为了克服这个问题,作者将新探索的路径分为两类:
* 对于之前未触及的边,作者将其表示为

 e 
 
 
 − 
 
 
 p 
 
 
 a 
 
 
 t 
 
 
 h 
 
 
 
 e-path 
 
 
 e−path。 
 
 
 
 
 “ 
 
 
 e 
 
 
 − 
 
 
 ” 
 
 
 
 “e-” 
 
 
 “e−”表示路径有新的边
* 所有边都已接触的路径,作者将其表示为 
 
 
 
 
 h 
 
 
 − 
 
 
 p 
 
 
 a 
 
 
 t 
 
 
 h 
 
 
 
 h-path 
 
 
 h−path。 
 
 
 
 
 “ 
 
 
 h 
 
 
 − 
 
 
 ” 
 
 
 
 “h-” 
 
 
 “h−”表示路径有一个新的哈希  
 关键问题是如何处理大量的 
 
 
 
 
 h 
 
 
 − 
 
 
 p 
 
 
 a 
 
 
 t 
 
 
 h 
 
 
 
 h-path 
 
 
 h−path,作者的解决方案是,不将所有的 
 
 
 
 
 h 
 
 
 − 
 
 
 p 
 
 
 a 
 
 
 t 
 
 
 h 
 
 
 
 h-path 
 
 
 h−path添加到种子队列,而只将那些高权重的 
 
 
 
 
 h 
 
 
 − 
 
 
 p 
 
 
 a 
 
 
 t 
 
 
 h 
 
 
 
 h-path 
 
 
 h−path增加到种子队列。这是一种效率和追踪粒度之间的权衡。

根据上文分析可以发现,目前主要的挑战是路径的数量随着程序大小的增加而呈指数级增长。因此,建议只向种子队列添加重要路径。根据这一思想,作者总结了路径覆盖辅助fuzzer的三个关键问题:

  1. 如何识别

h

p

a

t

h

h-path

h−path?
2. 如何减少

h

p

a

t

h

h-path

h−path的数量?
3. 哪些

h

p

a

t

h

h-path

h−path将被添加到种子队列?

2.1、如何识别

h

p

a

t

h

h-path

h−path?

静态插桩。AFL在编译时对目标程序进行插桩。插桩代码计算边缘哈希并更新边缘覆盖记录到共享内存中。PathAFL维护一个类似AFL的全局哈希表。表索引表示路径哈希,值表示路径是否被覆盖。PathAFL以类似的方式对目标程序进行插桩。它只在AFL原始插桩代码中插入了一小段代码来计算路径哈希。此外,PathAFL扩展了原始共享内存,以存储路径哈希值的4个字节。在程序执行期间,执行路径的哈希值会实时计算并追加到共享内存中。当程序运行完成时,执行路径哈希可用于确定是否已探索新路径。与AFL相比,PathAFL只在插入代码中添加了哈希计算函数,导致开销增加很少。

2.2、如何减少

h

p

a

t

h

h-path

h−path的数量?

PathAFL采用两种方法来降低执行路径的跟踪粒度,以便模糊器可以限制新

h

p

a

t

h

h-path

h−path的数量:

  1. 选择性插桩:AFL默认情况下对目标程序中的所有边缘进行检测,使我们能够跟踪几乎所有的执行路径。为了减少路径,PathAFL必须降低跟踪粒度,只检测部分

B

B

L

BBL

BBL并跟踪到达新BBL或触发新错误的概率更高的路径。为了实现这个目的,PathAFL仅对一些函数进行执行路径的插桩。提出以下四个策略来选择关键函数(根据以下策略,可以有效地减少新发现的

h

p

a

t

h

h-path

h−path的数量):

* 插桩较大的函数,默认为最大的 
 
 
 
 
 20 
 
 
 
 20% 
 
 
 20。因此,可以找到许多通过这些函数的 
 
 
 
 
 h 
 
 
 − 
 
 
 p 
 
 
 a 
 
 
 t 
 
 
 h 
 
 
 
 h-path 
 
 
 h−path
* 插桩具有内存操作的函数,例如函数名包含`alloc/free`的函数
* 忽略太小的函数。类似于第一个策略,函数越小,代码越少
* 对其他函数的 
 
 
 
 
 10 
 
 
 
 10% 
 
 
 10进行插桩
  1. 哈希算法:作者采用了一个非常简单的方案,直接使用全加运算作为路径哈希算法,并以粗粒度的方式区分执行路径。哈希算法如下:
    在这里插入图片描述

p

p

p表示执行路径。

B

S

BS

BS表示所有插桩的基本块的执行序列。只需在现有的插桩代码中插入一个add汇编指令,对测试程序的运行效率几乎没有影响。哈希表的大小与AFL中的位图相同。请注意,此方法仅用于计算路径哈希,不影响 AFL 的原始边缘哈希计算。

2.3、哪些h-path将被添加到种子队列?

为了进一步减少添加到种子队列的

h

p

a

t

h

h-path

h−path的数量,设计了一种策略来确定是否向种子队列添加

h

p

a

t

h

h-path

h−path:

  1. 效率是一个关键因素
  2. e

p

a

t

h

e-path

e−path比

h

p

a

t

h

h-path

h−path更重要
3. 应该选择变异后更有可能接触到新边缘的

h

p

a

t

h

h-path

h−path

正如以下算法所示,作者设计了一种快速过滤算法来满足这些要求。
在这里插入图片描述

2.4、种子选择算法

在AFL的原始种子选择算法中存在一个小问题。它虽然确保

F

F

F(受青睐的种子集)覆盖所有探测到的边,但它并不能确保在一个fuzzing测试循环中测试的受青睐的种子涵盖所有已发现的边,此问题正如下面的算法所示。
在这里插入图片描述
  针对此问题,作者提出了一个新的种子选择算法,如下图所示。它修复了上述提到的缺陷,确保在一个模糊测试周期中测试的受青睐的种子将覆盖所有已发现的边。
在这里插入图片描述

2.5、资源调度

PathAFL根据路径的权重实现新的资源调度,并将更多的资源分配给更高权重的路径。具体来说,它将所有路径按权重划分为六部分,每一部分都分配了不同的资源。

3、达到的效果

作者使用IDA进行静态分析。编写IDAPython脚本来自动分析程序结构,获得边缘信息,并为目标程序生成数据文件。该文件记录所有边缘信息,作为PathAFL的输入,以计算路径权重。下表展现了关于静态分析的时间开销。
在这里插入图片描述

3.1、一个简单例子的结果(RQ1)

此部分的实验用于回答RQ1,即“跟踪执行路径对于fuzzing是否可行?”。作者以第1.3节中讨论的例子作为测试用例,对其所有边进行了插装,以在使用PathAFL进行测试时计算路径哈希。结果显示在下表中。AFL和CollAFL-x在7天内未能触发崩溃,而PathAFL和PathAFL-np仅用了一个小时就触发了。此外,PathAFL和PathAFL-np分别在一天内触发了6次和8次崩溃。
在这里插入图片描述
  这个实验表明,PathAFL能够有效地识别

h

p

a

t

h

h-path

h−path,并且使用

h

p

a

t

h

h-path

h−path引导模糊测试是可行的。

3.2、代码覆盖率和崩溃测量(RQ2)

此部分的实验用于回答RQ1,即“PathAFL的代码覆盖率有多好?”。在本次实验中,作者选择了如下几个流行的应用程序进行测试。
在这里插入图片描述
  下表显示了四个模糊测试工具探索的路径和边的数量。
在这里插入图片描述
  以上实验表明,PathAFL和PathAFL-np探索的路径数量几乎相同,但PathAFL探索的边的数量比PathAFL-np多。故认为PathAFL更好,可能触及更多的新代码分支。
  下图显示了10个实验中不同fuzzer随时间的增长的代码覆盖率的增长。
在这里插入图片描述
  这再次表明作者的解决方案是有效的。
  下表统计了触发的唯一崩溃的平均数量。

在这里插入图片描述
  此结果表明PathAFL在找到程序中存在的不同崩溃方面表现出色。
  总之,PathAFL在路径和边缘发现方面优于AFL和CollAFL-x。而且最好使用资源调度。这些实验证明,所提出的解决方案可以帮助提高路径和边缘覆盖率,并引发更多的崩溃。

3.3、LAVA-M数据集(RQ3)的结果

此部分的实验用于回答RQ1,即“PathAFL的错误检测能力有多好?”。作者在LAVA-M数据集上对AFL和PathAFL进行了为期7天的评估。且对每个实验都进行了五次,并对所有发现的bug进行了计数。评估结果如下表所示。
在这里插入图片描述
  结果表明,与AFL相比,PathAFL发现了更多的错误。具体来说,PathAFL发现了AFL发现的所有错误。此外,PathAFL发现了base64中注入的所有漏洞,甚至发现了LAVA-M的作者没有列出的四个新漏洞。

写在最后

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。

需要完整版PDF学习资源私我

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

FL的错误检测能力有多好?”。作者在LAVA-M数据集上对AFL和PathAFL进行了为期7天的评估。且对每个实验都进行了五次,并对所有发现的bug进行了计数。评估结果如下表所示。
在这里插入图片描述
  结果表明,与AFL相比,PathAFL发现了更多的错误。具体来说,PathAFL发现了AFL发现的所有错误。此外,PathAFL发现了base64中注入的所有漏洞,甚至发现了LAVA-M的作者没有列出的四个新漏洞。

写在最后

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。

需要完整版PDF学习资源私我

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-6KnarOAW-1713282524300)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值