)
应用安全测试漏洞扫描【免费下载链接】AFLplusplusAFL is a state-of-the-art fuzzer, and #1 in benchmarks. It was originally based on AFL. Today it comes with qemu 5.1, collision-free coverage, enhanced laf-intel redqueen, AFLfast power schedules, MOpt mutators, unicorn_mode, and a lot more!项目地址https://gitcode.com/gh_mirrors/af/AFLplusplus点击查看免费下载output_article本指南聚焦 AFL 内置的custom_send_tcp自定义变异器custom mutator它让afl-fuzz不再依赖文件或 stdin 传递输入而是把每一次变异后的测试用例直接通过 TCP socket 发送给监听中的网络目标程序。读完本文你将掌握AFL_CUSTOM_MUTATOR_LATE_SEND、CUSTOM_SEND_IP、CUSTOM_SEND_PORT、CUSTOM_SEND_READ四个关键变量的完整语义学会编译加载该变异器并正确启动一次针对 TCP 服务的模糊测试同时理解其底层源码实现重连竞态处理、可选的响应等待逻辑以及在持久模式persistent mode下的精确发送时机。一、背景为什么需要“通过 TCP 发送测试用例”常规的 AFL 模糊测试通过写入临时文件或 stdin 的方式把输入交给目标程序。但如果被测程序是一个监听 TCP 端口的网络服务例如自定义协议服务器、代理、消息网关等它并不从文件或 stdin 读取数据此时默认的输入通道就无法工作。AFL 的自定义变异器 API 为此提供了一个专门的钩子函数afl_custom_fuzz_send()。根据 docs/custom_mutators.md 中的说明该函数用于“由变异器自己把数据发送给目标例如通过 IPC”可以替代部分 utils/afl_proxy 的用法但要求目标程序仍然由afl-fuzz启动。custom_send_tcp正是这一 API 的最直接落地实现它把每次变异后的测试用例通过 TCP 连接发送到指定 IP 与端口从而对网络服务进行模糊测试。该变异器由 dergoegge 贡献相关记录见 docs/Changelog.md。二、afl_custom_fuzz_send与AFL_CUSTOM_MUTATOR_LATE_SEND的核心机制要正确使用custom_send_tcp必须先理解 AFL 调用afl_custom_fuzz_send的两种模式这是该变异器 README 中强调AFL_CUSTOM_MUTATOR_LATE_SEND“MUST be set”必须设置的根本原因。2.1 非 LATE 模式执行前立即发送当没有设置AFL_CUSTOM_MUTATOR_LATE_SEND时afl-fuzz会在把输入写入测试用例文件之前直接调用自定义发送函数。相关逻辑位于 src/afl-fuzz-run.cLIST_FOREACH(afl-custom_mutator_list, struct custom_mutator, { if (el-afl_custom_fuzz_send) { if (!afl-afl_env.afl_custom_mutator_late_send) { el-afl_custom_fuzz_send(el-data, *mem, new_size); } else { afl-fsrv.custom_input *mem; afl-fsrv.custom_input_len new_size; } sent 1; } });即非 LATE 模式下发送发生在子进程执行前此时监听端口的服务进程可能尚未启动完毕容易产生连接被拒connection refused的竞态问题。2.2 LATE 模式目标重启/就绪后再发送当设置AFL_CUSTOM_MUTATOR_LATE_SEND1时变异器数据不会被立即发送而是暂存在fsrv-custom_input/custom_input_len中等待 forkserver 在目标子进程启动并完成监听准备后再发送。这在 src/afl-fuzz.c 中完成注册if (afl-custom_mutators_count afl-afl_env.afl_custom_mutator_late_send) { u32 count_send 0; LIST_FOREACH(afl-custom_mutator_list, struct custom_mutator, { if (el-afl_custom_fuzz_send) { if (count_send) { FATAL( You can only have one custom send() function if you are using AFL_CUSTOM_MUTATOR_LATE_SEND!); } afl-fsrv.late_send el-afl_custom_fuzz_send; afl-fsrv.custom_data_ptr el-data; count_send 1; } }); }在持久模式persistent mode的热路径中forkserver 唤醒存活的目标子进程后会先调用late_send再等待其完成本轮执行见 src/afl-forkserver.cif (unlikely(fsrv-late_send)) { fsrv-late_send(fsrv-custom_data_ptr, fsrv-custom_input, fsrv-custom_input_len); }这就是为什么 TCP 服务必须使用AFL_CUSTOM_MUTATOR_LATE_SEND它把发送动作延迟到“目标已经重启并开始监听之后”从而规避网络服务的启动竞态。注意两个硬性约束使用 LATE_SEND 时只能加载一个提供afl_custom_fuzz_send的变异器否则afl-fuzz直接FATAL退出环境变量在 src/afl-fuzz-state.c 中解析并登记于 include/envs.h。三、环境变量与配置参数详解custom_send_tcp共使用 4 个环境变量全部在 custom_send_tcp.c 的afl_custom_init()中读取环境变量含义是否必填备注AFL_CUSTOM_MUTATOR_LATE_SEND启用延迟发送在目标重启后调用发送函数必须设置对 TCP 服务是硬性要求原因见上文 2.2 节CUSTOM_SEND_IP要发送到的目标 IP 地址必填README 明确提示“基本上只有 127.0.0.1 有意义”因为目标与 fuzzer 位于同一主机CUSTOM_SEND_PORT目标 TCP 监听端口必填通过htons(atoi(port))转换为网络字节序CUSTOM_SEND_READ是否等待目标端的回复可选设置后发送完毕会阻塞等待读取一次响应1 秒超时见下文 4.3 节其中CUSTOM_SEND_IP与CUSTOM_SEND_PORT若缺失变异器会在初始化阶段直接报错并退出if (!ip || !port) { fprintf(stderr, You forgot to set CUSTOM_SEND_IP and/or CUSTOM_SEND_PORT\n); exit(1); }此外还支持一个隐式开关设置AFL_DEBUG会打开该变异器内部的调试打印my_debug 1DEBUG(...)宏会在连接、写入、读取等关键节点输出诊断信息便于排查网络问题。四、从源码看实现细节4.1 初始化与连接参数解析afl_custom_init()完成三件事读取环境变量、分配并初始化tcp_send_mutator_t结构体内含afl_state_t *afl指针和struct sockaddr_in server_addr、把 IP 与端口填充进 socket 地址结构。IP 使用inet_pton(AF_INET, ...)解析仅支持 IPv4转换失败同样直接退出。初始化成功后会打印[] Custom tcp send mutator setup ready to go!。4.2 重连竞态处理最多 10000 次尝试即使启用了AFL_CUSTOM_MUTATOR_LATE_SEND目标程序从启动到真正开始listen()之间仍存在时间差。try_connect()针对这一竞态做了防御循环调用connect()最多尝试 10000 次每次失败后nanosleep休眠 100 纳秒再重试源码注释原话attempt to connect N times and sleep a short period of time in between connection attempts// Even with AFL_CUSTOM_LATE_SEND1, there is a race between the // application under test having started to listen for connections and // afl_custom_fuzz_send being called. ... struct timespec t; t.tv_sec 0; t.tv_nsec 100; nanosleep(t, NULL);这一设计保证了 fuzz 早期目标服务首次启动不会因为监听未就绪而丢失大量测试用例。4.3 发送与可选响应读取afl_custom_fuzz_send()的执行流程为创建SOCK_STREAM套接字调用try_connect()最多 10000 次重试建立连接write()写入整个测试用例缓冲区buf长度buf_size若设置了CUSTOM_SEND_READ则使用select()等待 socket 可读超时 1 秒超时打印read() timeout!有数据则读取最多 64 字节后丢弃仅用于同步不参与覆盖分析close()关闭连接等待下一次变异发送。值得注意CUSTOM_SEND_READ1的意义在于让目标服务“有来有回”——某些协议服务器只有在读取请求并返回响应后才算完成一次完整的处理周期等待回复可以避免因对端未处理完毕就进入下一轮变异导致的无谓状态错乱。4.4 与通用示例对比仓库还提供了一个更通用的模板 custom_mutators/examples/custom_send.c它把每次变异数据写入/tmp/foo文件注释明确说明“可以修改为发送到 IPC、共享内存等”。custom_send_tcp可视为该模板面向 TCP 传输场景的完整实现二者共用同一组afl_custom_fuzz_send回调语义。五、编译与运行完整指南5.1 编译为共享库custom_send_tcp以共享对象.so形式加载。仓库提供了现成 Makefilecustom_mutators/custom_send_tcp/Makefilecd custom_mutators/custom_send_tcp make其底层编译命令等价于cc -Wno-unused-result -g -O3 -shared -fPIC -o custom_send_tcp.so -I../../include custom_send_tcp.c要点必须通过-I../../include引入 AFL 头文件afl-fuzz.h因为变异器结构与afl_state_t深度耦合官方在 docs/custom_mutators.md 中提醒若升级 AFL 后afl_state_t布局变化需要重新编译自定义变异器。5.2 启动模糊测试README 原始示例假设目标服务监听在127.0.0.1:8000并期望 fuzzer 在每次执行后发送数据并等待回复CUSTOM_SEND_IP127.0.0.1 CUSTOM_SEND_PORT8000 CUSTOM_SEND_READ1 \ AFL_CUSTOM_MUTATOR_LATE_SEND1 \ AFL_CUSTOM_MUTATOR_LIBRARYcustom_send_tcp.so \ ./afl-fuzz ...其中...处需要按正常方式补齐-i种子目录、-o输出目录与目标程序及其参数建议目标以-Q等兼容模式或持久模式启动。逐项拆解AFL_CUSTOM_MUTATOR_LATE_SEND1强制延迟发送规避目标监听竞态AFL_CUSTOM_MUTATOR_LIBRARYcustom_send_tcp.so指定自定义变异器共享库可用绝对路径多个变异器以;分隔见 docs/custom_mutators.mdCUSTOM_SEND_IP/CUSTOM_SEND_PORT目标地址CUSTOM_SEND_READ1发送后等待一次目标回复。5.3 不需要种子文件关于AFL_CUSTOM_MUTATOR_ONLY如果希望完全由自定义变异器主导变异流程可叠加AFL_CUSTOM_MUTATOR_ONLY1此时所有变异仅由自定义变异器执行见 docs/custom_mutators.md 与 docs/env_variables.md 的环境变量说明。不过对 TCP 发送场景种子目录-i仍需按afl-fuzz常规要求提供以初始化输入队列。六、使用注意事项与限制AFL_CUSTOM_MUTATOR_LATE_SEND必须设置README 明确标注 MUST be set。未设置时发送发生在目标子进程执行前网络服务尚未监听测试用例会大量丢失。仅支持单一发送者LATE_SEND 模式下afl-fuzz会校验自定义变异器列表中只有 1 个实现afl_custom_fuzz_send多个将 FATAL 退出src/afl-fuzz.c。仅 IPv4 本机回环inet_pton(AF_INET, ...)只解析 IPv4README 亦指出 IP 基本上只有127.0.0.1有意义目标由同一台机器上的afl-fuzz启动。CUSTOM_SEND_READ的 1 秒超时若目标协议不会主动返回数据不要设置该变量否则每轮执行最多会额外阻塞 1 秒显著拉低吞吐。变异数据不再写入测试用例文件从 src/afl-fuzz-run.c 的代码可知一旦afl_custom_fuzz_send存在并完成发送afl_fsrv_write_to_testcase()将被跳过——即输入完全经由网络通道交付这与常规文件输入模式不兼容需确保目标只通过 TCP 读取数据。调试手段设置AFL_DEBUG1可打印连接、写入、select、超时等诊断日志配合AFL_NO_UI使用效果更佳docs/custom_mutators.md 亦有说明。七、小结custom_send_tcp是 AFL 自定义变异器体系中“面向网络服务”的最小完整范例它以 4 个环境变量完成配置通过afl_custom_fuzz_sendAFL_CUSTOM_MUTATOR_LATE_SEND的组合把变异数据在目标就绪后经 TCP 送达并用 10000 次重连与可选响应等待兜底网络竞态。读懂它的源码custom_mutators/custom_send_tcp/custom_send_tcp.c与 forkserver 的调用链src/afl-fuzz.c、src/afl-forkserver.c即可照此模式为任意自定义协议目标编写属于自己的“IPC 直送”变异器将 AFL 的能力从文件输入扩展到网络协议模糊测试。 /output_article赞分享应用安全测试漏洞扫描【免费下载链接】AFLplusplusAFL is a state-of-the-art fuzzer, and #1 in benchmarks. It was originally based on AFL. Today it comes with qemu 5.1, collision-free coverage, enhanced laf-intel redqueen, AFLfast power schedules, MOpt mutators, unicorn_mode, and a lot more!项目地址https://gitcode.com/gh_mirrors/af/AFLplusplus点击查看免费下载相关推荐AFL自定义变异器开发终极指南打造专属模糊测试武器库AFL自定义变异器开发终极指南打造专属模糊测试武器库 AFL自定义变异器开发是提升模糊测试效率的关键技术。通过自定义变异器你可以针对特定文件格式或协应用安全测试漏洞扫描AFL 集成 Nautilus 语法模糊测试LibAFL Nautilus 自定义变异器libafl_nautilus构建与使用指南AFL 集成 Nautilus 语法模糊测试LibAFL Nautilus 自定义变异器libafl_nautilus构建与使用指南 导读 对于需要满应用安全测试漏洞扫描GHelper 安装使用指南5 分钟把华硕笔记本的性能模式与风扇曲线握在自己手里GHelper 安装使用指南5 分钟把华硕笔记本的性能模式与风扇曲线握在自己手里 如果你打开任务管理器发现一堆名字带 Armoury 的进程长期霸占着上桌面应用系统编程上一篇视频PPT提取实测一条 evp 命令把1小时课程录像变成可打印的PDF下一篇TypeScript 原生 API 新增分层虚拟文件系统Layered VFS快照更新机制详解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考