Linux KASLR
KASLR
(kernel address space layout randomization) 内核地址空间布局随机化。是一个安全功能,本质是将链接的地址映射到运行的地址多做了一个随机偏移。即是在kernal image加载到内存时对其进行偏移和重定位。
KASLR的工作原理
在内核启动阶段,通过获取一个随机值,并对内核加载地址进行相应的随机偏移。该偏移值既可以通过dtb传递,也可以基于随机源生成,在完成内核数据随机映射之后,还需要对符号地址进行重定位,校正内核代码的符号寻址,以此确保内核代码的正常执行。
KASLR的实现方式
linux在进行编译构建时会将所有的内核代码链接成vmlinux(ELF文件,包含注释信息..,内核启动时无用),通过OBJCOPY删除不必要信息后得到image,再经过压缩后链接内部解压代码形成最终的vmlinux,最后再通过OBJCOPY运行内部解压代码形成最后的zimage。
内核在进行镜像加载时会先将zimage加载到固定位置,pc会从自解压代码入口处开始执行,解压后会将image向下迁移,开启KASLR后会在执行自解压前创建一个offset,在解压时添加offset将内核镜像解压到随机位置。
有了KASLR这个功能后,造成内核中某个符号(函数 or 变量)在System.map中的地址和实际不一样了(实际: cat /proc/kallsyms),进一步带来了分析类似crash问题中的打印地址不准确。
KASLR的开启与关闭
内核编译配置
cat /boot/config-$(uname -r) | grep CONFIG_RANDOMIZE_BASE
CONFIG_RANDOMIZE_BASE=y
vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet nokaslr"
start_kernel() ---> setup_arch() ---> kernel_randomize_memory()