Android:有没有一种方法可以在运行时验证KASLR

时间:2019-08-09 07:32:53

标签: android security kernel runtime aslr

我想知道是否有一种方法可以检查在运行时在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命令行参数中看不到此选项。

1 个答案:

答案 0 :(得分:1)

KASLR的实现细节取决于CPU架构(x86,ARM,ARM64,PowerPC等),所以我不能说您是否已正确配置它,但是在运行时我知道有两件事可以检查:

  1. /proc/kallsyms文件以查看虚拟内存地址空间中的符号地址。
  2. 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