KASLR 的实现细节取决于 CPU 架构(x86、ARM、ARM64、PowerPC 等),所以我不能说你是否正确配置它,但在运行时我知道两件事你可以检查:
-
/proc/kallsyms 文件以查看虚拟内存地址空间中的符号地址。
-
lsmod 查看虚拟内存地址空间中的内核模块地址。 注意:在某些机器上,lsmod 可能不会显示地址。在这种情况下,请尝试使用 cat /proc/modules 作为 root。如果不使用 root,地址可能全为零(出于安全原因清除)。 ~~感谢@crass 用户的评论!~~
1 和 2 都是类似的检查,但根据您系统上可用的功能,您可能需要使用其中之一。
1。 /proc/kallsyms
为此,只需查看/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 已启用。
2。 lsmod
类似于上面/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 的安全优势与随机性或熵的质量成正比。
参考:
Debugging Linux Kernels with KASLR
Linux Kernel Driver Database for RANDOMIZE_BASE