将 kernel.randomize_va_space 设为 2 是启用完整 ASLR 的最核心手段,实现栈、堆、共享库及可执行段全随机化;需配合禁用可执行栈、启用栈金丝雀、限制核心转储等措施构建纵深防御。

直接将 kernel.randomize_va_space 设为 2,是开启完整地址空间随机化(ASLR)最核心、最有效的手段,它从内存布局层面大幅抬高栈溢出、ROP、堆喷射等攻击的利用门槛,属于内核级基础防护,必须启用。
确认当前ASLR状态与含义
执行以下任一命令查看当前值:
cat /proc/sys/kernel/randomize_va_spacesysctl kernel.randomize_va_space
返回值含义明确:
- 0:完全禁用 —— 所有进程堆、栈、库地址固定,极易被精准覆盖和跳转
- 1:保守随机化 —— 栈随机,但堆和共享库加载基址变化有限,防护较弱
- 2:全随机化(推荐)—— 栈、堆、共享库、可执行段全部随机化,攻击者无法稳定预测任何关键地址
临时生效:快速验证与调试
无需重启,立即启用全随机化:
sudo sysctl -w kernel.randomize_va_space=2
验证是否生效:
- 运行两次
ldd /bin/bash | grep libc,观察 libc 路径地址是否不同 - 多次执行
cat /proc/self/maps | grep stack,确认栈起始地址持续变动
永久生效:写入配置并加载
避免重启后失效,需持久化配置。推荐使用独立配置文件方式(更清晰、易管理):
- 创建配置文件:
echo "kernel.randomize_va_space = 2" | sudo tee /etc/sysctl.d/50-aslr.conf - 加载新配置:
sudo sysctl --system(自动读取 /etc/sysctl.d/ 下所有 .conf)
不建议直接修改 /etc/sysctl.conf 主文件,容易与其他策略混杂,也难追溯变更来源。
配套加固:让ASLR真正发挥最大效力
单独开 ASLR 不够,需配合其他机制形成纵深防御:
-
禁用可执行栈:确保
kernel.exec-shield = 1(主流发行版默认开启),防止 shellcode 在栈上直接执行 -
启用栈金丝雀:编译时加
-fstack-protector-strong,内核启用CONFIG_STACKPROTECTOR_STRONG=y,可在溢出发生时提前终止进程 -
限制核心转储:设
fs.suid_dumpable = 0,防止敏感内存布局通过 core 文件泄露 -
关闭 ICMP 重定向与源路由:如
net.ipv4.conf.all.accept_redirects = 0和accept_source_route = 0,减少辅助信息泄露面
这些参数同样写入 /etc/sysctl.d/ 下的配置文件,统一用 sysctl --system 加载。


















