aslr 本身不能“防爆”,但能显著提升系统对内存类攻击的抵抗能力;需设 kernel.randomize_va_space=2 并验证进程地址随机化,配合 pie 编译及栈保护、kaslr 等机制构成纵深防御。

开启 ASLR 本身不能“防爆”,但能显著提升系统对内存类攻击(比如缓冲区溢出、ROP、堆喷射等)的抵抗能力——它让攻击者难以定位关键函数或 gadget 的地址,把确定性利用变成高难度概率事件。
确认并设为完全启用模式
ASLR 的效果取决于 kernel.randomize_va_space 的取值。推荐设为 2,表示栈、堆、共享库、mmap 区域全部随机化:
- 查看当前值:
cat /proc/sys/kernel/randomize_va_space - 临时生效(重启失效):
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space - 永久生效:写入配置文件,如
echo 'kernel.randomize_va_space = 2' | sudo tee -a /etc/sysctl.d/10-security.conf,再执行sudo sysctl --system
验证是否真起作用
仅改参数不等于生效,必须实测进程内存布局是否变化:
- 运行
cat /proc/self/maps | head -n 3多次,观察[stack]、libc、vdso起始地址是否每次不同 - 用
checksec --file /bin/bash查看 ASLR 标记是否显示 “Yes”(需先安装 checksec) - 执行
ldd /bin/ls多次,比对 libc.so 的加载地址是否浮动
配合用户态程序支持(PIE)
内核级 ASLR 只是基础,程序自身也得支持随机加载,否则代码段仍固定:
- 编译时加
-fPIE -pie参数,生成位置无关可执行文件(PIE) - 检查已有程序是否为 PIE:
file /bin/bash输出含 PIE executable 即可 - 非 PIE 程序即使内核开了 ASLR,其代码段也不会随机化,防护存在缺口
补全纵深防御链条
ASLR 单独使用容易被绕过,需与其他机制协同:
- 禁用可执行栈:
kernel.exec-shield = 1(主流发行版默认开启) - 启用栈金丝雀:
CONFIG_STACKPROTECTOR_STRONG=y+ 编译加-fstack-protector-strong - 限制内核符号泄露:
kernel.kptr_restrict = 2,隐藏/proc/kallsyms中未导出符号 - 确保 KASLR 已启用:
cat /sys/kernel/debug/kaslr_enabled返回 1,且启动参数不含nokaslr











