除了整数溢出,还有哪些常见的数据溢出漏洞?
TOPIC SOURCE
一文带你了解溢出漏洞
在安全审计的现场,往往会发现“整数溢出”只是冰山一角,真正的风险往往潜伏在更隐蔽的数据写入路径中。下面列举的几类溢出,都是在缺乏严格边界检查时容易被利用的典型。
堆溢出(Heap Overflow)
堆区分配的内存块大小往往由调用方决定,如果malloc后未核对写入长度,攻击者可以在相邻块覆盖元数据,导致自由链(free list)被篡改,从而实现任意代码执行。实际案例中,某开源媒体服务器因为strcpy写入超过预分配的缓冲区,导致堆块指针被覆盖,攻击者成功植入后门。
格式化字符串漏洞(Format String)
当printf等函数直接使用用户可控的字符串作为格式化模板时,%n、%x等占位符会把栈上的数据写回任意地址。只要攻击者掌握了足够的栈布局信息,就能在目标进程的关键函数指针上写入自己控制的地址,实现提权或远程代码执行。
数组越界写(Out‑of‑Bounds Write)
数组下标检查缺失是最常见的错误之一。比如在处理网络报文时,仅凭报文长度字段决定写入偏移,却未校验实际长度,导致写入超出数组边界。此类漏洞往往被用于覆盖结构体中的函数指针或返回地址,攻击路径与传统缓冲区溢出类似,却不需要大量的填充字节。
类型混淆导致的溢出(Type Confusion)
在语言层面,某些运行时会把对象指针强制转换为不同类型,例如把Object*当成char*进行拷贝。如果对象实际大小远小于目标类型的预期,拷贝操作会写出对象边界,形成溢出。此类缺陷在移动端 SDK 中屡见不鲜,往往在逆向分析时被忽视。
综上所述,数据溢出并非只限于整数运算,堆、格式化字符串、数组下标以及类型混淆都可能成为攻击者的突破口。面对这些风险,审计过程必须对每一次内存写入进行严格的长度和类型校验,才能把“看不见的漏洞”彻底拦截。

参与讨论
堆溢出这块我上次调代码也踩过坑,内存对齐没注意就崩了
那要是用自定义的内存池还能防住格式化字符串攻击吗?
除了这些,是不是还有结构体填充导致的溢出问题?🤔