用途:该技能为代理提供对开源 C/C++ 软件(特别是 OSS-Fuzz 项目)进行模糊测试所需的知识与工具,覆盖构建 fuzzer、运行模糊测试活动、分析结果并改进项目模糊测试状态,重点是基于 libFuzzer 风格的 harness。
主要能力与核心方法:
- 威胁建模与攻击面识别:先明确哪些输入不可信、输入在哪个函数跨越信任边界、攻击者在该边界控制什么、什么算真实漏洞。据此确定 harness 应针对的入口点(如文件格式解析、网络协议处理、序列化/IPC、文本与查询语言、解压与编解码等)。
- 由威胁模型推导 harness 形态:只模糊不可信输入方向(解码器而非编码器、读取端而非写入端);只变异攻击者可控的部分,其余固定;在真实信任边界处调用接口;遵守 API 契约以避免误报。
- 可达性处理:若到达深层代码需要前置状态(会话、握手、头部包、已注册编解码器),需在 harness 中先构造这些状态;并结合覆盖率数据判断是种子不足还是 harness 不足。
必要用法:
- harness 核心函数为 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size),正常情况返回 0,返回 -1 表示拒绝输入,禁止对坏输入调用 exit()。
- 使用 FuzzedDataProvider 将输入拆分为多个带类型的值,按固定顺序消费并记录;变长/剩余参数最后用 ConsumeRemainingBytes/...AsString 消费;用 ConsumeIntegralInRange 约束大小和索引;单一不透明缓冲区目标可直接传 data/size。
- 一次性初始化放在 LLVMFuzzerInitialize 中(如解析 argv、设置环境变量、初始化库全局),不要在每次迭代中做昂贵操作;可复用状态放在文件作用域 static/global。
- 构建时使用 OSS-Fuzz 的 $CC/$CXX 与 $CFLAGS/$CXXFLAGS,库尽量静态构建,harness 链接 $LIB_FUZZING_ENGINE,并复制种子语料与字典。
适用场景:OSS-Fuzz 项目及类似的开源 C/C++ 项目的 fuzzer 编写与维护。
限制:资料未提供该技能的具体安装命令、依赖版本、收费与价格、平台支持范围或效果保证;部分内容(如性能一节)在给定资料中被截断。