Android:有没有办法在运行时验证KASLR

Android:有没有办法在运行时验证KASLR,android,security,kernel,runtime,aslr,Android,Security,Kernel,Runtime,Aslr,我想知道是否有一种方法可以检查在android target中是否在运行时启用了KASLR 我知道ASLR可以通过检查/proc/sys/kernel/randomize_va__空间与值2(用户空间应用程序的完全随机化)来验证 我已经配置了 CONFIG_RANDOMIZE_BASE=y 在board defconfig文件中 现在我想在运行时验证它 我们在Android p中使用内核版本4.14 我已经看到它在ubuntu中对内核命令行args进行了同样的检查 我在BoardConfig

我想知道是否有一种方法可以检查在android target中是否在运行时启用了KASLR

我知道ASLR可以通过检查/proc/sys/kernel/randomize_va__空间与值2(用户空间应用程序的完全随机化)来验证

我已经配置了

CONFIG_RANDOMIZE_BASE=y 
在board defconfig文件中

现在我想在运行时验证它

我们在Android p中使用内核版本4.14

我已经看到它在ubuntu中对内核命令行args进行了同样的检查


我在BoardConfig.mk的android命令行args中没有看到此选项。

KASLR的实现细节取决于CPU体系结构(x86、ARM、ARM64、PowerPC等),因此我无法说明您是否正确配置了它,但在运行时,我知道有两件事您可以检查:

  • 使用
    /proc/kallsyms
    文件查看虚拟内存地址空间中的符号地址
  • lsmod
    查看虚拟内存地址空间中的内核模块地址注意:在某些机器上,
    lsmod
    可能不显示地址。在这种情况下,尝试使用
    cat/proc/modules
    作为根目录。如果不使用root,地址可能全部为零(出于安全原因清除)~~感谢用户@cras的评论~~ 1和2都是类似的检查,但根据系统上的可用内容,您可能需要使用其中一种

    1. /proc/kallsyms 为此,只需查看
    /proc/kallsyms
    的前几行:

    root@device:~# head -n 3 /proc/kallsyms
    ffffff8008080000 t _head
    ffffff8008080000 T _text
    ffffff8008080800 T do_undefinstr
    
    请注意,例如,
    头的地址是
    FFFF80 0808 0000

    现在重新启动计算机并再次检查

    root@device:~# head -n 3 /proc/kallsyms
    ffffff9fc8c80000 t _head
    ffffff9fc8c80000 T _text
    ffffff9fc8c80800 T do_undefinstr
    
    root@device:~# lsmod
    iptable_filter 16384 0 - Live 0xffffff2100716000
    ip_tables 28672 1 iptable_filter, Live 0xffffff210070a000
    
    请注意,例如,
    \u head
    的地址现在是
    ffff ff9f c8c8 0000

    比较高级字节,发现
    ffffff80080!=0xFFFF9FC8C
    因此地址会在重新启动时更改。-->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
    的地址是
    ffffa1 c49b 9000

    现在重新启动计算机并再次检查

    root@device:~# head -n 3 /proc/kallsyms
    ffffff9fc8c80000 t _head
    ffffff9fc8c80000 T _text
    ffffff9fc8c80800 T do_undefinstr
    
    root@device:~# lsmod
    iptable_filter 16384 0 - Live 0xffffff2100716000
    ip_tables 28672 1 iptable_filter, Live 0xffffff210070a000
    
    请注意,例如,
    iptable_filter
    的地址现在是
    ffff21 0071 6000

    比较高级字节,发现
    ffffff2100716!=0xffffffa1c49b9
    ,因此地址会在重新启动时更改。KASLR已启用

    您可以反复进行这些测试,以确定随机性的质量。重新启动时的地址有多大不同?有明显的模式吗?KASLR的安全效益与随机性或熵的质量成正比

    参考文献: