缓冲区溢出
缓冲区溢出 是什么?
缓冲区溢出内存安全缺陷:程序写入数据超出已分配缓冲区末尾,破坏相邻内存,常被用于实现代码执行。
在 C、C++ 等语言中,当输入长度未根据目标缓冲区大小进行正确约束时,就会发生缓冲区溢出。多余的字节会覆盖相邻的栈帧、堆块、函数指针或返回地址,使攻击者得以劫持控制流或泄露数据。经典的栈溢出会覆盖保存的返回地址,使函数"返回"到攻击者提供的 shellcode;而堆溢出则破坏分配器元数据或相邻对象,从而获得写入原语。
这种模式塑造了整个互联网的历史。1988 年的 Morris Worm 通过 BSD fingerd 中的栈溢出传播;Code Red(2001)滥用了 IIS .ida ISAPI 过滤器中未经检查的缓冲区(CVE-2001-0500);SQL Slammer(2003)利用了 SQL Server 解析服务的溢出(MS02-039 / CVE-2002-0649),仅凭一个发往 1434 端口、长度为 404 字节的 UDP 数据包,就在十分钟内感染了约 75,000 台主机——而此时距补丁发布已过去六个月。
越界写入(CWE-787)在 2024 年 CWE Top 25 中位列第 2,仅次于 XSS。现代缓解措施层层叠加:栈金丝雀、ASLR、DEP/NX、控制流完整性(Intel CET、ARM PAC/BTI)、更安全的 libc 函数、编译器加固(_FORTIFY_SOURCE)、模糊测试,以及——越来越多地——将热点代码移植到 Rust 等内存安全语言。
flowchart TD
A[攻击者发送超长输入] --> B{长度是否根据<br/>缓冲区大小校验?}
B -->|是,已约束| C[输入被截断 / 拒绝]
B -->|无边界检查| D[写入超出缓冲区末尾]
D --> E[覆盖返回地址<br/>或函数指针]
E --> F[控制流被重定向]
F --> G[攻击者 shellcode / ROP 链运行]
C --> H[程序安全继续运行]● 示例
- 01
CVE-2014-0160(Heartbleed):OpenSSL 中的内存读取越界。
- 02
Morris 蠕虫(1988)利用 fingerd 中的栈溢出。
● 常见问题
缓冲区溢出 是什么?
内存安全缺陷:程序写入数据超出已分配缓冲区末尾,破坏相邻内存,常被用于实现代码执行。 它属于网络安全的 漏洞 分类。
缓冲区溢出 是什么意思?
内存安全缺陷:程序写入数据超出已分配缓冲区末尾,破坏相邻内存,常被用于实现代码执行。
如何防御 缓冲区溢出?
针对 缓冲区溢出 的防御通常结合技术控制与运营实践,详见上方完整定义。
缓冲区溢出 还有哪些其他名称?
常见的别称包括: 缓冲区溢写。