除了整数溢出,还有哪些常见的数据溢出漏洞?

3 人参与

在安全审计的现场,往往会发现“整数溢出”只是冰山一角,真正的风险往往潜伏在更隐蔽的数据写入路径中。下面列举的几类溢出,都是在缺乏严格边界检查时容易被利用的典型。

堆溢出(Heap Overflow)

堆区分配的内存块大小往往由调用方决定,如果malloc后未核对写入长度,攻击者可以在相邻块覆盖元数据,导致自由链(free list)被篡改,从而实现任意代码执行。实际案例中,某开源媒体服务器因为strcpy写入超过预分配的缓冲区,导致堆块指针被覆盖,攻击者成功植入后门。

格式化字符串漏洞(Format String)

printf等函数直接使用用户可控的字符串作为格式化模板时,%n、%x等占位符会把栈上的数据写回任意地址。只要攻击者掌握了足够的栈布局信息,就能在目标进程的关键函数指针上写入自己控制的地址,实现提权或远程代码执行

数组越界写(Out‑of‑Bounds Write)

数组下标检查缺失是最常见的错误之一。比如在处理网络报文时,仅凭报文长度字段决定写入偏移,却未校验实际长度,导致写入超出数组边界。此类漏洞往往被用于覆盖结构体中的函数指针或返回地址,攻击路径与传统缓冲区溢出类似,却不需要大量的填充字节。

类型混淆导致的溢出(Type Confusion)

在语言层面,某些运行时会把对象指针强制转换为不同类型,例如把Object*当成char*进行拷贝。如果对象实际大小远小于目标类型的预期,拷贝操作会写出对象边界,形成溢出。此类缺陷在移动端 SDK 中屡见不鲜,往往在逆向分析时被忽视。

综上所述,数据溢出并非只限于整数运算,堆、格式化字符串、数组下标以及类型混淆都可能成为攻击者的突破口。面对这些风险,审计过程必须对每一次内存写入进行严格的长度和类型校验,才能把“看不见的漏洞”彻底拦截。

参与讨论

3 条评论
  • 季风笔记

    堆溢出这块我上次调代码也踩过坑,内存对齐没注意就崩了

    回复
  • 白夜骑士

    那要是用自定义的内存池还能防住格式化字符串攻击吗?

    回复
  • 狐妖小红

    除了这些,是不是还有结构体填充导致的溢出问题?🤔

    回复