整数溢出
整数溢出 是什么?
整数溢出算术运算产生超出整数类型可表示范围的结果,以回绕或截断的方式带来安全关键影响的缺陷。
整数溢出发生在计算结果超过整数类型可容纳的最大(或最小)值时,导致回绕、符号翻转或截断。当错误的数值随后被用作缓冲区大小、循环计数、数组下标或授权检查时,就会成为安全问题,经常引发缓冲区溢出、无限循环或绕过限制。
经典模式。 一个常见的危险汇聚点是 malloc(count * size):如果 count * size 回绕超过了 SIZE_MAX,分配器返回的缓冲区就远小于代码所假设的大小,随后的复制便会越界写入——这是一次由乘法而非错误的 memcpy 长度所驱动的溢出。2015 年 Android 的 Stagefright 系列漏洞(CVE-2015-1538)正是利用了这一点:MP4 文件中 stsc 元数据原子里的整数溢出导致堆分配过小,使得单条 MMS 短信即可在估计约 9.5 亿台设备上实现远程代码执行。2002 年 OpenSSH 的 challenge-response 缺陷(CVE-2002-0639)以及许多图像编解码器和字体解析器的漏洞都是同样的形态。有符号到无符号的转换是与之相关的陷阱:一个被解释为巨大无符号值的负长度会击溃像 if (len > max) 这样幼稚的检查。
防御措施 包括受检算术(Rust 的 checked_add/checked_mul、C23 的 ckd_*、编译器选项 -ftrapv 以及 UBSan)、先用更宽的类型计算再在收窄前进行范围检查、选择与取值域相匹配的类型、在分配内存前验证由攻击者控制的大小,以及对解析器进行积极的模糊测试。
flowchart TD
A[攻击者控制的<br/>count 与 size] --> B[size = count * elem]
B --> C{乘积是否超过<br/>类型最大值?}
C -->|否| D[分配正确]
C -->|是| E[数值回绕为<br/>较小的数字]
E --> F[分配了过小的缓冲区]
F --> G[复制越界写入<br/>堆破坏 / RCE]● 示例
- 01
CVE-2002-0639(OpenSSH challenge-response):整数溢出导致堆破坏。
- 02
CVE-2015-1538(Android Stagefright):MP4 'stsc' 原子中的整数溢出,可实现远程代码执行。
● 常见问题
整数溢出 是什么?
算术运算产生超出整数类型可表示范围的结果,以回绕或截断的方式带来安全关键影响的缺陷。 它属于网络安全的 漏洞 分类。
整数溢出 是什么意思?
算术运算产生超出整数类型可表示范围的结果,以回绕或截断的方式带来安全关键影响的缺陷。
如何防御 整数溢出?
针对 整数溢出 的防御通常结合技术控制与运营实践,详见上方完整定义。
整数溢出 还有哪些其他名称?
常见的别称包括: 整数回绕。