缓冲区溢出(Buffer Overflow)是一种经典的程序安全漏洞:程序向缓冲区写入超过其容量的数据,多余内容会覆盖相邻内存,轻则导致程序崩溃,重则被攻击者植入恶意代码、夺取系统控制权,是许多蠕虫病毒和远程攻击的根源。

| 类型 | 程序安全漏洞 / 攻击手法 |
| 高发语言 | C、C++ 等无自动边界检查的语言 |
| 常见分类 | 栈溢出、堆溢出 |
| 主要危害 | 程序崩溃、任意代码执行、系统被控 |
| 防护手段 | 边界检查、Stack Canary、DEP、ASLR |
缓冲区溢出(Buffer Overflow)是一种经典的程序安全漏洞,指程序向内存缓冲区写入的数据超出了缓冲区本身的容量,多出来的数据覆盖相邻内存区域,轻则导致程序出错崩溃,重则被攻击者利用来执行恶意代码,夺取程序乃至整个系统的控制权。
缓冲区是程序在内存中开辟的一段连续空间,用来临时存放用户输入、字符串等数据。理想情况下,程序写入前应先检查数据长度是否超出容量;但 C、C++ 等语言出于性能考虑不会自动做边界检查,如果开发者使用了 strcpy、gets 这类不做长度限制的函数又疏于校验,超长数据就会「溢出」到缓冲区之外。
攻击者正是利用这一缺陷:精心构造一段超长输入,让溢出部分恰好覆盖关键内存位置(例如栈上保存的函数返回地址),使程序转而执行攻击者预先植入的指令(俗称 shellcode),从而实现远程执行任意代码。历史上多个影响巨大的蠕虫病毒和远程入侵事件,根源都是缓冲区溢出漏洞。
按发生位置不同,缓冲区溢出通常分为栈溢出和堆溢出两大类。其中栈溢出因为直接关联函数返回地址,是最经典、被研究最多的利用方式。
问:为什么缓冲区溢出多发生在 C/C++ 程序中?答:因为这两种语言不会自动检查数组和指针操作是否越界,安全完全依赖开发者自觉;而 Java、Python、Rust 等语言会在运行时或编译期拦截越界访问。
问:普通用户如何防范缓冲区溢出攻击?答:及时安装操作系统和软件的安全更新最为有效,因为被广泛利用的溢出漏洞大多早有补丁,受害的往往是长期未更新的机器。
问:现代系统还容易被缓冲区溢出攻击吗?答:难度比早年大得多,ASLR、DEP 等缓解机制迫使攻击者往往要组合多个漏洞才能成功利用,但它至今仍是内存安全漏洞中的重要类别,并未绝迹。

| 类型 | 程序安全漏洞 / 攻击手法 |
| 高发语言 | C、C++ 等无自动边界检查的语言 |
| 常见分类 | 栈溢出、堆溢出 |
| 主要危害 | 程序崩溃、任意代码执行、系统被控 |
| 防护手段 | 边界检查、Stack Canary、DEP、ASLR |
登录 后参与讨论
暂无讨论,来发表第一条评论吧