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 文本处理
974 每月下载量
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