来自RustConf2021 03.陈鹏《从零开始实现Rust Fuzzer》
市面上一些比较热门的Fuzzer有:
- LibFuzzer
- AFL
- Honggfuzz
- OSS-Fuzz
- RustFuzz
- UrWeb
- OSS-Fuzz
用过程宏
加了下作者微信,相谈甚好,在上海,金桥那边住
不认为自己是搞安全的,而把自己定位为开发
给我推荐了一篇文章 G.O.S.S.I.P 阅读推荐 2023-11-08 Fuzz Anything
好多模糊测试都长年累月地跑着…github的action不给你白嫖,
如果是开源的,可以用谷歌的oss-fuzz
https://www.google.com.hk/search?q=ossfuzz&oq=ossfuzz
https://bughunters.google.com/open-source-security/oss-fuzz
推荐学习 Rust 2022 姜剑峰-复旦大学Rust API可靠性分析与验证
另外用
Cargo-Fuzz有什么作用?如何使用?举例说明
cargo-fuzz 是 Rust 语言的一个工具,用于进行模糊测试(fuzz testing)。模糊测试是一种自动化的软件测试技术,它通过向程序输入无效、意外或随机的数据来寻找程序中的错误、漏洞或未处理的异常情况。cargo-fuzz 是专为 Rust 项目设计的,能够很好地与 Rust 的包管理器和构建工具 Cargo 集成。
作用
- 自动化测试:自动地向程序输入各种异常数据,用于发现潜在的安全漏洞或程序崩溃的情况。
- 寻找内存安全漏洞:特别有效于寻找内存越界、空指针引用等问题。
- 集成开发流程:可以集成到持续集成 (CI) 流程中,以持续检测代码中的潜在问题。
如何使用
安装:
在项目中,你可以通过 Cargo 安装cargo-fuzz工具:1
cargo install cargo-fuzz
初始化 Fuzz 目标:
在 Rust 项目的根目录下,运行以下命令来初始化 fuzz 测试环境:1
cargo fuzz init
添加 Fuzz 目标:
添加一个 fuzz 目标,该目标指定了你想要进行模糊测试的代码部分。例如,如果你想测试一个名为parse的函数,你可以运行:1
cargo fuzz add parse
编写 Fuzz 测试:
在fuzz/fuzz_targets目录中会创建一个名为parse.rs的文件。你需要在这个文件中编写测试代码,如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use libfuzzer_sys::fuzz_target;
fuzz_target!(|data`cargo-fuzz` 是 Rust 语言的一个工具,用于进行模糊测试(fuzz testing)。模糊测试是一种自动化的软件测试技术,它通过向程序输入无效、意外或随机的数据来寻找程序中的错误、漏洞或未处理的异常情况。`cargo-fuzz` 是专为 Rust 项目设计的,能够很好地与 Rust 的包管理器和构建工具 Cargo 集成。
### 作用
1. **自动化测试**:自动地向程序输入各种异常数据,用于发现潜在的安全漏洞或程序崩溃的情况。
2. **寻找内存安全漏洞**:特别有效于寻找内存越界、空指针引用等问题。
3. **集成开发流程**:可以集成到持续集成 (CI) 流程中,以持续检测代码中的潜在问题。
### 如何使用
1. **安装**:
在项目中,你可以通过 Cargo 安装 `cargo-fuzz` 工具:
```bash
cargo install cargo-fuzz初始化 Fuzz 目标:
在 Rust 项目的根目录下,运行以下命令来初始化 fuzz 测试环境:1
cargo fuzz init
添加 Fuzz 目标:
添加一个 fuzz 目标,该目标指定了你想要进行模糊测试的代码部分。例如,如果你想测试一个名为parse的函数,你可以运行:1
cargo fuzz add parse
编写 Fuzz 测试:
在fuzz/fuzz_targets目录中会创建一个名为parse.rs的文件。你需要在这个文件中编写测试代码,如:1
2
3
4
5
6
7
8
9
use libfuzzer_sys::fuzz_target;
fuzz_target!(| &[u8]| {
// 这里是要测试的代码
if let Ok(str) = std::str::from_utf8(data) {
my_crate::parse(str);
}
});运行 Fuzz 测试:
运行 fuzz 测试来寻找漏洞:1
cargo fuzz run parse
示例
假设你有一个函数 my_crate::parse,它接受一个字符串并进行某种解析操作。你可以针对这个函数编写 fuzz 测试来确保它能够处理不同类型的输入,包括非法格式的数据,而不会崩溃。
以上步骤中的 fuzz_target! 宏定义了 fuzz 测试的入口,其中 datacargo-fuzz 是 Rust 语言的一个工具,用于进行模糊测试(fuzz testing)。模糊测试是一种自动化的软件测试技术,它通过向程序输入无效、意外或随机的数据来寻找程序中的错误、漏洞或未处理的异常情况。cargo-fuzz` 是专为 Rust 项目设计的,能够很好地与 Rust 的包管理器和构建工具 Cargo 集成。
作用
- 自动化测试:自动地向程序输入各种异常数据,用于发现潜在的安全漏洞或程序崩溃的情况。
- 寻找内存安全漏洞:特别有效于寻找内存越界、空指针引用等问题。
- 集成开发流程:可以集成到持续集成 (CI) 流程中,以持续检测代码中的潜在问题。
如何使用
安装:
在项目中,你可以通过 Cargo 安装cargo-fuzz工具:1
cargo install cargo-fuzz
初始化 Fuzz 目标:
在 Rust 项目的根目录下,运行以下命令来初始化 fuzz 测试环境:1
cargo fuzz init
添加 Fuzz 目标:
添加一个 fuzz 目标,该目标指定了你想要进行模糊测试的代码部分。例如,如果你想测试一个名为parse的函数,你可以运行:1
cargo fuzz add parse
编写 Fuzz 测试:
在fuzz/fuzz_targets目录中会创建一个名为parse.rs的文件。你需要在这个文件中编写测试代码,如:1
2
3
4
5
6
7
8
9
use libfuzzer_sys::fuzz_target;
fuzz_target!(| &[u8]| {
// 这里是要测试的代码
if let Ok(str) = std::str::from_utf8(data) {
my_crate::parse(str);
}
});运行 Fuzz 测试:
运行 fuzz 测试来寻找漏洞:1
cargo fuzz run parse
示例
假设你有一个函数 my_crate::parse,它接受一个字符串并进行某种解析操作。你可以针对这个函数编写 fuzz 测试来确保它能够处理不同类型的输入,包括非法格式的数据,而不会崩溃。
以上步骤中的 fuzz_target! 宏定义了 fuzz 测试的入口,其中 &[u8] 是每次迭代中由 fuzzer 生成的随机数据。你的任务是将这些数据转换成你的函数所期望的格式,并调用你的函数以测试其对异常输入的处理能力。
总的来说,cargo-fuzz 是 Rust 生态中一个重要的工具,它帮助开发者发现并修复潜在的安全问题,从而提高 Rust 程序的质量和健壮性。
原文链接: https://dashen.tech/2023/12/18/Rust生态中的Fuzzers/
版权声明: 转载请注明出处.