ASLR 在防什么
ASLR(地址空间布局随机化)让进程每次启动时栈、堆、共享库的加载地址都不一样。缓冲区溢出类漏洞在利用时需要知道关键地址,地址随机化把这一步变成猜测:猜错的进程会直接崩溃,很难形成稳定可用的利用链。Linux 上由 kernel.randomize_va_space 控制,值为 2 表示完全随机化,现代发行版默认就是这个值。
基本信息
| 加固项 | 内核地址随机化 |
|---|---|
| 适用平台 | Linux(RHEL/CentOS/Debian/Ubuntu) |
| 风险等级 | 高 |
| 基线 | kernel.randomize_va_space = 2 |
| 查看位置 | sysctl 与 /proc/sys/kernel/randomize_va_space |
典型使用场景
- 基线核查:确认内核缓解措施处于开启状态,作为主机加固的一部分
- 事故排查:某程序在开启 ASLR 后异常,需要判断是否为兼容性问题
- 加固整改:发现被历史操作关闭过 ASLR 时恢复为完全随机化
- 容器环境核查:确认容器内看到的值来自宿主内核而非独立配置
- 漏洞响应:修复通告中建议启用或确认缓解措施时逐项核对
核查与加固
核查与加固
sysctl kernel.randomize_va_space # 期望输出值为 2
cat /proc/sys/kernel/randomize_va_space # 直接读内核值,绕过配置文件
echo 'kernel.randomize_va_space = 2' >> /etc/sysctl.d/99-hardening.conf
sysctl --system # 加载全部配置文件
sysctl kernel.randomize_va_space # 复核生效值取值含义
| 取值 | 含义 | 说明 |
|---|---|---|
| 0 | 关闭随机化 | 漏洞利用门槛大幅下降,不应使用 |
| 1 | 部分随机化 | 共享库等随机,整体缓解力度有限 |
| 2 | 完全随机化 | 基线要求值,栈、堆与库全部随机 |
| 容器内读数 | 与宿主内核一致 | 容器不能独立设置该参数,报错属预期 |
不要相信「关闭 ASLR 提升兼容性」的旧建议:那会让提权漏洞的利用难度显著下降。遇到程序异常应修复或升级程序,而不是削弱内核缓解措施;临时关闭只适合在隔离环境中做单次变量验证,验证后立即恢复。
该参数通过内核命令行动态生效,但重启后以配置文件为准,所以必须写入 /etc/sysctl.d 下的文件才能持久。容器共享宿主内核,容器内修改会被拒绝,真正的设置点是在宿主机上。
与其他缓解措施一起看
ASLR 不是独立防线:栈保护、不可执行栈、可执行文件的位置无关编译等机制配合使用时,才构成完整的缓冲区溢出缓解链。核查报告里把这几项写成一组,比只写一个参数取值更能反映真实防护水平;发现某程序明确带禁用随机化的标记,也应单独记录原因。