模糊测试基础(一)

admin 2024年9月22日04:54:50评论38 views字数 2344阅读7分48秒阅读模式

一、前言

在当今信息技术迅速发展的时代,软件安全性已成为各个行业不容忽视的重要课题。随着应用程序规模的扩大和复杂性的增加,传统的测试方法逐渐显得力不从心,无法有效地发现潜在的安全漏洞。因此,自动化测试的需求应运而生,其中“模糊测试”(Fuzz Testing)作为一种高效的漏洞检测技术,逐渐受到开发者和安全行业的广泛关注。
模糊测试通过随机生成并执行大量输入数据来探测软件中的漏洞,从而提高系统的安全性和稳定性。本文将深入探讨模糊测试的核心概念、常用工具及其工作原理。

二、模糊测试的概念   

模糊测试是一种自动化的测试技术,它会根据一定的规则自动或半自动地生成随机数据,然后将这些产生的随机数据输入到动态运行的被测程序入口,同时监控被测程序是否有异常情况出现,如系统崩溃、断言失败等来发现软件的缺陷。

简而言之就是通过模糊测试软件自动化生成并执行大量随机测试用例来发现漏洞。

三、模糊测试常用工具  

根据模糊测试的测试用例生成方法分为变异测试和生成测试。

变异测试:fuzz软件通过测试软件,根据算法评估结果,将优秀结果放入待变异库,变异后继续测试。

生成测试:提前生成好测试用例模板导入到fuzz软件中测试软件。

基于变异-覆盖制导fuzz

afl:最经典的fuzz工具

libafl:分为apifuzz模式和frida模式,frida模式可用于无源码fuzz

honggfuzz:用于无源码fuzz

winafl:专用于windows的fuzz

syzkaller:专用于内核fuzz

基于生成的fuzz

peach:用于数据模板fuzz

四、模糊测试的原理 

1、模糊测试的框架

模糊测试首先在插桩后的进程中输入数据,进程生成对应结果并将路径信息传递进行规整,路径信息规整好之后反馈给数据生成器,数据生成器对路径信息进行样本质量评估,高质量的样本将会放入待变异库进行针对性变异并等待下一次数据输入。

模糊测试基础(一)
数据生成器:基于上次的反馈做针对性变异。
插桩:为了让进程将路径信息反馈给fuzz软件,在程序认为有意义的地方插入一段代码(如程序在某处有个判断,会进入a、b分支,在a、b分支内各插入一个函数afl_maby_log,该函数会单独标识a、b分支并将信息传递给主程序)。
传递路径信息:将程序的操作信息、输入信息的路径传递给fuzz软件。
反馈:将规整好的路径信息传给数据生成器,数据生成器对该样本进行评估。

2、插桩 

插桩是fuzz软件在测试软件的进程中插入代码,让测试软件在执行命令时将该命令对应的操作与结果的路径信息反馈给fuzz软件。插桩的目的是获得路径信息反馈,而路径信息反馈则是为了评估该样本的质量

(1)插桩方法 

<1>汇编层插桩
寻找条件跳转点插入函数  类似jnz addr处
<2>llvm官方api插桩

原理:clang(前端的语法解析器)/llvm(后端的语法引擎)相结合插桩。

模糊测试基础(一)
程序的高级语言通过clang转化为IR(高级语言),IR语言通过llvm变成汇编/二进制文件。  
在IR层插桩的函数可以在任意架构、语言的情况下成功执行。

(2)插桩的实现

模糊测试基础(一)

afl-fuzz进程执行目标进程,在目标进程中插入afl_maybe_log函数,在目标进程中执行函数之后会生成对应的hash以及index索引,根据index索引,目标进程会使afl-fuzz进程与目标进程的共享内存数组中index索引对应位置的值+1,即记录了对应操作执行数量。

生成index索引的过程:

模糊测试基础(一)

index索引是通过操作A的afl_prev_loc与结果B的afl_maybe_log异或得到的。

3、forkserver 

由于afl-fuzz每次数据输入都对应一次进程创建,导致性能不佳,因此alf-fuzz创建forkserver,让forkserver来创建进程获得信息。
模糊测试基础(一)
当进程崩溃时,forkserver就会获得子进程崩溃的状态,并且将这一信息传递给afl-fuzz,当前输入样本导致目标进程崩溃。

4、index数据规整 

由于共享内存中数组有限,需要对index索引进行数据规整,将数量相近的一部分值通过下图的方式固定为固定的值。
模糊测试基础(一)
若a->b执行了3次,则将其对应的index放入数组[3]中,当成执行4次。
若a->b执行了4、5、6、7次,则将其对应的index放入数组[4 … 7 ]中,均当成执行8次,以下同理。

5、样本变异 

若样本被afl算法评估为优秀或者存在检测到的可能的token,则该样本会被添加到待变异样本队列中继续运行并变异。   

样本变异算法分为确定性变异与不确定性变异。

确定性变异:

bitflip :按位翻转,如1011 各个位分别转换为相反数并测试。当测试时发现修改某些字段会导致走向不同路径但是通向同一结果,此时相当于发现token=>这一段必须是这种固定组合。当修改任意字段都通向同一路径,则认为是无价值字段。

arithmetic :整数加/减算术运算

interest :特殊数值替换

dictionary :把自动生成或用户提供的token替换/插入到原文件(字典)

不确定性变异:

havoc :随机变异(在前四种变异中随机选一种进行变异)

splice:文件拼接(将以前的变异文件和现在的比较,一样则不合并,不一样则合并)

6、AFL覆盖制导的一些问题 

(1)针对大型项目的缺陷 

1、hash生成简单(只对路径进行异或)
2、映射数组长度有限   

3、路径过多的时候会删除一部分afl_maybe_log

(2)AFL对抗

在程序中加一个对afl的特征检测——环境变量,若存在则退出程序或清空共享内存。由于AFL固定使用199与198管道,程序自己使用198/199管道或者检测198/199管道即可。

原文始发于微信公众号(智检安全):模糊测试基础(一)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年9月22日04:54:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   模糊测试基础(一)https://cn-sec.com/archives/3168083.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息