这是一篇 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)即可。

3. 应用环境变量
安装完成后,终端会提示你配置已生效,但当前终端窗口可能还没刷新。运行以下命令使其立即生效:
source "$HOME/.cargo/env"
验证安装是否成功:
rustc --version
cargo --version
如果能看到版本号(例如 rustc 1.83.0 ...),说明安装成功。

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 开发环境已经配置好了。

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

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 已经开启

检查安装
输入以下命令查看安装情况:
rustc --version
cargo --version
cargo fuzz --version
which llvm-symbolizer
如果没有报错,就可以开始 Fuzzing 了!可以去 crates.io 搜索感兴趣的 Rust 库进行测试。
