如何让LibFuzzer仅生成偶数长度输入以模糊测试指定函数?
如何让cargo fuzz(LibFuzzer封装)仅生成偶数长度的输入
当然可以跳过那个长度检查的无效测试,直接让LibFuzzer只生成符合要求的偶数长度输入,这里给你两种实用的方案:
方法1:在Fuzz Target层处理输入(推荐)
这是最简单直接的方式,不需要修改LibFuzzer的核心逻辑,只需要在你的fuzz目标代码里,对原始输入做一层过滤或调整,确保传递给toFuzz的是偶数长度的字符串:
#![no_main] use libfuzzer_sys::fuzz_target; // 假设你的toFuzz函数已经被正确引入 fn toFuzz(input: String) -> i32 { if input.len() % 2 == 1 { return 0; } // 核心逻辑... 1 } fuzz_target!(|data: &[u8]| { // 调整输入为偶数长度:如果是奇数,就截掉最后一个字节 let even_length_data = if data.len() % 2 == 1 { &data[..data.len()-1] } else { data }; // 转换成字符串(按需处理无效UTF-8的情况) if let Ok(input_str) = String::from_utf8(even_length_data.to_vec()) { toFuzz(input_str); } });
这种方式能确保所有进入toFuzz核心逻辑的输入都是偶数长度,完全跳过了无意义的长度检查分支测试,而且LibFuzzer会通过不断变异输入,覆盖各种偶数长度的场景,不会影响核心逻辑的测试深度。
方法2:自定义LibFuzzer的输入生成策略(进阶)
如果你想让LibFuzzer本身就只生成偶数长度的输入(而非事后调整),可以通过实现LibFuzzer的自定义变异/交叉接口来实现。不过这种方法需要编写C/C++代码(因为LibFuzzer的自定义接口是C语言的),再链接到你的Rust项目中,相对复杂一些:
- 实现
LLVMFuzzerCustomMutator函数,确保每次变异后的输入长度始终为偶数 - 实现
LLVMFuzzerCustomCrossOver函数,保证交叉生成的新输入长度也是偶数 - 在fuzz target中注册这些自定义函数
不过对于你的场景,方法1已经足够高效好用,没必要折腾进阶方案。
内容的提问来源于stack exchange,提问作者Sleik
相关产品推荐
相关产品推荐

