如何检测运行时是否启用或禁用了KASLR?
发布于 2016-03-04 20:29:47
检查内核命令行。(以debian 8为例)
$ cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-`uname -r` root=/dev/mapper/`hostname`-root ro quiet
kASLR是可用的,从Ubuntu14.10开始,但默认情况下不启用它。在内核命令行上指定使用kASLR的"kaslr“选项。注意:启用kASLR将禁用进入休眠模式的能力。
发布于 2018-03-31 20:38:26
回答以下问题:
$ 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
发布于 2020-08-06 17:02:48
我对前面的答案并不满意,因为它们确实无法验证KASLR到底是什么--特别是不实现相同内核命令行接口的嵌入式或自定义内核(例如,ARM64需要在内核启动时出现一个名为kaslr-seed的设备树节点。这通常由引导器使用安全的随机数生成器实现)。
在运行时,我知道有两件事您可以检查:
/proc/kallsyms
文件。lsmod
来查看虚拟内存地址空间中的内核模块地址。注意:在某些机器上,lsmod
可能不显示地址。在这种情况下,尝试使用cat /proc/modules
作为根用户。如果不使用根,则地址可能为所有零(出于安全原因被清除)。感谢用户@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已启用。
您可以迭代地进行这些测试,以确定随机性的质量。跨重新引导的地址有多大不同?有明显的模式吗?KASLR的安全效益与随机性或熵的质量成正比。
参考文献:
https://askubuntu.com/questions/704640
复制相似问题