fuzz工具
第一次跑AFL的工具时候,我盯着终端里跳动的工具数字看了整整一下午。那个叫“cycles done”的工具计数从1慢慢爬到200,每完成一轮,工具它就把新发现的工具路径喂给队列,再变异出更刁钻的工具输入。屏幕右下角偶尔蹦出一行红色的工具“crash”,心跳就快一拍。工具这玩意儿比打游戏上瘾——你永远不知道下一次变异会不会撕开一个内存漏洞。工具
Fuzz工具的工具本质就一句话:让程序自己喂自己吃奇怪的东西,看它什么时候噎住。工具听起来糙,工具但过去二十年里,工具从浏览器到内核,工具从PDF解析器到蓝牙协议栈,工具至少一半的高危漏洞是这么被翻出来的。Google的Project Zero团队用libFuzzer跑Chrome,每年能挖出上百个沙箱逃逸。微软的OneFuzz平台更狠,直接拿云算力堆,把Windows组件挨个过筛子。
工具分两派。一派是黑盒的,比如AFL、honggfuzz,它们不关心目标内部长什么样,只管把变异后的字节流灌进去,靠覆盖率反馈决定往哪个方向使劲。另一派是白盒的,像libFuzzer、KLEE,它们要插桩、要符号执行,甚至把程序编译成中间表示再求解约束。黑盒上手快,给个二进制就能跑;白盒精度高,但环境配起来能折腾掉半条命。
AFL的变异策略其实很“笨”。它翻转几个bit,删一段,插一段,或者把两个种子拼一起。但配上覆盖率反馈就聪明了——只要某个变异让程序走进了新分支,这个输入就被保留,成为下一轮的种子。这种进化算法一样的思路,让它在没有先验知识的情况下也能摸到深藏的逻辑。我见过一个案例,某路由器固件的Web接口,AFL跑了三天没动静,换了个字典文件,把HTTP头里的字段名塞进去当种子,两小时就崩了。字典这玩意儿,有时候比算力管用。
不过fuzz不是银弹。它找的是“能触发崩溃的输入”,不是“能利用的漏洞”。一个空指针解引用和堆溢出在AFL眼里都是crash,但后者才值钱。所以真实场景里,fuzz只是第一步。后面还得接符号执行、人工审计,甚至写个PoC验证可利用性。我认识的安全研究员,一半时间在调fuzz参数,另一半时间在分析crash日志,真正写exploit的时间反而最少。
这两年fuzz工具开始往“智能”方向走。比如用机器学习预测哪些函数更可能出漏洞,优先把算力砸过去;或者用大模型生成结构化的种子文件,不再靠随机变异瞎撞。但核心逻辑没变——还是让程序在异常输入下暴露脆弱性。工具再花哨,最后还得看人怎么用。有人拿AFL跑出几十个CVE,有人跑一周只收获一堆重复的crash。差别不在工具,在对目标的理解。
如果你刚入门,别急着搭集群。找个开源小项目,用AFL++跑一遍,看看覆盖率怎么涨,crash长什么样。手动改改变异策略,加个字典,调调超时。等你能稳定复现一个漏洞的时候,再往深了走。Fuzz这东西,动手比看书快。
