#input-file #broken #testing #fuzzer #fuzzing #random #error

app create_broken_files

从其他文件创建损坏的文件

5个稳定版本

3.1.0 2024年7月21日
3.0.1 2023年9月4日
3.0.0 2023年8月28日
2.0.0 2023年3月14日
1.0.0 2021年8月3日

#63 in 文本处理

Download history 183/week @ 2024-05-01 182/week @ 2024-05-08 180/week @ 2024-05-15 182/week @ 2024-05-22 298/week @ 2024-05-29 487/week @ 2024-06-05 296/week @ 2024-06-12 532/week @ 2024-06-19 638/week @ 2024-06-26 307/week @ 2024-07-03 487/week @ 2024-07-10 382/week @ 2024-07-17 306/week @ 2024-07-24 181/week @ 2024-07-31 214/week @ 2024-08-07 188/week @ 2024-08-14

974 每月下载量

MIT 许可证

19KB
324

unwrap# 创建损坏文件 此应用程序从有效文件生成损坏文件。

在模糊测试解析器/应用程序(如image-rs(加载图像)、ruff(解析和检查Python文件)或godot(加载模型/图像)]时很有用。

典型的模糊器工作流程

  • 将模糊器集成到可以接收数据的组件中
  • 运行模糊器
  • 等待崩溃/无效内存使用

这种方法一开始相当不错,因为像libfuzzer这样的模糊器在测试非常小的输入时非常快。对于只有更大和特定输入时发生的问题,这些工具很少可用。据我所知,它们通常测试这样的输入 - 3个空格、150个斜杠和20个逗号的所有可能组合 - 这些几乎从未在程序中使用(这当然并不意味着这样的错误不会发生并且不应该被修复)。
但是无论如何,在运行此应用程序之前运行模糊器,以找到相当小的重现项目(模糊器在最小化崩溃的输入方面非常出色)是很好的。

创建损坏文件工作流程

  • 准备不同的有效输入文件(如果您想测试3D模型导入器,则准备扩展名为[fbx, dae, gltf]的文件,如果图像导入器,则准备扩展名为[jpg, png, gif]的文件等。)
  • 运行此应用程序 - 这将创建大量损坏文件
  • 运行您的脚本/应用程序以导入损坏的文件(如果可能,请运行清理器)并等待崩溃

使用cargo-fuzz(典型的模糊器构建在libFuzzer之上)测试ruff后,经过2小时的检查(主要是字符+一些随机字节),我发现1个崩溃和1个错误(我在日志中找到的)。

此应用程序加脚本在30分钟内几乎找到了60个错误和崩溃(脚本不区分它们) - 其中一些可能是重复的,尚未报告。

它是如何如此之好的?

我注意到,在正常模糊器的情况下,单次运行的代码覆盖率非常小,几乎永远不可能在合理的时间内测试大量代码。

正确的文件可以顺利通过大部分代码,因此,在解析一个轻微损坏的文件时,其微小的损坏可能会让你通过代码的大部分内容,只有在这种情况下才能测试代码深处嵌套的错误处理,这对于一个普通的模糊测试工具来说可能需要数百万年才能到达。

模式

应用程序包含两种模式 - 二进制/utf-8

在二进制模式下,应用程序允许

  • 修改随机字节的值
  • 在文件的随机位置拆分内容
  • 移除随机字节

在UTF-8模式下,一切都在字符级别上工作,因此默认情况下速度较慢,但允许

  • 修改随机字符的值
  • 在字符之间随机位置拆分文件内容
  • 移除随机字符
  • 向文本中添加随机单词 - 尤其适用于测试语言解析器,例如在 ruff 中,它测试Python,我添加了这些单词以增加崩溃 - "False" "await" "else" "import" "pass" "None" "break" "except" "in" "raise" " True" "class" "finally" "is" "return" "and" "continue" "for" "lambda" "try" "as" "def" "from" "nonlocal" "while" " assert" "del" "global" "not" "with" "async" "elif" "if" "or" "yield" "__init __" ":" "?" "[" """ "'" "]" "}" "{" "|" "\" ";" "_" "-" "**" "*" "/" "!"

如果输入文件开头只包含utf-8字符,则在此模式下输出文件也应只包含它们。

使用方法

开始时只需安装它

cargo install create_broken_files

使用方法

create_broken_files --input-path <INPUT> --output-path <OUTPUT> --number-of-broken-files <NUMBER> [--character-mode <IS_CHARACTER_MODE>] [--special-words <WORDS>]
  • input-path - 要使用的文件夹或文件的输入路径(只检查深度为1的文件夹)
  • output-path - 生成文件将被放置的路径
  • number-of-broken-files - 从一个输入文件生成的文件数量(实际数字可能略慢)
  • character-mode - c - [可选,默认值=false] 如果 true 则将模式更改为utf-8(如上所述)
  • special-words - s - [可选,默认值=[]],仅在字符模式下工作,将提供的随机单词添加到文件中
  • connect_multiple_files - m - [可选,默认值=false],如果 true 则将在当前文件末尾添加一些文件

示例(长名称的简短版本可用)

create_broken_files -i /home/rafal/inputs -o /home/pli -n 1000
create_broken_files -i /home/rafal/Desktop/22.txt -o /home/rafal/Desktop/33 -n 10 -c -m -s "False" "await" "else"

依赖项

~3.5MB
~66K SLoC