地址空间布局随机化(ASLR)
地址空间布局随机化(ASLR) 是什么?
地址空间布局随机化(ASLR)ASLR 会随机化代码、栈、堆和共享库的内存位置,使攻击者无法可靠地预测利用漏洞所需的目标地址。
ASLR 是一种防御性缓解措施,它在程序每次运行时随机化关键进程区域(可执行文件、共享库、堆、栈和 mmap 区)的基地址。该技术由 PaX 项目于 2001 年首创,2005 年并入 Linux 主线内核(2.6.12),如今已内置于 Windows(自 Vista 起)、macOS、iOS 和 Android 中。通过让内存布局变得不可预测,ASLR 迫使攻击者在发起 ROP 或 ret2libc 等代码复用攻击之前,必须先泄露一个地址。
其强度取决于熵:32 位系统仅暴露约 8–16 位,数量之小以至于 Shacham 在 2004 年的研究能在几分钟内对 Apache 的 fork 工作进程进行暴力破解;而 64 位 Linux 则提供 28 位以上的 mmap 熵。覆盖范围同样重要——只要有一个非 PIE 的库,或一个以无限制栈运行的二进制(ADDR_NO_RANDOMIZE,通过 CVE-2016-3672 得到加固),就会留下一个固定的锚点。2014 年,Marco-Gisbert 和 Ripoll 的 offset2lib 攻击表明,GNU/Linux 将 PIE 可执行文件映射在其库的相邻位置,因此单个泄露的应用程序地址就能以固定偏移量对每个库进行去随机化——在不到一秒内击破完整的 ASLR、NX 和栈金丝雀。修复方案将可执行文件基址与 mmap_base 分离开来。
ASLR 从来不能单独使用:应将其与 DEP/NX、栈金丝雀和控制流完整性(CFI)结合,并且要记住,任何可靠的信息泄露原语都会使其彻底失效。
flowchart TD
E[exec / 程序加载] --> R{ASLR 已启用?}
R -->|No| F[固定且可预测的地址]
R -->|Yes| RND[随机化栈、堆、mmap、PIE、库的基址]
RND --> ENT{熵是否充足且覆盖完整?}
ENT -->|No| BF[暴力破解 / 非 PIE 锚点]
ENT -->|Yes| LEAK{攻击者是否掌握信息泄露?}
LEAK -->|Yes| BYP[重新计算真实地址 如 offset2lib]
LEAK -->|No| BLOCK[ROP / ret2libc 不可靠]
F --> EXP[利用成功]
BF --> EXP
BYP --> EXP● 示例
- 01
Linux 在每次 exec 时随机化栈、堆和 PIE 二进制基址。
- 02
Windows ASLR 在每次启动时重定位 kernel32.dll 和 ntdll.dll。
● 常见问题
地址空间布局随机化(ASLR) 是什么?
ASLR 会随机化代码、栈、堆和共享库的内存位置,使攻击者无法可靠地预测利用漏洞所需的目标地址。 它属于网络安全的 应用安全 分类。
地址空间布局随机化(ASLR) 是什么意思?
ASLR 会随机化代码、栈、堆和共享库的内存位置,使攻击者无法可靠地预测利用漏洞所需的目标地址。
如何防御 地址空间布局随机化(ASLR)?
针对 地址空间布局随机化(ASLR) 的防御通常结合技术控制与运营实践,详见上方完整定义。
地址空间布局随机化(ASLR) 还有哪些其他名称?
常见的别称包括: 地址随机化, 位置无关可执行文件 PIE。