如何在运行时检测KASLR是否启用或禁用?
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.14.27-041427-generic root=UUID=f3f8e7bc-b337-4194-88b8-3a513f6be55b ro quiet splash loglevel=0 vga=current udev.log-priority=3 fastboot kaslr acpiphp.disable=1 crashkernel=384M-2G:128M,2G-:256M vt.handoff=7
/proc/kallsyms
文件,可以查看虚拟内存地址空间中的符号地址。lsmod
命令。 注意:在某些机器上,lsmod
可能不显示地址。在这种情况下,请尝试以root身份使用cat /proc/modules
命令。如果不使用root,则地址可能全部为零(出于安全原因而清除)。~~感谢用户@crass的评论!~~/proc/kallsyms
的前几行即可:root@device:~# head -n 3 /proc/kallsyms
ffffff8008080000 t _head
ffffff8008080000 T _text
ffffff8008080800 T do_undefinstr
_head
的地址是 ffff ff80 0808 0000
。root@device:~# head -n 3 /proc/kallsyms
ffffff9fc8c80000 t _head
ffffff9fc8c80000 T _text
ffffff9fc8c80800 T do_undefinstr
_head
的地址现在是ffff ff9f c8c8 0000
。ffffff80080 != 0xffffff9fc8c
,因此地址在重新启动时发生了变化 => KASLR已启用。
/proc/kallsyms
方法类似:检查lsmod,重新启动,再次检查lsmod,并比较地址。root@device:~# lsmod
iptable_filter 16384 0 - Live 0xffffffa1c49b9000
ip_tables 28672 1 iptable_filter, Live 0xffffffa1c49ad000
iptable_filter
的地址是 ffff ffa1 c49b 9000
。root@device:~# lsmod
iptable_filter 16384 0 - Live 0xffffff2100716000
ip_tables 28672 1 iptable_filter, Live 0xffffff210070a000
iptable_filter
的地址现在是ffff ff21 0071 6000
。
比较高位字节并发现ffffff2100716 != 0xffffffa1c49b9
,因此地址在重新启动时被修改了 => KASLR已启用。$ cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-`uname -r` root=/dev/mapper/`hostname`-root ro quiet
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-5.2.0-42-generic root=/dev/sda1 ro vt.handoff=7
sudo qemu-system-x86_64 -m 1024 -kernel /boot/vmlinuz-5.2.0-42-generic \
-append "$(cat /proc/cmdline) break=top" -initrd /boot/initrd.img-5.2.0-42-generic
(initramfs) cat /proc/modules
usbhid 57344 0 - Live 0xffffffffc0269000
hid 131072 1 usbhid, Live 0xffffffffc0248000
sudo grep hid /proc/modules
hid_generic 16384 0 - Live 0xffffffffc20ac000
usbhid 57344 0 - Live 0xffffffffc1a09000
hid 131072 2 hid_generic,usbhid, Live 0xffffffffc1c96000
0xffffffffc1c96000
和虚拟:0xffffffffc0248000
)。所以我的内核正在运行kASLR,尽管它没有在内核命令行上(现在某些发行版默认开启)。qemu
实例中再次检查模块地址,并验证每次运行qemu
时模块地址的变化。此外,您可以将nokaslr
添加到内核命令行(-append
qemu
选项),并运行qemu
几次以验证模块地址不会改变。
lsmod
命令不会显示模块的地址。但是,如果以root权限使用cat /proc/modules
命令,则可以看到这些地址。如果没有使用root权限,这些地址可能会全部显示为零(出于安全考虑而被清除)。 - crass