前面已经完成了第一步,安装 Raspberry OS。接下来是配置并编译 Linux 内核。

在raw-gadget 官方的github上有两种build 选择。一种是重新编译整个内核,第二种是通过 ”out-of-tree" 方式单独编译模块。我们在这一步先重新编译整个内核来开启 CONFIG_USB_RAW_GADGET。
building

安装必要的编译工具

sudo apt update
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

apt update
apt install

获取树莓派内核源码

运行 uname -r 查看内核版本,然后从官方github仓库克隆当前系统的内核分支。
uname -r
版本是6.12.47,所以克隆 rpi-6.12.y
git clone

生成默认配置

在开始配置前,需要为树莓派生成一个默认配置作为基础。相当于给内核编译提供一个起始配置文件,包含树莓派硬件所需的必要驱动和选项,在此基础上再添加 USB fuzzing 所需的额外选项,以确保编译出的内核能在树莓派上正常启动和运行。
我用的是树莓派5,烧录的64位系统,用 bcm2711_deconfig,可以进入内核源码目录查看有哪些现成的配置

cd linux
ls arch/arm64/configs/ | grep bcm

grep bcm
然后执行 make bcm2711_defconfig 生成默认配置
在这里插入图片描述

开启USB Fuzzing 所需的内核选项

运行配置菜单

make menuconfig

会看到一个蓝色的图形化配置界面,在这个界面依次找到一下三个配置并勾选。如果按下面路径找不到的话,可以按 / 键快速搜索,找到路径后再按路径选择进入即可。

1. 开启 Raw Gadget 支持:
Device Drivers -> USB support -> USB Gadget Support -> USB Gadget precomposed configurations -> USB Raw Gadget

USB Raw Gadget

2. 开启 Dummy HCD(虚拟主机控制器) 支持
Device Drivers -> USB support -> USB Gadget Support -> USB Peripheral Controller -> Dummy HCD

Dummy HCD

3. 开启代码覆盖率支持(KCOV),选择后下面出现的两个子选项可以一并勾选
Kernel hacking -> Kernel Testing and Coverage -> Code coverage for fuzzing

KCOV

配置完后回到主菜单,按两下 ESC 键退出,按提示保存配置。
save config

====================
踩过坑,所以想拉人一把。
这里一定要把另外这两个配置也一起配好了,不然后面用 syzkaller 跑的时候会一直报错 “coverage is not supported”,在这个问题上花了好多好多时间,最后在 google/syzkaller 的DeepWiki 里面问的 Devin 才知道的,然后又重新编译了一遍内核,真是没招了。
coverage is not supported

4. Disable KASLR
//KASLR can interfere with KCOV. It is recommended(and sometimes required) to disable it.
CONFIG_RANDOMIZE_BASE=n

disable KASLR

5. Check for CONFIG_DEBUG_INFO (for web UI coverage display)
//if coverage collection works but you can't see coverage reports in the web UI, you also need config below:
- Linux < 5.12: CONFIG_DEBUG_INFO=y
- Linux >=5.12: CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y

enable debug info

重新编译完再次跑 syzkaller 就不会报错找不到 /sys/kernel/debug/kcov 了。

kcov is ok

编译并安装新内核

现在开始编译新内核。使用 -j$(nproc) 参数调用所有CPU核心并行编译,加快速度。
可以选择备份下原内核 kernel8.img 和 配置文件 config.txt, cmdline.txt 先

make -j$(nproc)
sudo make modules_install
sudo cp arch/arm64/boot/Image /boot/firmware/kernel8.img
sudo reboot

编译:
make

安装模块到系统:
make modules_install

复制内核映像到启动分区:
cp kernel

重启生效:
reboot

这里我重启后查看 uname -a 发现没有跑新内核,跑的还是旧内核
然后查看 /boot/firmware 下面,存在两个kernel,一个是kernel2712.img,一个是我们新编译的 kernel8.img。现在跑的还是kernel2712.img,所以在config.txt 这里指定用 kernel8.img 跑
kernel2712
kernel8

再次重启,确认新内核已生效
newkernel

很好,第二步完成。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐