整数下溢
整数下溢 是什么?
整数下溢一种算术缺陷(CWE-191):无符号整数被减到 0 以下会回绕成极大值,常导致超大分配或缓冲区越界。
当无符号整数被减到小于零,或有符号整数越过 INT_MIN 时,结果会回绕为一个极大的正数,这就是整数下溢。经典模式是 len = header_len - prefix_len,其中 prefix_len 由攻击者控制;计算出的巨大 len 会绕过边界检查,引发堆或栈缓冲区溢出,以及越界读取。现实案例包括 libcurl 的 CVE-2018-1000005,以及多个内核网络栈上 size_t 包长度计算下溢的漏洞。缓解措施:使用带显式比较的有符号算术、可检查的减法(__builtin_sub_overflow、std::safe_int)、Rust 调试模式或 Swift 等语言级的溢出陷阱、配合 UBSan 的模糊测试,以及严格的输入验证。
● 示例
- 01
len = total - header_len 在 total < header_len 时回绕为 0xFFFFFFFF,随后被用作 memcpy 长度。
- 02
Linux 内核 CVE-2019-11815:剩余长度减法下溢从而触发 UAF。
● 常见问题
整数下溢 是什么?
一种算术缺陷(CWE-191):无符号整数被减到 0 以下会回绕成极大值,常导致超大分配或缓冲区越界。 它属于网络安全的 攻击与威胁 分类。
整数下溢 是什么意思?
一种算术缺陷(CWE-191):无符号整数被减到 0 以下会回绕成极大值,常导致超大分配或缓冲区越界。
整数下溢 是如何工作的?
当无符号整数被减到小于零,或有符号整数越过 INT_MIN 时,结果会回绕为一个极大的正数,这就是整数下溢。经典模式是 len = header_len - prefix_len,其中 prefix_len 由攻击者控制;计算出的巨大 len 会绕过边界检查,引发堆或栈缓冲区溢出,以及越界读取。现实案例包括 libcurl 的 CVE-2018-1000005,以及多个内核网络栈上 size_t 包长度计算下溢的漏洞。缓解措施:使用带显式比较的有符号算术、可检查的减法(__builtin_sub_overflow、std::safe_int)、Rust 调试模式或 Swift 等语言级的溢出陷阱、配合 UBSan 的模糊测试,以及严格的输入验证。
如何防御 整数下溢?
针对 整数下溢 的防御通常结合技术控制与运营实践,详见上方完整定义。
整数下溢 还有哪些其他名称?
常见的别称包括: 无符号下溢, CWE-191。
● 相关术语
- vulnerabilities№ 543
整数溢出
算术运算产生超出整数类型可表示范围的结果,以回绕或截断的方式带来安全关键影响的缺陷。
- vulnerabilities№ 131
缓冲区溢出
内存安全缺陷:程序写入数据超出已分配缓冲区末尾,破坏相邻内存,常被用于实现代码执行。
- attacks№ 772
越界读取
一种内存安全缺陷(CWE-125),程序读取了预定缓冲区之外的字节,导致相邻内存内容被泄露。
- vulnerabilities№ 667
内存破坏
对一类漏洞的统称:程序在预期内存范围之外读写,破坏类型安全、控制流或数据完整性。
- appsec№ 538
输入校验
在应用处理数据前,服务端检查所有不可信输入是否符合预期的类型、长度、范围、格式和取值集合。