CWE-122: Heap-based Buffer Overflow(堆缓冲区溢出)

本文探讨了堆溢出这一缓冲区溢出的情形,特别是在C和C++编程语言中使用malloc等函数分配内存时的问题。文中提供了两个示例代码,展示了如何由于缺乏有效的边界检查而导致潜在的安全漏洞。文章还讨论了堆溢出可能导致的后果,如拒绝服务攻击和未经授权的代码执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 ID: 122

类型:变量
结构:简单

状态:草稿

 

+描述

堆溢出是缓冲区溢出的一种情形,分配到内存的堆部分的缓冲区被覆盖的,通常意味着缓冲区是使用malloc()等函数分配的内存。

+相关视图

+与“研究层面”视图(CWE-1000)相关

+与“开发层面”视图(CWE-699)相关

+引入模式

阶段

说明

架构与设计

 

实现

 

+应用平台

语言

C (出现的可能性不确定)

C++ (出现的可能性不确定)

+后果

 

范围

冲击

可能性

可用性

技术冲击: DoS: 崩溃、推出或者重启: DoS: 资源消耗(CPU): DoS: 资源消耗 (内存):

缓冲区溢出通常会导致崩溃。其他导致可用性不足的攻击是可能的,包括将程序放入无限循环。

 

完整性
机密性
可用性
访问控制

技术冲击: 执行未获授权的代码或者命令;越过保护机制; 修改内存

缓冲区溢出通常可用于执行任意代码,这通常不在程序的安全策略的范围内。 除了重要的用户数据之外,基于堆的溢出还可以用来覆盖内存中可能存在的函数指针,将其指向攻击者的代码。即使在不显式使用函数指针的应用程序中,运行时通常也会在内存中留下许多。例如,C++中的对象方法通常使用函数指针来实现。即使在C程序中,底层运行时也经常使用全局偏移量表。

 

完整性
机密性
可用性
访问控制
其它

技术冲击: 执行未获授权的代码或者命令;越过保护机制; 其它

当结果是任意代码执行时,这通常可以用来破坏任何其他安全服务。

 

+被利用的可能性:

+示例

例1

虽然堆缓冲区溢出示例可能相当复杂,但也可能非常简单,且可以利用。 堆缓冲区溢出:

(问题代码)

Example Language:

#define BUFSIZE 256
int main(int argc, char **argv) {

char *buf;
buf = (char *)malloc(sizeof(char)*BUFSIZE);
strcpy(buf, argv[1]);

}

缓冲区是以固定大小分配的堆内存,但不能保证argv[1]中的字符串不会超过此大小并导致溢出。

例2

此示例将编码过程应用于输入字符串,并将其存储到缓冲区中。

(问题代码)

Example Language:

char * copy_input(char *user_supplied_string){

int i, dst_index;
char *dst_buf = (char*)malloc(4*sizeof(char) * MAX_SIZE);
if ( MAX_SIZE <= strlen(user_supplied_string) ){

die("user string too long, die evil hacker!");

}
dst_index = 0;
for ( i = 0; i < strlen(user_supplied_string); i++ ){

if( '&' == user_supplied_string[i] ){

dst_buf[dst_index++] = '&';
dst_buf[dst_index++] = 'a';
dst_buf[dst_index++] = 'm';
dst_buf[dst_index++] = 'p';
dst_buf[dst_index++] = ';';

}
else if ('<' == user_supplied_string[i] ){


/* encode to &lt; */

}
else dst_buf[dst_index++] = user_supplied_string[i];

}
return dst_buf;

}

程序员试图对用户控制的字符串中的符号和字符进行编码,但是在应用编码过程之前,字符串的长度会得到验证。此外,程序员假定编码扩展只将给定字符扩展4倍,而‘&’号的编码扩展5倍。因此,当编码过程扩展字符串时,如果攻击者提供一个包含多个‘&’符号的字符串,则可能溢出目标缓冲区。

+应对措施

预设计: 使用执行自动边界检查的语言或编译器。

阶段: 架构与设计

使用精简库以便舍弃有风险的API。不是一个完整的解决方案。 使用精简库以便舍弃有风险的API。不是一个完整的解决方案。

阶段: 编译及链接

通过构建进行预设计:金丝雀风格的边界检查、确保块数据有效性的库更改以及其他此类修复是可能的,但不应完全依赖于此。

 

阶段: 实现

对于输入数据实现并执行边界检查。

阶段: 实现

策略: 库或者框架

不要使用诸如get之类的危险功能。寻找他们的具备边检检查的安全等价函数。

阶段: 操作

使用操作系统级别的预防功能。这不是一个完整的解决方案,但它提供了一些深入的防御。

+种属

 

关系

类型

ID

名称

属于

970

SFP Secondary Cluster: Faulty Buffer Access

属于

1161

SEI CERT C Coding Standard - Guidelines 07. Characters and Strings (STR)

+说明

相关弱点

堆缓冲区溢出通常与栈缓冲区溢出同样危险。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值