我想知道是否有一种方法可以检查在运行时在Android target中是否启用了KASLR。
我知道可以通过将/ proc / sys / kernel / randomize_va_space的值检查为2(对用户空间应用完全随机化)来验证ASLR。
我已配置
CONFIG_RANDOMIZE_BASE=y
在板defconfig文件中。
现在,我想在运行时对其进行验证。
我们正在Android P中使用4.14内核版本。
我已经看到this在ubuntu中针对内核命令行args进行了检查。
我在BoardConfig.mk的android命令行参数中看不到此选项。
答案 0 :(得分:1)
KASLR的实现细节取决于CPU架构(x86,ARM,ARM64,PowerPC等),所以我不能说您是否已正确配置它,但是在运行时我知道有两件事可以检查:
/proc/kallsyms
文件以查看虚拟内存地址空间中的符号地址。lsmod
,以查看虚拟内存地址空间中的内核模块地址。 注意:在某些计算机上,lsmod
可能不显示地址。在这种情况下,请尝试使用cat /proc/modules
作为root用户。如果不使用root,则地址可能全为零(出于安全原因而清除)。 ~~感谢用户@crass的评论!~~ 1和2都是类似的检查,但是根据系统上可用的功能,您可能需要使用其中一个。
要这样做,只需查看/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的安全利益与随机性或熵的质量成正比。
参考文献:
Debugging Linux Kernels with KASLR
Linux Kernel Driver Database for RANDOMIZE_BASE