[Paper] WuppieFuzz:覆盖引导的有状态 REST API 模糊测试

发布: (2025年12月18日 GMT+8 00:05)
8 min read
原文: arXiv

Source: arXiv - 2512.15554v1

概述

本文介绍了 WuppieFuzz,一个开源模糊测试工具,能够通过生成和变异 HTTP 请求序列自动测试 REST API。它基于现代的 LibAFL 框架构建,能够在白盒、灰盒或黑盒模式下运行,并使用 OpenAPI 规范来引导生成真实请求流的语料库。通过利用代码覆盖率反馈来引导模糊测试,WuppieFuzz 能够触及更深层次、具状态的 API 逻辑,而传统的逐请求模糊测试工具往往无法覆盖,从而成为需要加强服务安全性的开发者的实用工具。

关键贡献

  • 有状态、覆盖引导的 REST API 模糊测试 – 将请求序列生成与 AFL 风格的插桩相结合,以探索复杂的 API 状态。
  • 基于 OpenAPI 的语料库创建 – 自动从 API 规范构建一组有效的请求序列,降低手动构建测试框架的工作量。
  • 多模式操作 – 支持白盒(已插桩)、灰盒(通过外部钩子获取覆盖率)和黑盒(无插桩)模糊测试,统一代码库。
  • REST 特定的变异器 – 变异遵循 HTTP 语义(例如,头部微调、参数值模糊、方法变更),同时受益于 LibAFL 的通用变异器。
  • 丰富的报告 – 生成端点级覆盖图、崩溃日志和状态追踪可视化,帮助开发者快速分拣发现的问题。
  • 开源实现 – 该工具公开可用,鼓励社区扩展并集成到 CI 流水线中。

Source:

方法论

  1. 规范解析 – WuppieFuzz 读取 OpenAPI(Swagger)文档,提取所有路径、方法、参数和模式。
  2. 初始语料库生成 – 它合成一组 有效 的请求序列(例如,登录 → 创建资源 → 删除资源),以遵循必需的身份验证流程和数据依赖。
  3. 插装与覆盖率收集
    • 白盒:目标服务使用 LLVM 插装(通过 LibAFL)编译,以获得细粒度的分支覆盖率。
    • 灰盒:轻量级覆盖率 shim(例如 libcoverage)报告基本块命中。
    • 黑盒:通过响应码和头部分析近似覆盖率。
  4. 变异引擎 – 结合 LibAFL 的通用字节级变异器和面向 REST 的变异器(参数值模糊、头部注入、方法交换、负载结构修改)。
  5. 能量调度 – 模糊器动态分配更多变异“能量”给历史上发现新覆盖的请求序列(例如,使用 AFL 的 “fast” 或 “exploit” 调度)。
  6. 反馈回路 – 每发送一次变异序列后,覆盖数据会反馈给调度器,调度器决定下一批要演化的序列,旨在将 API 推入先前未见的状态。
  7. 报告 – 崩溃、断言失败以及异常 HTTP 响应会与触发它们的请求追踪一起记录,并提供每个端点的可视化覆盖热图。

结果与发现

  • 覆盖提升 – 在经典的 Petstore 演示中,WuppieFuzz 在 30 分钟内实现了 ≈ 92 % 接口覆盖率≈ 85 % 分支覆盖率,相较于基线黑盒模糊器提升了 30 %,相较于朴素的无状态模糊器提升了 45 %。
  • 有状态漏洞发现 – 该工具发现了三个仅在特定请求顺序后才会显现的逻辑错误(例如,先创建资源,再更新,随后删除相关实体)。这些错误在单请求模糊器中被遗漏。
  • 调度策略影响 – “exploit” 调度(偏好高覆盖率种子)在接口和代码覆盖率上实现了最快的增长,而 “fast” 调度则在浅层和深层状态的探索之间提供了更均衡的覆盖。
  • 自动化收益 – 使用基于 OpenAPI 的语料库后,Harness 创建时间从数小时(手动设置)降至不到 10 分钟,展示了该方法在实际项目中的可行性。

实际意义

  • CI/CD 集成 – 团队可以将 WuppieFuzz 插入构建流水线,持续监控 API 表面变化,在发布前捕获回归。
  • 安全加固 – 通过自动执行复杂的有状态流程,开发者可以发现身份验证绕过、输入验证不当以及单元测试难以发现的竞争条件。
  • 降低人工工作量 – 基于 OpenAPI 的语料库生成消除了手工编写测试工具的需求,使即使不是安全专家的开发者也能使用模糊测试。
  • 可扩展测试 – 由于模糊器同时支持白盒和黑盒模式,可在开发早期(有源码时)以及后期的类似生产环境(仅能访问运行中的服务时)使用。
  • 可扩展性 – 开源特性和对 LibAFL 的依赖意味着可以在不重写核心引擎的情况下添加自定义变异器(如 GraphQL、gRPC)或领域特定的覆盖钩子。

限制与未来工作

  • 仪器开销 – 白盒模式需要使用 LLVM 仪器重新编译服务,这对于某些遗留二进制文件或缺乏 LLVM 支持的语言可能不可行。
  • 规格质量依赖 – 初始语料库质量取决于完整且准确的 OpenAPI 规范;缺失的认证流程或可选参数会限制状态覆盖。
  • 向大型微服务网格的可扩展性 – 当前评估聚焦于单一 API;将该方法扩展到在众多相互依赖的服务之间协调模糊测试仍是一个未解决的挑战。
  • 动态认证 – 处理令牌刷新、OAuth 重定向或自定义认证机制仍需手动粘合代码;未来工作可以实现这些流程的自动化。
  • 高级状态推断 – 作者计划引入机器学习模型,以更好地预测哪些请求序列可能解锁新状态,从而降低对纯覆盖反馈的依赖。

WuppieFuzz 表明,覆盖引导的有状态模糊测试不仅是学术上的好奇心——它可以成为现代 RESTful 服务安全工具箱中具体且对开发者友好的补充。

作者

  • Thomas Rooijakkers
  • Anne Nijsten
  • Cristian Daniele
  • Erieke Weitenberg
  • Ringo Groenewegen
  • Arthur Melissen

论文信息

  • arXiv ID: 2512.15554v1
  • 分类: cs.SE
  • 出版时间: 2025年12月17日
  • PDF: 下载 PDF
Back to Blog

相关文章

阅读更多 »