ID: 789 类型:变量 | 状态:草稿 |
描述
软件根据不受信任的大小值分配内存,但它不会验证或错误地验证大小,从而允许分配任意数量的内存。
相关视图
"研究概念"视图 (CWE-1000)
Nature | Type | ID | Name |
ChildOf | 20 | ||
ChildOf | 770 | ||
CanFollow | 129 | ||
CanPrecede | 476 |
"开发概念"视图 (CWE-699)
Nature | Type | ID | Name |
ChildOf | 770 |
引入模式
阶段 | 说明 |
实现 | |
架构与设计 | |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
Class: Language-Independent (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
可利用性 | 技术冲击: DoS: 资源消耗 (内存): 不控制内存分配会导致对系统内存的请求过多,可能会导致应用程序因内存不足或系统上大量内存的消耗而崩溃。 | |
被利用的可能性:
低
示例
例1
考虑下面的代码,它接受一个不受信任的大小值,并分配一个缓冲区来包含一个给定大小的字符串。
(问题代码)
Example Language: C
unsigned int size = GetUntrustedInt();
/* ignore integer overflow (CWE-190) for this example */
unsigned int totBytes = size * sizeof(char);
char *string = (char *)malloc(totBytes);
InitializeString(string);
假设攻击给给出下面的大小数值:
12345678
这将导致为字符串分配305419896字节(超过291兆字节)。
例2
考虑下面的代码,它接受不受信任的大小值,并将大小用作哈希映射的初始容量。
(问题代码)
Example Language: Java
unsigned int size = GetUntrustedInt();
HashMap list = new HashMap(size);
hashmap构造函数将验证初始容量是否为负,但是没有检查到位以验证是否存在足够的内存。如果攻击者提供足够大的值,应用程序将遇到OutofMemoryError。
例3
以下代码获取一个不受信任的数字,该数字用作消息数组的索引。
(问题代码)
Example Language: Perl
my $num = GetUntrustedNumber();
my @messages = ();
$messages[$num] = "Hello World";
索引根本没有经过验证(CWE-129),因此攻击者可能会修改@messages中的非预期元素。如果使用的索引大于数组的当前大小,则Perl解释器会自动扩展数组,使大索引正常工作。
如果$num是一个大值,例如2147483648(1<<31),那么对$messages[$num]的赋值将尝试创建一个非常大的数组,然后最终生成一个错误消息,例如:
数组扩展期间内存不足
内存耗尽将导致Perl程序退出,可能是拒绝服务。此外,内存不足还可能阻止许多其他程序在系统上成功运行。
应对措施
阶段: 实现; 架构与设计 针对影响分配内存量的任何值执行适当的验证输入。为处理超出限制的请求定义适当的策略,并考虑支持配置选项,以便管理员可以在必要时扩展要使用的内存量 |
阶段: 操作 使用系统提供的内存资源限制运行程序。这可能仍然会导致程序崩溃或退出,但对系统其余部分的影响将最小化。 |
种属
关系 | 类型 | ID | 名称 |
属于 | 1131 | ||
属于 | 1162 | SEI CERT C Coding Standard - Guidelines 08. Memory Management (MEM) |
说明
应用平台
在许多方面,不可控制的内存分配是可能的,例如Perl中的动态数组分配或Java中集合中的初始大小参数。然而,像C和C++这样的编程人员有能力更直接地控制内存管理,将更容易受到影响。
相关弱点
这种弱点与整数溢出(CWE-190)密切相关。整数溢出攻击将集中于提供一个非常大的数字,该数字会触发导致分配的内存比预期的少的溢出。通过提供不触发整数溢出的大值,攻击者仍然可能导致分配过多的内存。