30 年后的内存损坏:无尽的故事
1. 引言
在导致安全漏洞的所有软件错误中,内存损坏是最危险且最古老的问题之一。尽管已经提出了许多缓解方法,但它仍然存在于通用和专用软件中。内存损坏在 CWE 最危险软件弱点列表中占据前列,表现为越界写入、越界读取、释放后使用(UAF)等。
内存错误普遍存在的一个主要原因是,大量提出的检测和保护解决方案由于性能开销、兼容性问题、保护不完整或依赖冲突等原因,在实际中并未得到部署。本文旨在提供对内存错误的全面理解,指出检测、利用和防御方法的最新研究。
2. 背景
内存损坏是由于 C 和 C++ 等低级语言缺乏内存和类型安全导致的。这些语言通过手动内存管理等方式提供对实现细节的低级控制,使得程序有可能以意外的方式访问内存。
通常认为,只要一组内存错误不发生,程序的执行就是内存安全的。内存错误包括对未定义内存(即程序未分配或未初始化的内存)的访问,以及对未指定内存区域的访问(即指针解引用指向非指定的内存区域)。根据其特征,内存错误通常分为空间和时间内存错误:
- 空间内存错误 :包括对引用对象既定边界之外的所有内存访问。最典型的例子是缓冲区溢出,即数据写入超出缓冲区限制,可能会覆盖其他值。因此,越界读取和写入属于此类。
- 时间内存错误 :由在解引用时引用对象无效的指针使用引起,例如指针未初始化或之前已被释放。在此情况下,会出现释放后使用(UAF)错误、使用未初始化内存、空指针解引用和非法释放(即对未分配或已释放的指针调用 free)。
3. 内存错误检测
多年来,人们提出
超级会员免费看
订阅专栏 解锁全文
2万+

被折叠的 条评论
为什么被折叠?



