这是一篇 Fuzzing 日记,记录如何在 Windows 下使用 WSL2 虚拟机安装 cargo-fuzz 工具链。

使用环境:Windows 11 (WSL2)、Ubuntu 24.04 LTS

工具:cargo-fuzz

cargo-fuzz 需要在 Linux 环境下运行,所以需要先在 Windows 中安装 WSL2 虚拟机,网上有很多教程。

虚拟机

1. 安装必要的系统依赖

Rust 编译需要 C 语言的链接器(Linker)。在安装 Rust 之前,请确保系统已安装基础构建工具。打开 Ubuntu 24.04 LTS 并运行:

sudo apt update
sudo apt install build-essential

2. 配置环境变量并安装 Rust

我们需要先告诉安装脚本去国内镜像站下载 Rust,而不是去国外的官网。这里使用字节跳动的 Rsproxy 镜像。

设置镜像源:

export RUSTUP_DIST_SERVER="https://rsproxy.cn"
export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup"

安装 Rust:

curl --proto '=https' --tlsv1.2 -sSf https://rsproxy.cn/rustup-init.sh | sh

安装过程中,脚本会询问安装选项,通常直接按回车键(选择 1)即可。

enter

3. 应用环境变量

安装完成后,终端会提示你配置已生效,但当前终端窗口可能还没刷新。运行以下命令使其立即生效:

source "$HOME/.cargo/env"

验证安装是否成功:

rustc --version
cargo --version

如果能看到版本号(例如 rustc 1.83.0 ...),说明安装成功。

rust

4. 配置 Cargo 镜像源

虽然 Rust 装好了,但如果不配置 Cargo 镜像,以后下载第三方库时依然会很慢。我们需要修改 ~/.cargo/config.toml 文件。

创建/编辑文件:

mkdir -p ~/.cargo
nano ~/.cargo/config.toml

粘贴以下内容(字节跳动 Rsproxy 源):

[source.crates-io]
replace-with = 'rsproxy-sparse'
[source.rsproxy]
registry = "https://rsproxy.cn/crates.io-index"
[source.rsproxy-sparse]
registry = "sparse+https://rsproxy.cn/index/"
[registries.rsproxy]
index = "https://rsproxy.cn/crates.io-index"
[net]
git-fetch-with-cli = true

保存并退出(Ctrl+O -> 回车 -> Ctrl+X)。

5. 测试 Rust 环境

创建一个新项目来测试:

cargo new hello_rust
cd hello_rust
cargo run

如果能迅速看到 Hello, world! 的输出,说明 Rust 开发环境已经配置好了。

hello

6. 安装 Rust Nightly 工具链

Fuzzing 和 Sanitizer 需要用 Nightly 版本。

rustup toolchain install nightly
rustup default nightly

7. 添加必要的组件

开启 ASan 需要重新编译 Rust 的标准库,因为官方预编译的标准库没有开启 Sanitizer 插桩。所以要下载标准库源码:

rustup component add rust-src

8. 安装 cargo-fuzz

请确保你已经配置好了 ~/.cargo/config.toml 的国内镜像源,否则编译依赖时会很慢。

cargo install cargo-fuzz

cargo

9. 安装 LLVM 工具

ASan 发现内存错误时,需要把内存地址翻译成代码行号(这就叫 Symbolize)。如果没有这个工具,报错信息就是一堆十六进制地址,很难看懂。

sudo apt update
sudo apt install llvm

安装后系统会自动提供 llvm-symbolizer 命令。可以验证一下:

llvm-symbolizer --version

10. 验证环境

跑一个 Demo 确认环境配置正确。

新建一个项目:

cargo new fuzz_demo
cd fuzz_demo

初始化 Fuzzing:

cargo fuzz init

这会生成一个 fuzz 文件夹。

运行 Fuzzing(自动开启 ASan):

cargo fuzz run fuzz_target_1

如果你看到终端滚动,显示 fuzzing: ... exec/s: ...,说明:

  • Nightly 编译器可以工作正常
  • cargo-fuzz 正常运行
  • ASan 已经开启

run

检查安装

输入以下命令查看安装情况:

rustc --version
cargo --version
cargo fuzz --version
which llvm-symbolizer

如果没有报错,就可以开始 Fuzzing 了!可以去 crates.io 搜索感兴趣的 Rust 库进行测试。

crates