#fuzzing #bevy #input-event #mouse-button

bevy_fuzz

针对bevy系统的实验性高性能模糊测试,模拟用户UI交互

2个版本

0.0.2 2022年1月22日
0.0.1 2022年1月21日

#364 in 测试

MIT许可证

50KB
1K SLoC

bevy_fuzz   构建状态 最新版本 文档版本

针对bevy系统的基于代码覆盖率的高性能模糊测试,模拟用户UI交互。该插件通过构造并发送随机输入事件到应用

目的是找到产生崩溃的用户交互组合。该包使用cargo-fuzz作为Rust前端,它本身使用libFuzzer来运行模糊测试。

模糊测试是智能的,它试图找到尽可能覆盖更多代码空间的输入。目前捕获/模糊测试的输入

  • bevy_input / mouse / MouseButtonInput
  • bevy_input / mouse / MouseWheel
  • bevy_input / mouse / MouseMotion
  • bevy_input / keyboard / KeyboardInput
  • bevy_window / CursorMoved
  • bevy_window / WindowResized

快速入门

运行集成示例

安装所需工具(cargo-fuzz

cargo install cargo-fuzz

克隆仓库并进入示例目录

git clone https://github.com/blaind/bevy_fuzz.git
cd bevy_fuzz/examples/fuzzed_bevy_app

以输入记录模式运行应用。它将显示一个灰色窗口,尝试按下各种键,包括键A。你应该在控制台中看到键A的输出。

cargo run --features fuzz -- record

这将生成一个名为input-recording.bin的文件。将文件复制到模糊测试语料库目录

mkdir -p fuzz/corpus/fuzz_target_1/
cp input-recording.bin fuzz/corpus/fuzz_target_1/

运行模糊测试器。目前,-s none(sanitizer = none)是一个重要的构建开关。这将使用LLVM指令重新编译应用。模糊测试编译比标准编译慢。

cargo fuzz run -s none fuzz_target_1 -- -detect_leaks=0 -rss_limit_mb=8192

最终,它应该崩溃,因为模糊测试器找到了一个按键Z(故意引发恐慌)。输出应类似于

WARNING: Failed to find function "__sanitizer_acquire_crash_state".
WARNING: Failed to find function "__sanitizer_print_stack_trace".
WARNING: Failed to find function "__sanitizer_set_death_callback".
INFO: Running with entropic power schedule (0xFF, 100).
INFO: Seed: 1184633377
INFO: Loaded 1 modules   (979081 inline 8-bit counters): 979081 [0x55a818b8d889, 0x55a818c7c912),
INFO: Loaded 1 PC tables (979081 PCs): 979081 [0x55a818c7c918,0x55a819b6d1a8),
INFO:      848 files found in bevy_fuzz/examples/fuzzed_bevy_app/fuzz/corpus/fuzz_target_1
INFO: -max_len is not provided; libFuzzer will not generate inputs larger than 4096 bytes
INFO: seed corpus: files: 848 min: 32b max: 1346b total: 815506b rss: 68Mb
#256	pulse  cov: 3603 ft: 9014 corp: 216/89Kb exec/s: 128 rss: 74Mb
'A' currently pressed
'A' just pressed
(presses repeated)
thread '<unnamed>' panicked at ''Z' pressed - causes panic!', bevy_fuzz/examples/fuzzed_bevy_app/src/lib.rs:48:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
==3696259== ERROR: libFuzzer: deadly signal
NOTE: libFuzzer has rudimentary signal handlers.
    Combine libFuzzer with AddressSanitizer or similar for better crash reports.
SUMMARY: libFuzzer: deadly signal
MS: 0 ; base unit: 0000000000000000000000000000000000000000

输出还将打印出导致崩溃的二进制序列。您可以使用以下方式重新运行崩溃的工件

A. 提供的主包装器(更快,更受欢迎)

cargo run --features fuzz apply fuzz/artifacts/fuzz_target_1/crash-[filename]

B. 货物模糊(较慢)

cargo fuzz run --sanitizer=none fuzz_target_1 fuzz/artifacts/fuzz_target_1/crash-[filename]

注意!如果上述命令无法重现崩溃,则运行不是确定的。目前难以调试,请提交问题。可能的原因之一是您在 .insert_resourcePlugin 构建器 fn build(&self, app: &mut App) 中。目前这些资源无法为每次运行重置 - 您应将它们移动到启动系统中。

通常尝试最小化崩溃也是好的

cargo fuzz tmin --sanitizer=none fuzz_target_1 fuzz/artifacts/fuzz_target_1/crash-[filename]

集成到自己的应用中

说明即将到来。目前,请参阅examples/fuzzed_bevy_app 示例。

其他资源

https://rust-fuzz.github.io/book/introduction.html

许可证

根据您的要求,许可方式为以下两种之一

任选其一。

贡献

除非您明确声明,否则您提交的任何旨在包含在软件中的贡献,根据 Apache-2.0 许可证的定义,将按上述方式双重许可,不附加任何其他条款或条件。

依赖项

~17–34MB
~534K SLoC