ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ladybird 如何本地构建并运行 libFuzzer 模糊测试器(含语料库与并行参数)

Ladybird 如何本地构建并运行 libFuzzer 模糊测试器(含语料库与并行参数) Ladybird 如何本地构建并运行 libFuzzer 模糊测试器含语料库与并行参数【免费下载链接】ladybirdTruly independent web browser项目地址: https://gitcode.com/GitHub_Trending/la/ladybird如果你想对 LadybirdLagom 代码库的解析器、图像解码器、正则表达式等模块做模糊测试可以在本地完成整条链路用Meta/Fuzzers下的脚本构建 libFuzzer 版本的 fuzzer给它一个语料文件corpus作为初始输入再按需并行多个 job最后把崩溃用例在本地复现并进入 gdb 定位。本文按这条路径组织依据是仓库内 Meta/Fuzzers/README.md 和 Meta/Fuzzers/BuildFuzzers.sh。环境要求必须使用 clangfuzzer 构建要求使用clang因此官方做法是用一个独立的构建目录而不是复用日常构建目录。本地 libFuzzer 构建还会自动启用 Address Sanitizer见 Meta/Fuzzers/CMakeLists.txt 中ENABLE_FUZZERS_LIBFUZZER分支给链接器追加的-fsanitizeaddress。版本要求上存在一个文档间的不一致执行前需要知道Meta/Fuzzers/README.md 写的是require clang 14但脚本实际调用的编译器探测逻辑 Meta/Utils/find_compiler.py 中CLANG_MINIMUM_VERSION 19且BuildFuzzers.sh以--clang-only模式调用它只接受 clang不接受 GCC。以实际生效的探测脚本为准本机准备 clang 19 及以上版本即可。脚本按以下顺序搜索候选Linux/BSD 下clang、clang-19clang-22以及/usr/local/bin下的同名可执行文件macOS 额外搜索 Homebrew 路径。注意 macOS 上 LLVM 21 会被主动跳过与系统 libc 存在链接问题见find_compiler.py中的注释。构建 libFuzzer 版本的 fuzzer在仓库根目录执行./Meta/Fuzzers/BuildFuzzers.sh不带参数即进入local fuzz configuration分支。脚本会先通过pick_host_compiler --clang-only选好CC/CXX然后执行cmake -S 仓库根目录 -GNinja --preset Fuzzers -B 仓库根目录/Build/lagom-fuzzers \ -DCMAKE_C_COMPILER${CC} \ -DCMAKE_CXX_COMPILER${CXX} ninja -C 仓库根目录/Build/lagom-fuzzers构建产物在Build/lagom-fuzzers/下每个 fuzzer 一个可执行文件。可用的 fuzzer 列表定义在 Meta/Fuzzers/fuzzers.cmake 的FUZZER_TARGETS中命名规则是Fuzz前缀加目标名例如FuzzJs依赖 LibJS/LibGCFuzzBMPLoader、FuzzPNGLoader、FuzzGIFLoader、FuzzICOLoader图像解码FuzzRegexECMA262、FuzzJsonParser、FuzzXML、FuzzURLFuzzWasmParser、FuzzMatroskaReader、FuzzASN1、FuzzPEM、FuzzRSAKeyParsing等FuzzCSSParser仅当LibWeb目标存在时追加如果需要调整 fuzzing 构建的 CMake 缓存README 给出的示例cmake -B Build/fuzzers -S . -DENABLE_LAGOM_CCACHEOFF运行单个 fuzzer./Build/lagom-fuzzers/FuzzSomething其中FuzzSomething替换为上面列表中的任意 fuzzer 名。两点注意所有 fuzzing 结果慢输入 slow inputs、崩溃 crash 等都会输出到当前所在目录运行前建议在专门的工作目录里执行LLVM libFuzzer 的帮助接口比较特殊必须用-help1查看帮助--help和-help都会被忽略。给 fuzzer 一个语料库corpusREADME 明确建议提供语料后再跑效果明显更好。文档示例命令BMP 解码器语料来自仓库内测试素材./Fuzzers/FuzzBMPLoader ../Base/res/html/misc/bmpsuite_files/rgba32-61754.bmp该路径是 README 给出的示例若你本地的检出中Base/res/html/misc/目录不存在把语料换成你自己本地的一份对应类型文件即可BMP fuzzer 给 BMP 文件、PNG fuzzer 给 PNG 文件以此类推。README 同时提醒LLVM 在运行中还会不断在当前目录创建新文件新生成的语料、覆盖计数文件等不要盲目把它们提交回仓库。并行运行与日志控制同时跑多个 fuzz job 时给 fuzzer 追加-jobs24 -workers24即并行 24 个 job、24 个 worker数值按本机核心数自行调整。减少日志输出-close_fd_mask3注意-close_fd_mask3会同时隐藏断言assertion消息如果只想关掉 stdout 输出用1。README 还建议把过于频繁的日志输出放到FOO_DEBUG宏后面但这属于改源码的范畴不是运行的必需步骤。可选分支构建无插桩的 standalone 版本如果不需要 libFuzzer 和 ASan 插桩给脚本传--standalone./Meta/Fuzzers/BuildFuzzers.sh --standalone ./Build/lagom-fuzzers-standalone/Fuzzers/FuzzSomething 输入文件名standalone 二进制的行为是从给定的文件名不传文件名则从 stdin读取单个测试输入处理完即退出。适合手动回归某个具体输入不适合持续模糊。另外 README 说明其他 fuzzer 引擎也可以使用OSS-Fuzz 构建即为例证通常需要在 CMake 第二阶段或环境变量中设置CFLAGS/CXXFLAGS。复现与定位崩溃拿到崩溃用例文件如crash-27480a219572aa5a11b285968a3632a4cf25388e文件名为文档示例格式后直接把它作为参数传给 fuzzer 即可复现MyFuzzer crash-27480a219572aa5a11b285968a3632a4cf25388e要在 gdb 里复现需要禁用 fuzzer 自身的信号处理器让 gdb 看到真正的崩溃点README 给出的示例针对FuzzBMP$ gdb ./Fuzzers/FuzzBMP ... SNIP some output ... (gdb) run -handle_abrt0 -handle_segv0 crash-27480a219572aa5a11b285968a3632a4cf25388e ... SNIP some output ... FuzzBMP: ../../Libraries/LibGfx/Bitmap.cpp:84: Gfx::Bitmap::Bitmap(Gfx::BitmapFormat, const Gfx::IntSize , Gfx::Bitmap::Purgeable): Assertion m_data m_data ! (void*)-1 failed. Thread 1 FuzzBMP received signal SIGABRT, Aborted. __GI_raise (sigsigentry6) at ../sysdeps/unix/sysv/linux/raise.c:50 (gdb)以上输出为文档示例用于说明复现成功时的形态不是每次都会出现的固定日志。两个与栈回溯相关的已知问题均来自 READMEUBSan 不一定给出有用信息可设置export UBSAN_OPTIONSprint_stacktrace1让栈回溯始终打印若出现WARNING: invalid path to external symbolizer!/Failed to use and restart external symbolizer!说明找不到llvm-symbolizer可执行文件它可能在你系统的llvm包里版本号后缀的llvm-symbolizer-11这类命名不会被识别。边界与限制本地构建与 OSS-Fuzz 持续构建是两条不同路径本文只覆盖BuildFuzzers.sh的本地分支无参数与--standalone分支--oss-fuzz分支依赖 OSS-Fuzz 容器内的$OUT、$LIB_FUZZING_ENGINE等环境变量不在本地流程内使用。fuzzer 的结果文件落在当前目录且数量会持续增长README 建议不要盲目提交对有趣的边缘用例的长期存放README 将其放在仓库之外的独立语料库仓库中处理本地仓库内不需要维护这些文件。编译版本要求以 Meta/Utils/find_compiler.py 为准clang 19与 README 中 clang 14 的表述存在出入构建失败时先核对这一点。【免费下载链接】ladybirdTruly independent web browser项目地址: https://gitcode.com/GitHub_Trending/la/ladybird创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表