释放后使用漏洞是指程序在释放某块动态分配的内存之后,仍然通过原有指针读取或改写该内存,从而造成内存破坏的安全缺陷,英文一般写作 Use-After-Free,缩写为 UAF,在通用弱点枚举中对应 CWE-416。这类缺陷属于时间型内存安全漏洞,是浏览器、操作系统内核与各类用户程序中被反复利用的一类问题,也是控制流劫持、数据流劫持与信息泄漏攻击的根源之一[1]。
定义
释放后使用漏洞指的是程序在调用释放内存的函数之后,继续借助仍然指向该地址的指针访问这块内存的情形。此时该内存已被内存管理程序标记为可用,随时可能被重新分配,因此再次读写会引发未定义的程序行为[2]。这种仍然指向已回收内存的指针通常被称为悬空指针或野指针,相关问题在通用弱点枚举中被编号为 CWE-416。
从分类上看,释放后使用属于时间型内存安全漏洞,与指针越界这类空间型漏洞相对,其特征在于内存本身的边界没有越出,而是对象的生命周期已经结束[1]。它与重复释放、内存泄漏一样,多源于异常分支处理不当,或程序不同部分之间对内存释放职责认识不清[2]。
原理
典型的生命周期包含分配、使用、释放与再次访问几个阶段。程序先用内存分配函数取得一块堆内存,写入数据后调用 free 一类函数交还给分配器,此时内存块可被其他逻辑重新申请;如果原指针没有被清空或覆盖,后续操作仍会写入这块地址,于是被释放的空间可能被解析成另一种类型的对象,形成类型混淆。在 C++ 等面向对象语言中,堆上的对象常带有虚函数指针等函数地址,攻击者若能把新分配的数据填进这块空间并覆盖函数指针,就有机会改变执行流程[2]。
这一过程可用如下关系表示:原指针 p 指向地址 a,释放 a 后 p 未被置空,新对象 q 被分配到同一地址 a,则通过 p 的读写实际作用在 q 上,形成 $\text{write-what-where}$ 原语[2]。为稳定命中同一位置,利用方通常先大量分配与释放特定大小的对象来整理堆布局,这一手法被称为堆风水或堆喷射。
flowchart LR
A[分配内存 malloc] --> B[使用对象]
B --> C[释放内存 free]
C --> D[指针未置空]
D --> E[内存被重新分配]
E --> F[通过旧指针读写]
F --> G[内存破坏或代码执行]
发展历程
释放后使用并非新问题,但它的受关注程度随着现代浏览器、大型应用程序与操作系统的普及而明显上升,在浏览器场景中一度成为最常见的远程代码执行漏洞类型之一。有研究工作统计,2007 年至 2016 年间国家脆弱性数据库中约 80.14% 的 UAF 漏洞被评定为高危级别[1]。
公开记录中,2018 年仅在通用漏洞披露数据库中就有 134 条与此类缺陷相关的漏洞条目,涉及文档阅读器、浏览器引擎与图形组件等多种软件[3]。近年披露的条目仍在延续,例如 2024 年出现的 CVE-2024-9680 与 CVE-2024-49039 均被用于向受控系统投放远程控制工具[2]。
应用
在漏洞分类与工程实践中,释放后使用是代码审计与检测工具的重点目标。静态代码分析可以在源代码中发现已释放内存被再次使用的写法,动态检测方面则常用地址消毒器与 Valgrind 一类工具在运行期捕获非法访问[3]。Windows 驱动程序开发中提供了专门的 CodeQL 查询来识别释放后使用缺陷,并给出将指针及时置空的修复建议[4]。
在系统与浏览器层面,防御思路包括强化内存分配器、引入隔离区与隔离池,以及在浏览器中部署 MiraclePtr、PartitionAlloc 等针对性的保护机制[5]。学术研究则按防御位置把机制分为三类:在释放前检查或清空指针、限制被释放内存块的重分配、在访问时校验指针与内存块元数据是否匹配[1]。
局限
现有防护手段都无法完全消除这类缺陷。把释放后的指针置空是常见做法,但面对多重指针或复杂数据结构时效果有限,因为其他副本仍可能指向同一地址[2]。专用的静态查询工具虽然精度较高,仍受限于误报与漏报,无法覆盖全部释放后使用情形[4]。
自动内存管理也不是彻底方案。垃圾回收机制用于回收程序不再可达的内存,能减少部分泄漏与误用,但因实现复杂而不被认为百分之百有效[6]。此外,地址随机化与数据执行保护等通用缓解措施只能提高利用门槛,攻击者仍可通过结合信息泄漏等手段绕过。
参见
参考资料
- 第 2 卷 第 3 期 [引用日期2026-10-14]
- Using freed memory | OWASP Foundation [引用日期2026-10-14]
- 【缺陷周话】第11期:释放后使用(UAF) [引用日期2026-10-14]
- codeql-windows-driver-useafterfree [引用日期2026-10-14]
- 释放后使用 [引用日期2026-10-14]
- open-std.org 上的 PDF 文件 [引用日期2026-10-14]