智能模糊测试技术综述

文章目录

忽略标题中的智能

解释模糊测试技术:背景、定义、技术原理、意义、当前国内外热点研究方向;

模糊测试技术(Fuzzing)是一种流行的软件测试技术,通过自动化生成并执行大量的随机测试用例来发现产品或协议的未知漏洞。最早的应用是威斯康星大学的Barton Miller于1988年在课程实验中用随机数据来轰炸UNIX程序直至崩溃,其后被广泛用于软件测试和漏洞挖掘。模糊测试的技术本质是生成随机测试用例来进行测试验证,所以是不确定的,恰当选取测试数据的变异和生成策略可以提升代码覆盖率从而发掘更多的漏洞。目前的热点研究方向是与符号执行等程序分析技术结合,并探索在更多领域中的应用场景。

解释 网络协议栈模糊测试:网络协议栈是什么、本技术必要性、本技术原理、意义。

网络协议栈一般指TCP/IP协议栈,是现代网络通信的基础组件,其可靠性和安全性十分重要。但对网络协议栈进行模糊测试是非常困难的。首先,网络协议栈的输入是具有依赖关系的数据包和系统调用,因此生成有效的测试用例是比较有挑战性的;其次,网络协议栈在运行过程中具有很多状态迁移的情况,而现有的测试方法目标在于覆盖更多的状态而非状态迁移;最后,网络协议栈中,语义缺陷的比例远大于内存缺陷,而现有的检查器只能检测内存缺陷,无法检测语义缺陷。AFLNet 采用了一种新的变异方法,使用状态反馈来指导模糊测试,能识别状态空间中的渐进区域,并系统地引导覆盖这些区域。结果表明,AFLnet 在代码覆盖范围、状态空间的覆盖范围和 bug 查找能力方面大大优于最先进的技术。

解释: 内核模糊测试:内核是什么、本技术必要性、本技术原理、意义。参考Syzkaller。

操作系统内核是最复杂的计算机程序之一,挖掘内核中隐藏的错误和漏洞对提高系统的整体安全具有重要意义。Syzkaller 利用系统调用对内核进行 fuzzing,优势在于会根据内核的代码路径覆盖信息来更新 fuzz 用的变异数据,以达到尽可能大的代码覆盖率。针对内核驱动中包含的复杂结构体,用白盒审计的方式往往难以发现深层次问题,通过模糊测试可以很容易找到一些隐藏深处的代码安全漏洞。

解释: 链接库模糊测试:链接库是什么、本技术必要性、本技术原理、意义。参考libfuzzer。

链接库是一种不可执行的二进制代码文件,程序底层往往依赖链接库以复用现成的代码,基础库中的漏洞也会威胁上层应用的安全。由于库本身不是可执行程序,需要自己编写测试入口,将LibFuzzer和要被测试的库链接在一起,fuzzer会跟踪哪些代码区域已经测试过,然后在输入数据的语料库上产生变异,来最大化代码覆盖。其中代码覆盖的信息由LLVM的SanitizerCoverage插桩提供。

解释: 可执行程序模糊测试:可执行程序、本技术必要性、本技术原理、意义。参考afl。

可执行程序是直接运行在用户终端或服务器上的程序,也是最直接的攻击入口,使用模糊测试技术能够发掘许多0day漏洞。目前最流行的模糊测试工具是 AFL,通过编译时插桩实现覆盖率引导,其变异策略采用了遗传算法以不断生成测试用例,学术界和工业界都有很多新的工作基于 AFL 完成。

解释: 分布式模糊测试:硬件参数具体内容、本技术必要性、本技术原理、意义。参考clusterFuzz。

分布式模糊测试可以解释为对分布式系统的模糊测试,但这里指使用分布式的方法开展模糊测试,由于现代大型软件往往不在单机上构建部署,使用分布式架构进行可扩展的模糊测试很有必要。 ClusterFuzz 就是一款提供端到端的模糊测试工具,从错误检测到分类排查,再到错误报告的生成,整个流程都是自动化的。早在 2012 年,Google 就使用该款工具每天针对各种 Chrome 版本运行 5000 万个测试用例。

overview

参考资料

Fuzzing技术总结(Brief Surveys on Fuzz Testing) - 知乎 (zhihu.com)

AFLNET:一种针对网络协议的灰盒模糊测试器 - 安全客,安全资讯平台 (anquanke.com)

面向TCP协议栈的模糊测试框架 (ccf.org.cn)

基于关系学习的内核模糊测试 HEALER - 知乎 (zhihu.com)

Syzkaller入门知识总结 - FreeBuf网络安全行业门户

secfigo/Awesome-Fuzzing

wcventure/FuzzingPaper

常用编译脚本

#!/bin/sh
# Run this script in source dir then it will build/ and install/

AFL_CC=1
SANITIZE=1
if [[ $AFL_CC ]]; then
  export CC=afl-clang-lto
  export CXX=afl-clang-lto++
  #export CC=afl-gcc-fast
  #export CXX=afl-g++-fast
else
  export CC=clang
  export CXX=clang++
fi

if [[ $SANITIZE ]]; then
  export AFL_USE_ASAN=1
  export CFLAGS="-g -O0 -fno-omit-frame-pointer -fsanitize=address"
  export CPPFLAGS="-g -O0 -fno-omit-frame-pointer -fsanitize=address"
  export LDFLAGS="-O0 -fsanitize=address"
else
  export CFLAGS="-g"
  export CPPFLAGS="-g"
fi

export PREFIX=`realpath ./install`
mv ./install ./oldinstall
if [[ -f ./meson.build ]]; then
   meson build --prefix=$PREFIX
   ninja -C build
elif [[ -f ./CMakeLists.txt ]]; then
  rm -rf build && mkdir build && cd build
  cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=On -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$PREFIX -DENABLE_STATIC=On -DBUILD_SHARED_LIBS=Off -DBUILD_STATIC_LIBS=On
else
  ./configure --disable-shared --enable-static --prefix=$PREFIX
fi
bear -- make -j$(nproc)
make install

评论正在加载中...如果评论较长时间无法加载,你可以 搜索对应的 issue 或者 新建一个 issue