1. 背景
KASLR是一个什么技术点其实不重要,但重要的是有了KASLR这个功能后,造成内核中某个符号(函数 or 变量)在System.map中的地址和实际不一样了(实际: cat /proc/kallsyms),进一步带来了分析类似crash问题中的打印地址不准确问题。所以必须得知道这是什么?本文主要从实战层面来谈几个问题:
- KASLR是什么?
- KASLR如何开启?如何查看开启了?
- 破除KASLR的几个方法(有些奇技淫巧)
- 破除KASLR后再实战中有何作用?
2. 要点
-
KASLR:kernel address space layout randomization 内核地址空间布局随机化。是一个安全功能,本质是将链接的地址 mapping到 运行的地址多做了一个随机偏移。断句是:KAS LR,KAS的LR
-
作者:Kees Cook,linux内核的安全工程师(Linux kernel security engineer),曾是Ubuntu Security Team的技术老大。更多参考链接: Cook的Linkedin 、 Cook的github仓库、Cook更多介绍
-
ASLR:address space layout randomization地址空间布局随机化,是一种众所周知的技术,它通过将各种对象随机放置在而不是固定的地址上来增加攻击的难度。参考Wiki
-
ASLR首次提出:Linux PaX 项目首先创造了“ASLR”这个术语,并于 2001 年 7 月作为 Linux 内核的补丁发布了 ASLR 的第一个设计和实现。参考Wiki
-
第一个默认支持 ASLR 的主流操作系统是 2003 年的 OpenBSD 3.4 版, 其次是 2005 年的 Linux。参考Wiki
-
ASLR是一种“统计防御”,因为一般可以使用暴力方法来克服它
-
在一个完全不受限制的系统中,尤其是在本地不受信任的用户的系统中,KASLR 不会很有用。但是,在使用容器或具有大量包含进程的系统上,KASLR 可以提供帮助。参考链接
-
Linux 长期以来一直为用户空间程序提供 ASLR。参考链接
-
在虚拟机内使用较多,提高虚拟机安全性
-
让内核vmlinux在运行态的地址相比于编译的地址有一个偏移,具体偏移值通过DTS配置
-
另外如果可以参数化,在bootloader中配置,可以动态设置每次每个设备都是不同的映射地址
-
Red Hat Enterprise Linux 7.5 and later开始引入,参考redhat 官网
-
如何避免内核消息卸载:通过将 dmesg_restrict sysctl 设置为 1,防止非特权用户访问内核消息。此设置将 dmesg 访问限制为具有 CAP_SYSLOG 权限的用户。proc通过kptr_restrict sysctl 设置为 1。
3. 实操
3.1 查看是否打开:CONFIG_RANDOMIZE_BASE
内核编译是否配置 CONFIG_RANDOMIZE_BASE=y
cat /boot/config-$(uname -r) |grep CONFIG_RANDOMIZE_BASE
实操:
- 在bootloader配置中关闭的方式,添加nokaslr的启动项
GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet nokaslr"
<