题目定为:基于模糊测试的 RISC-V SBI 系统测试框架研究。

内容大概是使用 AFL++ 对 RustSBI 进行 fuzzing,能跑起来就是成功!

2025/3/1

尝试在 macOS 上编译 AFL++,但是发现没法支持 QEMU mode,mac 的兼容性还是差点,最后还是转到 VMWare Ubuntu 22.04。

把项目克隆下来,直接编译: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,感觉非常符合要求。

文档:https://intel.github.io/tsffs/