fuzzing-dictionary
作者 trailofbitsfuzzing-dictionary 技能帮助你为解析器、协议和文件格式构建 fuzzing 词典,内容包括领域特定 token、魔法值和协议字符串。当盲目变异开始停滞、你需要借助 libFuzzer、AFL++ 或 cargo-fuzz 获得更多覆盖率时,它特别有用。
这个技能得分 78/100,属于相当稳妥的收录候选:目录用户可以很快判断何时适用,而且内容提供了足够的工作流细节,相比泛泛的 fuzzing 提示能减少猜测。若你想要一个可复用的、面向字典驱动 fuzzing 的指南,它很值得安装,不过它更偏向方法论,而不是工具操作型。
- 对解析器、协议和文件格式 fuzzing 的触发条件说明非常明确,便于代理判断何时应用该技能。
- 操作性内容比较充实,包含带引号的条目、十六进制转义、token 注入以及跨 fuzzer 格式(libFuzzer、AFL++、cargo-fuzz)等具体概念。
- 正文包含结构化标题和工作流信号,有助于逐步展开信息,也能让代理更快理解内容。
- 没有提供安装命令、脚本或配套文件,因此不要期待自动化或开箱即用的工具链。
- 该技能更偏向技术方法,而不是完整的端到端 fuzzing 工作流,所以代理在创建面向特定目标的词典时,仍可能需要外部上下文。
fuzzing-dictionary 技能概览
fuzzing-dictionary 技能可以帮助你构建和使用 fuzzing dictionary:也就是经过筛选的 token、magic value 和协议字符串,用来引导 fuzzer 进入更深层的解析器、协议或文件格式代码。如果你正在使用 libFuzzer、AFL++ 或 cargo-fuzz,而纯靠随机变异已经卡住,fuzzing-dictionary 技能就能在不重写 fuzz target 的前提下,提供一种实用的覆盖率提升方式。
这个技能最适合那些 target 已经能跑起来,但需要更深入触达校验逻辑的人。尤其适用于输入里包含保留关键字、结构化头部、命令动词或特定格式常量,而随机 fuzzing 又很难碰到这些内容的场景。
fuzzing-dictionary 解决什么问题
它的核心任务,是把“我的 fuzzer 卡住了”转化为一种更有引导性的输入策略。一个好的 fuzzing dictionary 可以帮助绕过早期拒绝,解锁有状态解析分支,并暴露那些只有在出现几个看起来有效的 token 之后才会出现的边界情况。
fuzzing-dictionary 最适合用在什么地方
当你在 fuzz 具有可识别 token 的解析器、协议处理器或文件读取器时,优先使用 fuzzing-dictionary。它特别适合输入结构比原始字节混乱更重要的场景;而对于纯算术、图像变换,或没有 token 词汇表的重逻辑代码,它就没那么合适。
fuzzing-dictionary 的不同之处
fuzzing-dictionary 技能并不只是“多加一些字符串”。它关注的是挑选符合目标验证和解析规则的 token,再把它们整理成你的 fuzzer 真能消费的格式。也正因为如此,当你需要的是一个能直接用的 dictionary,而不是只有“看起来合理”的内容时,它会比通用提示词更有价值。
如何使用 fuzzing-dictionary 技能
安装并找到源文件
先走目录安装流程:npx skills add trailofbits/skills --skill fuzzing-dictionary。安装完成后,先从 SKILL.md 开始,再阅读同一个 skill 文件夹里的任何关联材料。在这个 repo 里,这个 skill 是自包含的,所以主要源文件就是 skill 文件本身。
把你的目标整理成可用提示
fuzzing-dictionary usage 的效果最好,是在你提供了 target 的领域、输入格式和失败模式之后。比如,不要只说“给我的 app 做一个 fuzzing dictionary”,而是要明确提供:
- 解析器或协议名称
- 示例输入或语法线索
- 已知的关键字、头部、magic bytes 或分隔符
- 你使用的 fuzzer 以及它对 dictionary 格式的要求
- 哪些地方覆盖不到,或者校验在哪一步失败
一个有力的提示可以写成这样:“为一个类似 DNS 的协议解析器创建 fuzzing-dictionary。包含常见记录类型、分隔符和控制 token,并按 AFL++ 的格式输出。”
按正确顺序阅读技能内容
对这个 repository 来说,最有用的阅读路径是:
SKILL.md:工作流和适用性规则- 任何关于 dictionary 条目和 token 分类的内联示例
- “When to Apply” 指导,避免把这个技能用在没有收益的 target 上
实用使用建议
条目要短、看起来合理,并且尽量贴近领域本身。如果目标已知会在早期拒绝输入,就把明显 token 和少量边界值或畸形变体混在一起。若第一版 dictionary 过于泛泛,就围绕 target 在失败前实际走到的解析检查点继续细化。
fuzzing-dictionary 技能常见问题
fuzzing-dictionary 只适合 fuzzing 专家吗?
不是。fuzzing-dictionary 技能对初学者也同样可用,只要你已经知道自己在 fuzz 什么,并且能提供示例输入即可。你不需要很懂 fuzzer 内部机制,但需要足够的上下文来描述目标的 token 词汇。
什么时候不该用这个技能?
如果 target 没有有意义的输入 token、如果不加引导覆盖率已经足够好、或者瓶颈在 harness 设计而不是输入质量,就跳过 fuzzing-dictionary。dictionary 不能修复坏掉的 fuzz target,也不能解决 crash-only bug,或者因为缺少 corpus seed 导致的问题。
它和普通提示词有什么不同?
普通提示词往往只会生成一份泛泛的 token 列表。fuzzing-dictionary 技能更有用,是因为它围绕可安装的工作流、与 fuzzer 兼容的格式,以及 dictionary 真正能提升覆盖率的具体条件来设计。这让它在 fuzzing-dictionary install 决策和重复使用上都更可靠。
它适用于所有 fuzzer 吗?
它适用于主流、对 dictionary 友好的生态,尤其是 libFuzzer、AFL++ 和 cargo-fuzz。如果你的工具链使用的是不同的输入机制,你仍然可以借鉴 token 选择逻辑,但在使用前要先确认所需的 dictionary 语法。
如何改进 fuzzing-dictionary 技能
提供更有价值的 target 证据
最好的 fuzzing-dictionary guide 输入,是来自 target 的真实 token:协议动词、枚举名、字段标签、magic number 或保留关键字。哪怕只有一个小型样本语料库,或者几个失败输入,也比对项目的模糊描述更能改善 token 选择。
按用途来要求 token
在使用 fuzzing-dictionary for Code Generation 时,最好把 token 按角色拆开:必需关键字、可选修饰符、边界值和畸形变体。这样输出才能同时覆盖有效解析路径和接近有效的边界情况,而不是只给出一份扁平的字符串列表。
注意常见失败模式
最常见的问题包括:dictionary 过于宽泛、条目与目标语法不匹配、token 太长而无法有效参与变异。如果第一次结果看起来很泛,就把范围收窄到一个解析器、一个协议命令集或一个文件格式部分,然后重新生成。
第一次运行后继续迭代
先跑一轮 fuzzing,看看哪些 token 真的提高了覆盖率,或者是否触达了新的状态。然后删掉无效条目,从 trace 或日志里补上漏掉的关键字,再生成一个更小、更精确的 fuzzing-dictionary,而不是无止境地把它越做越大。
