能否为Linux内核模块(ko文件)关闭ASLR以获得固定重启加载地址?
是否可以为Linux内核模块关闭ASLR,固定重启后的加载地址?
可以实现,有两类常用方案,操作方法如下:
方法1:全局关闭内核KASLR(操作最简单)
内核模块加载地址随机化属于内核ASLR(KASLR)的功能之一,全局关闭后所有内核模块、内核本身的加载地址每次重启都会固定:
- 修改内核启动参数,添加
nokaslr参数即可生效:- 普通Linux发行版:修改grub配置文件中
GRUB_CMDLINE_LINUX_DEFAULT字段,追加nokaslr后执行update-grub,重启系统即可 - Android设备:解开boot.img修改启动cmdline添加
nokaslr,重新打包刷入boot分区后重启生效
- 普通Linux发行版:修改grub配置文件中
- 验证方法:多次重启后执行如下命令,确认模块加载地址不变即可:
adb shell cat /proc/modules | grep module_name
输出示例如下,其中0xffffffec11589000就是固定的模块加载地址:
module_name 8134656 27 - Live 0xffffffec11589000 (O)
方法2:仅固定指定模块的加载地址(不影响全局KASLR安全性)
如果不需要关闭整个系统的KASLR,可以单独在加载模块时指定固定地址:
- 先执行一次上述
cat /proc/modules命令,记录当前模块正常加载的地址 - 加载模块时使用
insmod的--load-addr参数指定记录的地址即可,命令示例:
insmod /path/to/module_name.ko --load-addr=0xffffffec11589000
- 如果需要开机自动固定加载,修改系统的模块自启动配置,把默认加载命令替换为上述带地址参数的命令即可
注意事项
- 关闭KASLR或固定模块加载地址会大幅降低系统安全防护能力,内核漏洞的利用难度会明显下降,仅建议在调试、测试环境中使用
- 部分锁定的Android设备bootloader会强制开启KASLR,即使添加
nokaslr参数也不生效,需先解锁bootloader相关限制
内容的提问来源于stack exchange,提问作者Trishansh Bhardwaj
相关产品推荐
相关产品推荐

