ASLR和KASLR分别保障用户态与内核态内存布局随机化:ASLR通过kernel.randomize_va_space=2启用并验证地址变化,KASLR需编译支持、GRUB添加kaslr参数且重启生效。

服务器内核参数随机化内存布局,核心就是启用并验证 ASLR(用户态)和 KASLR(内核态)两项机制。前者控制进程栈、堆、共享库等地址的每次加载偏移,后者决定内核镜像本身在内存中的加载位置。两者缺一不可,但配置方式、生效时机和验证方法完全不同。
确认当前 ASLR 状态并临时开启
ASLR 由 kernel.randomize_va_space 参数控制,取值含义明确:
- 0:完全关闭(不推荐)
- 1:部分随机化(栈、vDSO、mmap 区域,但堆固定)
- 2:完整随机化(栈、堆、共享库、vDSO、mmap 全部随机)
执行以下命令查看当前值:
cat /proc/sys/kernel/randomize_va_space若返回不是 2,可立即临时启用:
sudo sysctl -w kernel.randomize_va_space=2该操作无需重启,但仅对后续新启动的进程生效,已运行进程不受影响。
永久启用 ASLR 并确保开机生效
临时设置在系统重启后会丢失,需写入持久化配置:
- 推荐方式:新建独立配置文件,避免污染主配置
- 执行:echo 'kernel.randomize_va_space = 2' | sudo tee /etc/sysctl.d/99-aslr.conf
- 重载全部 sysctl 配置:sudo sysctl --system
该操作会自动加载新配置,无需重启系统,新进程即按完整 ASLR 运行。
验证 ASLR 是否真正起效
不能只看参数值,必须观察实际内存地址是否变化。最简单的方法是多次检查同一进程的内存映射:
- 运行:cat /proc/self/maps | grep -E "(stack|heap|libc|vdso)"
- 连续执行 3–5 次,注意每行开头的十六进制地址(如 7fff8a2b7000-)
- 若 [stack]、[heap]、libc.so 或 [vdso] 的起始地址每次都不一样,说明 ASLR 已正常工作
注意:bash 进程本身较轻量,适合快速验证;生产服务进程也可用相同方式检查其 /proc/PID/maps。
KASLR 的启用与注意事项
KASLR 是内核编译时和启动时协同完成的,无法通过 sysctl 动态开关:
- 确认内核是否支持:检查 /boot/config-$(uname -r) 中 CONFIG_RANDOMIZE_BASE=y
- 启用依赖 GRUB 启动参数:在 /etc/default/grub 的 GRUB_CMDLINE_LINUX 行添加 kaslr(多数现代发行版默认已启用)
- 更新 GRUB:sudo update-grub(Debian/Ubuntu)或 sudo grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL/CentOS)
- 必须重启才能使 KASLR 生效
KASLR 效果无法像 ASLR 那样直接观察地址,但可通过 dmesg | grep "KASLR" 查看启动日志确认是否成功启用。

















