什么是地址随机化
ASLR(Address Space Layout Randomization)让进程每次启动时的栈、mmap 区域与堆起始地址都不同,攻击者无法依赖固定地址完成漏洞利用,因此是安全基线的必查项。Linux 由 kernel.randomize_va_space 控制,分三档:0 完全关闭、1 随机化 mmap 基址/栈/VDSO、2 在 1 的基础上继续随机化堆。默认值为 2,除受控调试外都不应改小。
基本信息
| 参数路径 | kernel.randomize_va_space |
|---|---|
| 取值 0 | 关闭随机化,地址固定 |
| 取值 1 | 随机化 mmap 基址、栈与 VDSO |
| 取值 2 | 在取值 1 基础上随机化堆(默认) |
| 查看 | cat /proc/sys/kernel/randomize_va_space |
| 生效范围 | 内核全局,对所有进程生效 |
典型使用场景
- 安全基线核查:确认生产主机没有被关掉 ASLR
- 老应用兼容排查:某些依赖固定地址的 JIT、加固程序需要临时关闭
- 漏洞复现与调试:受控环境里临时调整以复现问题
- 解释调试现象:gdb/perf 看到的地址每次不同正是随机化的表现
- 合规检查项:把该值与同类加固项一起纳入定期巡检
查看与验证
查看与验证
sysctl kernel.randomize_va_space # 期望 2
cat /proc/sys/kernel/randomize_va_space # 等价写法
# 观察同一程序两次运行时的栈地址是否变化:
cat /proc/self/maps | head -3
cat /proc/self/maps | head -3
# 说明:两次输出中的库与栈地址通常不同,即为 ASLR 生效
# 临时关闭(调试用,勿留在生产):sysctl -w kernel.randomize_va_space=0取值与环境
| 场景 | 期望取值 | 说明 |
|---|---|---|
| 生产服务器 | 2 | 安全基线要求,保持默认 |
| 受控调试环境 | 0 或 1 | 仅限排障窗口,事后恢复 |
| 容器内读取 | 与宿主一致 | 该参数不可按容器独立设置 |
| 老应用报栈或地址异常 | 先保持 2 | 优先修应用而不是降安全等级 |
容器与宿主共享同一个内核参数:在容器里读到 2 或试图修改,实质影响的都是宿主内核,不存在“只给这个容器关 ASLR”的常规做法。
关闭 ASLR 会显著降低漏洞利用门槛,任何关闭动作都应有明确的排障理由与恢复时间点,不能作为长期配置存在。