cURL的模糊测试机制
OSS-Fuzz作为Google提供的开源项目持续模糊测试平台,自2017年7月起为cURL提供支持。该平台使用libFuzzer、AFL++和Honggfuzz等覆盖率引导的测试引擎,测试代码存放在curl-fuzzer GitHub仓库中。该仓库包含测试脚本、用例生成器、测试套件等组件,以及针对HTTP(S)、WebSocket等协议的初始测试用例集(corpora)。每个测试目标采用自定义TLV(类型-长度-值)格式编码协议数据和元数据。
初始发现:HSTS与Alt-Svc的覆盖率缺陷
通过分析OSS-Fuzz的覆盖率报告,我们发现关键安全文件覆盖不足:
hsts.c
(处理严格传输安全头):仅4.46%行覆盖率altsvc.c
(处理备用服务头):类似低覆盖率
根本原因包括:
- 测试用例集缺少相关协议头样本
- 未启用CURLOPT_HSTS选项
- HSTS规范要求HTTPS连接的限制阻碍测试
改进方案与成效
我们实施了三大改进:
- 添加Strict-Transport-Security和Alt-Svc种子文件
- 启用CURLOPT_HSTS选项
- 为调试版本添加CURL_HSTS_HTTP环境变量绕过限制
改进后效果显著:
- HSTS代码行覆盖率提升至10.2%
- Alt-Svc代码行覆盖率从4.76%跃升至23.6%
测试用例扩展策略
我们新增了多个关键功能的测试种子:
- 认证相关选项(CURLOPT_XOAUTH2_BEARER等)
- 用户代理设置
- SSH主机密钥验证
- 两种POST请求实现方式(含已弃用的CURLOPT_HTTPPOST)
全局初始化设置新增:
- Cookie引擎测试配置
- 证书吊销列表处理
进阶优化建议
- 协议字典扩展:为所有支持协议创建字典文件加速模糊测试
- 命令行参数模糊测试:采用AFL++的argv-fuzz-inl.h测试CLI接口
- 结构感知模糊测试:通过定制化变异器解决TLV格式效率问题:
- 无效输入转为合规TLV格式
- 在解码数据层面执行变异
- 序列化后返回有效TLV数据
未来展望
我们在2023年的后续审计中继续优化cURL测试框架,相关成果将在后续文章中披露。这些改进使cURL这个每天执行数十亿次的关键网络工具更加安全可靠。