Rust生态中的Fuzzers

来自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 集成。

作用

  1. 自动化测试:自动地向程序输入各种异常数据,用于发现潜在的安全漏洞或程序崩溃的情况。
  2. 寻找内存安全漏洞:特别有效于寻找内存越界、空指针引用等问题。
  3. 集成开发流程:可以集成到持续集成 (CI) 流程中,以持续检测代码中的潜在问题。

如何使用

  1. 安装
    在项目中,你可以通过 Cargo 安装 cargo-fuzz 工具:

    1
    cargo install cargo-fuzz
  2. 初始化 Fuzz 目标
    在 Rust 项目的根目录下,运行以下命令来初始化 fuzz 测试环境:

    1
    cargo fuzz init
  3. 添加 Fuzz 目标
    添加一个 fuzz 目标,该目标指定了你想要进行模糊测试的代码部分。例如,如果你想测试一个名为 parse 的函数,你可以运行:

    1
    cargo fuzz add parse
  4. 编写 Fuzz 测试
    fuzz/fuzz_targets 目录中会创建一个名为 parse.rs 的文件。你需要在这个文件中编写测试代码,如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
       #![no_main]
    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
  5. 初始化 Fuzz 目标
    在 Rust 项目的根目录下,运行以下命令来初始化 fuzz 测试环境:

    1
    cargo fuzz init
  6. 添加 Fuzz 目标
    添加一个 fuzz 目标,该目标指定了你想要进行模糊测试的代码部分。例如,如果你想测试一个名为 parse 的函数,你可以运行:

    1
    cargo fuzz add parse
  7. 编写 Fuzz 测试
    fuzz/fuzz_targets 目录中会创建一个名为 parse.rs 的文件。你需要在这个文件中编写测试代码,如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #![no_main]
    use libfuzzer_sys::fuzz_target;

    fuzz_target!(| &[u8]| {
    // 这里是要测试的代码
    if let Ok(str) = std::str::from_utf8(data) {
    my_crate::parse(str);
    }
    });
  8. 运行 Fuzz 测试
    运行 fuzz 测试来寻找漏洞:

    1
    cargo fuzz run parse

示例

假设你有一个函数 my_crate::parse,它接受一个字符串并进行某种解析操作。你可以针对这个函数编写 fuzz 测试来确保它能够处理不同类型的输入,包括非法格式的数据,而不会崩溃。

以上步骤中的 fuzz_target! 宏定义了 fuzz 测试的入口,其中 datacargo-fuzz 是 Rust 语言的一个工具,用于进行模糊测试(fuzz testing)。模糊测试是一种自动化的软件测试技术,它通过向程序输入无效、意外或随机的数据来寻找程序中的错误、漏洞或未处理的异常情况。cargo-fuzz` 是专为 Rust 项目设计的,能够很好地与 Rust 的包管理器和构建工具 Cargo 集成。

作用

  1. 自动化测试:自动地向程序输入各种异常数据,用于发现潜在的安全漏洞或程序崩溃的情况。
  2. 寻找内存安全漏洞:特别有效于寻找内存越界、空指针引用等问题。
  3. 集成开发流程:可以集成到持续集成 (CI) 流程中,以持续检测代码中的潜在问题。

如何使用

  1. 安装
    在项目中,你可以通过 Cargo 安装 cargo-fuzz 工具:

    1
    cargo install cargo-fuzz
  2. 初始化 Fuzz 目标
    在 Rust 项目的根目录下,运行以下命令来初始化 fuzz 测试环境:

    1
    cargo fuzz init
  3. 添加 Fuzz 目标
    添加一个 fuzz 目标,该目标指定了你想要进行模糊测试的代码部分。例如,如果你想测试一个名为 parse 的函数,你可以运行:

    1
    cargo fuzz add parse
  4. 编写 Fuzz 测试
    fuzz/fuzz_targets 目录中会创建一个名为 parse.rs 的文件。你需要在这个文件中编写测试代码,如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #![no_main]
    use libfuzzer_sys::fuzz_target;

    fuzz_target!(| &[u8]| {
    // 这里是要测试的代码
    if let Ok(str) = std::str::from_utf8(data) {
    my_crate::parse(str);
    }
    });
  5. 运行 Fuzz 测试
    运行 fuzz 测试来寻找漏洞:

    1
    cargo fuzz run parse

示例

假设你有一个函数 my_crate::parse,它接受一个字符串并进行某种解析操作。你可以针对这个函数编写 fuzz 测试来确保它能够处理不同类型的输入,包括非法格式的数据,而不会崩溃。

以上步骤中的 fuzz_target! 宏定义了 fuzz 测试的入口,其中 &[u8] 是每次迭代中由 fuzzer 生成的随机数据。你的任务是将这些数据转换成你的函数所期望的格式,并调用你的函数以测试其对异常输入的处理能力。

总的来说,cargo-fuzz 是 Rust 生态中一个重要的工具,它帮助开发者发现并修复潜在的安全问题,从而提高 Rust 程序的质量和健壮性。