ID: 122 类型:变量 | 状态:草稿 |
描述
堆溢出是缓冲区溢出的一种情形,分配到内存的堆部分的缓冲区被覆盖的,通常意味着缓冲区是使用malloc()等函数分配的内存。
相关视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
架构与设计 | |
实现 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
可用性 | 技术冲击: DoS: 崩溃、推出或者重启: DoS: 资源消耗(CPU): DoS: 资源消耗 (内存): 缓冲区溢出通常会导致崩溃。其他导致可用性不足的攻击是可能的,包括将程序放入无限循环。 | |
完整性 | 技术冲击: 执行未获授权的代码或者命令;越过保护机制; 修改内存 缓冲区溢出通常可用于执行任意代码,这通常不在程序的安全策略的范围内。 除了重要的用户数据之外,基于堆的溢出还可以用来覆盖内存中可能存在的函数指针,将其指向攻击者的代码。即使在不显式使用函数指针的应用程序中,运行时通常也会在内存中留下许多。例如,C++中的对象方法通常使用函数指针来实现。即使在C程序中,底层运行时也经常使用全局偏移量表。 | |
完整性 | 技术冲击: 执行未获授权的代码或者命令;越过保护机制; 其它 当结果是任意代码执行时,这通常可以用来破坏任何其他安全服务。 |
被利用的可能性:
高
示例
例1
虽然堆缓冲区溢出示例可能相当复杂,但也可能非常简单,且可以利用。 堆缓冲区溢出:
(问题代码)
Example Language: C
#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: C
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 < */
}
else dst_buf[dst_index++] = user_supplied_string[i];
}
return dst_buf;
}
程序员试图对用户控制的字符串中的符号和字符进行编码,但是在应用编码过程之前,字符串的长度会得到验证。此外,程序员假定编码扩展只将给定字符扩展4倍,而‘&’号的编码扩展5倍。因此,当编码过程扩展字符串时,如果攻击者提供一个包含多个‘&’符号的字符串,则可能溢出目标缓冲区。
应对措施
预设计: 使用执行自动边界检查的语言或编译器。 |
阶段: 架构与设计 使用精简库以便舍弃有风险的API。不是一个完整的解决方案。 使用精简库以便舍弃有风险的API。不是一个完整的解决方案。 |
阶段: 编译及链接 通过构建进行预设计:金丝雀风格的边界检查、确保块数据有效性的库更改以及其他此类修复是可能的,但不应完全依赖于此。
|
阶段: 实现 对于输入数据实现并执行边界检查。 |
阶段: 实现 策略: 库或者框架 不要使用诸如get之类的危险功能。寻找他们的具备边检检查的安全等价函数。 |
阶段: 操作 使用操作系统级别的预防功能。这不是一个完整的解决方案,但它提供了一些深入的防御。 |
种属
关系 | 类型 | ID | 名称 |
属于 | | 970 | |
属于 | | 1161 | SEI CERT C Coding Standard - Guidelines 07. Characters and Strings (STR) |
说明
相关弱点
堆缓冲区溢出通常与栈缓冲区溢出同样危险。