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的主要内容,如果未能解决你的问题,请参考以下文章
在 Git 中运行预提交挂钩。有没有办法验证脚本是不是正在运行?