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

Posted

技术标签:

【中文标题】Android:有没有办法在运行时验证 KASLR【英文标题】:Android: Is there a way to validate KASLR at runtime 【发布时间】:2019-12-16 22:05:43 【问题描述】:

我想知道是否有办法检查是否在运行时在 android 目标中启用了 KASLR。

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

我已经配置了

CONFIG_RANDOMIZE_BASE=y 

在电路板的 defconfig 文件中。

现在我想在运行时验证它。

我们在 Android P 中使用的是内核版本 4.14。

我已经看到 this 在 ubuntu 中检查相同的内核命令行参数。

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

【问题讨论】:

【参考方案1】:

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 KASLRLinux Kernel Driver Database for RANDOMIZE_BASE

【讨论】:

以上是关于Android:有没有办法在运行时验证 KASLR的主要内容,如果未能解决你的问题,请参考以下文章

没有身份验证令牌的android联系人同步

在 Git 中运行预提交挂钩。有没有办法验证脚本是不是正在运行?

开启内核地址随机化KASLR后, qemu 调试 kernel 不能设置断点

有没有办法在 Android 上运行 Python?

有没有办法在 Android 上运行 Python?

有没有办法在 VirtualBox 中运行 Android TV?