题目定为:基于模糊测试的 RISC-V SBI 系统测试框架研究。
内容大概是使用 AFL++ 对 RustSBI 进行 fuzzing,能跑起来就是成功!
2025/3/1
尝试在 macOS 上编译 AFL++,但是发现没法支持 QEMU mode,mac 的兼容性还是差点,最后还是转到 VMWare Ubuntu 22.04。
- AFL++官网:https://aflplus.plus/
- 编译指南:https://github.com/AFLplusplus/AFLplusplus/blob/stable/docs/INSTALL.md
- AFL++ GitHub:https://github.com/AFLplusplus/AFLplusplus
把项目克隆下来,直接编译:make distrib
。编译前需要把梯子弄好,中途会克隆很多子仓库。
—
编译的过程中竟然出现了 Cargo?可是看了一眼 AFL++ 的仓库它并没有用 Rust 啊?那 Cargo 是哪里来的?
找了一下发现,原来是 libnyx 这个库是 Rust 写的。https://github.com/nyx-fuzz/libnyx
libnyx 是一个用于模糊测试(Fuzzing)的库,专门为基于快照的模糊测试(Snapshot-based Fuzzing)设计。它通常与 Nyx 模糊测试框架一起使用。
2025/3/3
研究了一下感觉黑盒测试相对白盒测试更简单。但是 rustsbi 的输入是通过系统调用的方式,如何生成合适的输入是一个很关键的问题。
AFL入门视频:https://www.bilibili.com/video/BV1ZM4m1R7gZ
AFL 在会调用系统的编译器将源代码编译成汇编,然后调用自己的链接器在汇编阶段进行插桩,然后链接。
最花时间的是项目编译:
- 缺失引用的第三方库
- 编译过程中的各种错误
- 不同项目不同的编译方法与各种选项
Address Sanitizer
通过在已分配的内存周围分配污染的内存,以检测内存泄漏。
对于堆上的内存,会使用自己的分配实现来替换默认的实现,以将分配的内存分开。
对于栈上的内存,直接分开分配内存。
CPU 减速在 3-5 倍,内存使用增加 2-3 倍。
目前看到的教程都是对直接有直接输入的程序进行 fuzzing,但是 sbi 是一个等待输入的程序,或许需要使用 qemu 模式?
—
AFL 指令中的 @@
是用来代表生成的测试用例的占位符,给需要测试的程序传入数据。
2025/3/6
找到了一些新的东西:
- LibAFL:一个模糊测试库,提供了对虚拟机、覆盖率等操作的 rust 函数
- Syzkiller:Google 开发的一个内核 fuzzer,能够生成 syscall
- 内核fuzz工具Syzkaller使用方法的简单介绍
- TSFFS: 一个基于 simics 的 fuzzer,针对 UEFI、bootloader、BIOS、内核模块或者设备驱动。
- simics 可以用来模拟 riscv,所以似乎可以使用这个?
有一个很大的问题是,如何获得 rustsbi 的代码覆盖率,这对 fuzzer 是非常关键的。
2025/3/7
研究了一下 TSFFS,是一个用 LibAFL 和 Rust 写的基于 Simics 的 fuzzer,感觉非常符合要求。