内存安全
内存安全 是什么?
内存安全内存安全指程序绝不读取、写入或执行未合法分配的内存,从而消除整类漏洞的属性。
内存安全包括空间安全(无越界访问)、时间安全(无 use-after-free 与 double-free)、类型安全与初始化安全。C 与 C++ 默认不具备内存安全,缓冲区溢出、UAF 与类型混淆等导致大多数严重 CVE。微软、Google Project Zero 以及美国 ONCD 2024 报告均指出,大型 C/C++ 代码库中 60% 至 70% 的高危漏洞源自内存安全错误。缓解措施(ASLR、DEP、CFI、sanitizer)提升了利用成本,但要从根本上解决问题,必须采用内存安全语言或形式化验证子集,在源头消除这些缺陷。
● 示例
- 01
越界写入把堆块改造为攻击者可控的对象。
- 02
use-after-free 释放的 JavaScript 对象,其指针仍存在 JIT 缓存中。
● 常见问题
内存安全 是什么?
内存安全指程序绝不读取、写入或执行未合法分配的内存,从而消除整类漏洞的属性。 它属于网络安全的 应用安全 分类。
内存安全 是什么意思?
内存安全指程序绝不读取、写入或执行未合法分配的内存,从而消除整类漏洞的属性。
内存安全 是如何工作的?
内存安全包括空间安全(无越界访问)、时间安全(无 use-after-free 与 double-free)、类型安全与初始化安全。C 与 C++ 默认不具备内存安全,缓冲区溢出、UAF 与类型混淆等导致大多数严重 CVE。微软、Google Project Zero 以及美国 ONCD 2024 报告均指出,大型 C/C++ 代码库中 60% 至 70% 的高危漏洞源自内存安全错误。缓解措施(ASLR、DEP、CFI、sanitizer)提升了利用成本,但要从根本上解决问题,必须采用内存安全语言或形式化验证子集,在源头消除这些缺陷。
如何防御 内存安全?
针对 内存安全 的防御通常结合技术控制与运营实践,详见上方完整定义。
内存安全 还有哪些其他名称?
常见的别称包括: 内存安全漏洞。
● 相关术语
- appsec№ 671
内存安全语言
Rust、Go、Swift、Java、C# 等内存安全语言可在源头消除导致 C/C++ 大多数可利用漏洞的空间与时间型内存错误。
- appsec№ 953
Rust 安全特性
Rust 通过所有权、借用与生命周期在编译期强制内存与线程安全,在不依赖垃圾回收的前提下消除 UAF 与数据竞争等典型未定义行为。
- appsec№ 217
控制流完整性(CFI)
控制流完整性(CFI)将程序的间接调用和返回限制在预先计算的合法目标集合内,阻断 ROP 与 JOP 等控制流劫持利用。
- appsec№ 064
地址空间布局随机化(ASLR)
ASLR 在每次运行时随机化代码、栈、堆和共享库的内存地址,使攻击者无法可靠预测利用所需的目标地址。
- appsec№ 303
数据执行保护(DEP)
DEP(又称 NX 位或 W^X)将内存页标记为不可执行,使攻击者无法运行注入到栈或堆中的 shellcode。
- appsec№ 925
面向返回的编程(ROP)
ROP 是一种代码复用利用技术,通过把以 RET 结尾的短指令序列(gadget)串成链来执行任意计算,而无需注入新代码。
● 参见
- № 1095栈金丝雀
- № 1028影子栈
- № 581内核 ASLR(KASLR)
- № 1058SMEP / SMAP