1. 背景/Background
最近在调试 CVE-2019-11477 漏洞的过程中,需要编译内核并使用 qemu 进行调试。结果发现数年前的操作步骤已不再适用,下面简单描述一下如何在 2019 年编译内核。
适用内核版本: 4.19
2. 操作流程/Procedure
2.1 编译参数/Compile Options
Makefile 里的编译参数默认 -O2 导致gdb调试出现:<optimized out>
方法1:改为 -O0 ==> 编译错误 (2019-12-04 update: 可以尝试只对单个函数进行编译优化的修饰,attribute((optimize("O0"))))
方法2:改为 -O1 ==> 无效
方法3:改为 -Og ==> 使用来自LWN的 patch,对 level4_kernel_pgt 进行修改
方法4:改为 -O1 -g3 ==> 未测试
2.2 内核启动参数/Kernel Cmdline
1.请勿启用KVM / do not use KVM: -enable-kvm
2.添加内核参数 / kernel cmdline: nokaslr
1 2 |
sudo qemu-system-x86_64 -s -S -smp 2 -m 1024M -nic bridge,model=e1000,br=br0 \ -kernel linux-4.19/arch/x86_64/boot/bzImage -initrd initrd.gz --append nokaslr |
2.3 如何制作一个精简的 initrd / Make an simple initrd
除了下面这种简单的制作initrd方法外,想快速获得一个可独立使用的 initrd 还可以直接借用 netboot initrd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/bin/bash # you have to install the static linked busybox, eg, apt install busybox-static mkdir -p rootfs/bin cd rootfs/bin # copy anything you like cp /bin/busybox ./ ln -s busybox sh cd .. echo -e "#!/bin/sh\nexec /bin/sh\n" > init chmod +x init find . | cpio -o -Hnewc | gzip > ../initrd.gz |
3. 参考
- How to compile Linux kernel with -O0 flag
- kernel hacking: GCC optimization for debug experience (-Og)
- Linux and FreeBSD Kernel: Multiple TCP-based remote denial of service issues
- TCP SACK PANIC - Kernel vulnerabilities - CVE-2019-11477
- 关于Linux编译优化几个必须掌握的姿势
- http://ftp.debian.org/debian/dists/buster/main/installer-amd64/current/images/netboot/debian-installer/amd64/
请问2.1的方法3,这个patch如何使用?