CWE-789:内存分配,尺寸过多
查看自定义信息:
该表显示了与该弱点相关的弱点和高级类别。这些关系定义为childof,parentof,ementof,并深入了解可能存在于较高和较低抽象水平的类似项目。此外,定义了诸如Peerof和Canalsobe之类的关系,以显示用户可能想要探索的类似弱点。
与观点“研究概念”相关(CWE-1000)
该清单显示了可能出现的弱点的可能区域。这些可能适用于特定的命名语言,操作系统,体系结构,范式,技术或一类此类平台。该平台与给定弱点出现在该实例的频率一起列出。
语言 C(不确定的患病率) C ++(不确定的患病率) 班级:不是特定语言的(不确定的患病率)
该表指定与弱点相关的不同个人后果。该范围确定了违反的应用程序安全区域,而影响描述了如果对手成功利用这一弱点,就会产生负面的技术影响。其可能性提供了有关预期相对于列表中其他后果的特定后果的可能性的信息。例如,可能会利用弱点来实现一定的影响,但很可能会利用它来实现不同的影响。
示例1 考虑以下代码,该代码接受不信任的尺寸值并分配缓冲区以包含给定尺寸的字符串。
(不良代码)
示例语言:C
unsigned int size = getunTrustedInt();
/*忽略整数溢出(CWE-190)示例 */ unsigned int totbytes = size * sizeof(char); char *string =(char *)malloc(totbytes); onironizestring(string); 假设攻击者提供的尺寸值为:
12345678
这将导致305,419,896个字节(超过291兆字节)被分配给字符串。 示例2 考虑以下代码,该代码接受不信任的尺寸值,并将大小用作哈希图的初始容量。
(不良代码)
示例语言:爪哇
unsigned int size = getunTrustedInt();
hashmap list = new hashmap(size); hashmap构造函数将验证初始容量不是负面的,但是没有检查是否存在足够的内存。如果攻击者提供足够大的值,则该应用程序将插入OutofMemoryError。 示例3 该代码根据长度计算执行堆栈分配。
(不良代码)
示例语言:C
int a = 5,b = 6; }size_t len = a -b; char buf [len];//只是炸毁堆栈 由于A和B称为签名INT,因此“ A -B”减法给出了负结果(-1)。但是,由于Len被宣布为未签名,因此Len被铸成一个非常大的正数(在32位系统-4294967295上)。结果,Buffer Buf [Len]声明使用了极大的尺寸来分配堆栈,这可能比整个计算机的存储空间都多。 错误估计通常不会那么明显。计算要么是复杂的,要么是攻击者输入以达到负值的结果。 示例4 此示例显示了典型的尝试,试图解析字符串,该字符串与呼叫者到函数和函数动作之间的假设差异导致错误。
(不良代码)
示例语言:C
int proc_msg(char *s,int msg_len)
{
//注意字符串末端的空间 - 假设所有字符串都有序言带有空间
}int pre_len = sizeof(“ preamble:”); char buf [pre_len -msg_len]; ...如果我们走得太远,请在这里处理 char *s =“ preamble:message \ n”; char *sl = strchr(s,':');//字符数量达到':'(不包括空间) int jnklen = sl == null?0:SL -S;//如果未定义的指针,请使用零长度 int ret_val = proc_msg(“ s”,jnklen);//违反序言长度的假设,最终以负值,吹出堆栈 缓冲长度最终为-1,导致堆积堆积。结肠后的空间特征包含在功能计算中,但不在呼叫者的计算中。不幸的是,这通常不是那么明显,而是存在于一系列钝的计算中。 示例5 以下代码获得了一个不信任的数字,该数字被用作消息数组的索引。
(不良代码)
示例语言:珀尔
我的$ num = getUntrustedNumber();
我的@messages =(); $消息[$ num] =“ Hello World”; 根本没有验证该索引(CWE-129),因此,攻击者可能有可能在@messages中修改不打算的元素。如果使用的索引大于数组的当前大小,则Perl解释器会自动扩展数组,从而使大型索引起作用。 如果$ num是一个很大的值,例如2147483648(1 << 31),那么对$消息[$ num]的分配将尝试创建一个非常大的数组,然后最终产生错误消息,例如: 在数组扩展过程中不记忆 这种内存耗尽将导致Perl程序退出,可能是拒绝服务。此外,缺乏内存也可能阻止许多其他程序在系统上成功运行。 示例6 此示例显示了典型的尝试,试图解析字符串,该字符串与呼叫者到函数和函数动作之间的假设差异导致错误。缓冲区长度最终为-1,导致堆积堆积。结肠后的空间特征包含在功能计算中,但不在呼叫者的计算中。不幸的是,这通常不是那么明显,而是存在于一系列钝的计算中。
(不良代码)
示例语言:C
int proc_msg(char *s,int msg_len)
{
int pre_len = sizeof(“ preamble:”);//注意字符串末端的空间 - 假设所有字符串都有序言带有空间
char buf [pre_len -msg_len];
...在这里处理并设置状态
返回状态; }char *s =“ preamble:message \ n”; char *sl = strchr(s,':');//字符数量达到':'(不包括空间) int jnklen = sl == null?0:SL -S;//如果未定义的指针,请使用零长度 int ret_val = proc_msg(“ s”,jnklen);//违反序言长度的假设,最终以负值,吹出堆栈
(好代码)
示例语言:C
int proc_msg(char *s,int msg_len)
{
int pre_len = sizeof(“ preamble:”);//注意字符串末端的空间 - 假设所有字符串都有序言带有空间
if(pre_len <= msg_len){// log错误;返回error_code;}
char buf [pre_len -msg_len];
...在这里处理并设置状态
返回状态; }char *s =“ preamble:message \ n”; char *sl = strchr(s,':');//字符数量达到':'(不包括空间) int jnklen = sl == null?0:SL -S;//如果未定义的指针,请使用零长度 int ret_val = proc_msg(“ s”,jnklen);//违反序言长度的假设,最终以负值,吹出堆栈
此成员关系表显示了其他CWE类别和视图,将此弱点称为成员。该信息通常可用于理解弱点适合外部信息源的何处。
关系
这种弱点可能与整数溢出密切相关(CWE-190)。整数溢出攻击将集中于提供一个极大的数量,该数字触发溢出,从而导致内存少于预期。通过提供不会触发整数溢出的大价值,攻击者仍然可以导致分配过多的内存。
适用平台 在许多语言中,不受控制的内存分配是可能的,例如perl中的动态数组分配或Java集合中的初始大小参数。但是,像C和C ++这样的语言更容易直接控制内存管理。
提供更多信息 - 请选择其他过滤器。
|
使用共同弱点枚举(CWE)和本网站的相关参考使用条款。CWE由美国国土安全部(DHS)网络安全和基础设施安全局(CISA),由国土安全系统工程和开发研究所(HSSEDI)由manbetx客户端首页(MITER)。版权所有©2006–2023,Miter Comanbetx客户端首页rporation。CWE,CWSS,CWRAF和CWE徽标是Miter Corporation的商标。manbetx客户端首页 |