EPF:一种基于进化、协议感知和覆盖率引导的网络协议FUZZER
字数 1758 2025-08-29 08:31:35
EPF: 基于进化、协议感知和覆盖率引导的网络协议模糊测试工具
1. EPF概述
EPF (Evolutionary Protocol Fuzzer) 是一款基于Python编写的网络协议模糊测试工具,它结合了进化算法、协议感知和覆盖率引导技术。该工具对应的论文发表在CCF-B级会议PST上,主要用于发现网络协议实现中的漏洞。
2. 安装指南
2.1 安装AFL++
EPF的覆盖率功能基于AFL++的插桩工具afl-clang-fast,因此需要先安装AFL++。
安装步骤:
- 安装依赖:
sudo apt-get update
sudo apt-get install -y build-essential python3-dev automake cmake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools
sudo apt-get install -y lld-11 llvm-11 llvm-11-dev clang-11 || sudo apt-get install -y lld llvm llvm-dev clang
sudo apt-get install -y gcc-$(gcc --version | head -n1 | sed 's/.* //' | sed 's/\..*//')-plugin-dev libstdc++-$(gcc --version | head -n1 | sed 's/.* //' | sed 's/\..*//')-dev
sudo apt-get install -y ninja-build
- 下载并安装AFL++:
git clone https://github.com.cnpmjs.org/AFLplusplus/AFLplusplus
cd AFLplusplus
make distrib
sudo make install
注意:如果只对源代码进行模糊测试,可以将make distrib改为make source-only
2.2 安装EPF
- 安装依赖:
sudo apt-get update && sudo apt-get install python3 python3-pip python3-venv
- 安装EPF:
git clone https://github.com.cnpmjs.org/rhelmke/epf.git
cd epf
python3 -m venv .env
source .env/bin/activate
pip3 install -r requirements.txt
- 验证安装:
python3 -m epf --help
注意:每次使用EPF前都需要激活虚拟环境:source .env/bin/activate
3. 使用EPF进行模糊测试
3.1 测试IEC104协议库
实验准备:
- 下载IEC104协议库:
git clone https://github.com/mz-automation/lib60870.git
cd lib60870/lib60870-C
- 下载IEC104协议PCAP数据包:
wget https://github.com/automayt/ICS-pcap/raw/master/IEC%2060870/iec104/iec104.pcap
- 使用AFL++编译器插桩:
echo "CC=~/AFLplusplus/afl-clang-fast" >> make/target_system.mk
make
开始模糊测试:
cd ~/epf
source .env/bin/activate
python -m epf 127.0.0.1 2404 -p tcp --fuzzer iec104 --pcap iec104.pcap --seed 123456 --restart afl_fork "./cs104_server_no_threads" --smut 0.2 --plimit 1000 --alpha 0.99999333 --beta 1.0 --budget 86400
4. EPF原理详解
4.1 整体框架
EPF分为两个主要阶段:
- 预处理阶段:目标程序插桩、数据包建模、状态转换建模、遗传种群构造器
- 动态分析阶段:执行引擎和主循环
4.2 预处理阶段
4.2.1 目标程序插桩
- 使用AFL++的编译插件(afl-clang-fast)对程序进行编译插桩
- 继承AFL++的覆盖率矩阵计算功能
4.2.2 数据包建模
- 使用Python的Scapy库实现数据包建模
- 支持多种网络协议的数据包结构解析和生成
4.2.3 状态转换建模
- 使用无向有环图对协议状态图进行构建
- 每个路径包含一个特殊的FUZZ节点调用特定数据包类型
- 对于每个测试用例,EPF会:
- 开启一个连接
- 遍历协议状态图
- 发送所有预设好的payload到PUT模块
- 直到测试用例到达对应节点
4.2.4 遗传种群构造器
- 整合包布局定义和FUZZ状态转移图
- 制造种子数据包语料库
- 工作流程:
- 输入PCAP数据包
- 与Scapy中的数据模型匹配
- 应用协议过滤器(白名单规则)
- 按照类型(S,I,U)进行分类形成种群
4.3 动态分析阶段
4.3.1 执行引擎
包含两个部分:
-
覆盖率API:
- 创建64KiB共享内存与插桩程序对接
- 在发送每个测试用例前后对内存映射进行快照
- 计算覆盖率(映射中非零字节的总数)
-
PUT模块:
- 通过execve方法fork子进程
- 监控PUT执行状态
- 在PUT崩溃时记录崩溃信息
4.3.2 主循环
-
Schedule(调度)
- 使用模拟退火算法对种群上的预算分布进行动态建模
- 设C为种子语料库中的种群集合
- 设∈c(i) ∈ [0,1]为循环第i次迭代中种群c的能量或潜力
- 潜力计算公式:
- 如果前一次迭代增加了覆盖率:∈c0(i+1) ≥ ∈c0(i)
- 否则:∈c0(i+1) < ∈c0(i)
- 当∈c0(i)达到阈值∈thresh时,选择下一个种群
-
Generate Input(输入生成)
- 选择父母用例:
- 父用例:来自指数分布函数的选择
- 母用例:来自均匀分布函数的选择
- 测试用例重组:
- 使用单点交叉进行复制
- 随机切片数据包结构并合并
- 测试用例变异:
- 随机选择子数据包字段(p^mut概率)
- 使用类型感知随机字节生成器改变其值
- 选择父母用例:
-
Evaluate Input(输入评估)
- 如果用例引起PUT崩溃:标记为可能引起bug的用例
- 如果覆盖率变化:标记为coverage increase
-
Update Population(种群更新)
- 没有增加覆盖率:
- 以p^add=∈c(i)的概率添加到种群集合中
- 增加了覆盖率:
- 添加到链表首部
- 父母节点向前移动一位
- 当链表达到P^limit时,删除最后一个用例
- 没有增加覆盖率:
5. 总结
EPF是一个强大的网络协议模糊测试工具,其主要特点包括:
- 基于AFL++的覆盖率引导
- 使用Scapy进行协议感知的数据包生成
- 采用进化算法优化测试用例
- 支持多种网络协议的模糊测试
- 提供完整的预处理和动态分析框架
通过模拟退火算法和遗传算法相结合,EPF能够有效地发现网络协议实现中的深层漏洞,特别适用于工控协议等复杂网络协议的测试。