CWE

普遍的弱点

社区开发的软件和硬件弱点类型清单

2021 CWE最重要的硬件弱点
CWE前25个最危险的弱点
>CWE列表> cwe-单个字典定义(4.10)
ID

CWE-789:内存分配,尺寸过多

弱点ID:789
抽象:变体
结构:简单的
查看自定义信息:
+描述
该产品基于不信任的大尺寸值分配内存,但不能确保大小在预期的范围内,从而允许分配任意内存量。
+替代条款
堆栈精疲力尽:
当弱点在堆栈上分配过多的记忆时,通常被描述为“堆栈疲惫”,这是弱点的技术影响。由于CWE-789和/或CWE-1325
+关系
部分帮助该表显示了与该弱点相关的弱点和高级类别。这些关系定义为childof,parentof,ementof,并深入了解可能存在于较高和较低抽象水平的类似项目。此外,定义了诸如Peerof和Canalsobe之类的关系,以显示用户可能想要探索的类似弱点。
+与观点“研究概念”相关(CWE-1000)
自然 类型 ID 姓名
Childof 根据基础 - 仍然主要独立于资源或技术的弱点,但有足够的细节来提供特定的检测和预防方法。基本水平的弱点通常用以下维度的2或3来描述问题:行为,财产,技术,语言和资源。 1284 输入中指定数量的验证不当
Childof 根据基础 - 仍然主要独立于资源或技术的弱点,但有足够的细节来提供特定的检测和预防方法。基本水平的弱点通常用以下维度的2或3来描述问题:行为,财产,技术,语言和资源。 770 资源分配而无需限制或限制
peerof 根据基础 - 仍然主要独立于资源或技术的弱点,但有足够的细节来提供特定的检测和预防方法。基本水平的弱点通常用以下维度的2或3来描述问题:行为,财产,技术,语言和资源。 1325 不当控制的顺序内存分配
可以按照 变体变体 - 与某种类型的产品相关的弱点,通常涉及特定的语言或技术。比基本弱点更具体。变体级别的弱点通常以以下维度的3到5来描述问题:行为,财产,技术,语言和资源。 129 数组索引的验证不当
canpreceede 根据基础 - 仍然主要独立于资源或技术的弱点,但有足够的细节来提供特定的检测和预防方法。基本水平的弱点通常用以下维度的2或3来描述问题:行为,财产,技术,语言和资源。 476 空指针解除
+介绍模式
部分帮助引言的不同模式提供了有关如何以及何时引入这种弱点的信息。该阶段识别可能发生介绍的生命周期中的一个点,而音符提供了与给定阶段中引言有关的典型情况。
阶段 笔记
执行
+适用的平台
部分帮助该清单显示了可能出现的弱点的可能区域。这些可能适用于特定的命名语言,操作系统,体系结构,范式,技术或一类此类平台。该平台与给定弱点出现在该实例的频率一起列出。

语言

C(不确定的患病率)

C ++(不确定的患病率)

班级:不是特定语言的(不确定的患病率)

+常见后果
部分帮助该表指定与弱点相关的不同个人后果。该范围确定了违反的应用程序安全区域,而影响描述了如果对手成功利用这一弱点,就会产生负面的技术影响。其可能性提供了有关预期相对于列表中其他后果的特定后果的可能性的信息。例如,可能会利用弱点来实现一定的影响,但很可能会利用它来实现不同的影响。
范围 影响 可能性
可用性

技术影响:DOS:资源消耗(内存)

不控制内存分配可能会导致要求过多的系统内存,这可能导致由于存储外条件或系统上大量内存的消耗而导致应用程序崩溃。
+示例的例子

示例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);//违反序言长度的假设,最终以负值,吹出堆栈
+观察到的例子
参考 描述
链:Python库不限制用于处理指定大量频段的图像的资源(CWE-1284),导致过度记忆消耗(CWE-789)或整数溢出(CWE-190)。
程序使用:: alloca()用于编码消息,但是大消息触发了segfault
通过在长度字段中指定大价值,记忆消耗和守护程序退出
长度字段中的大价值会导致内存消耗和崩溃,当没有更多的内存可用
当调整功能无法分配足够的内存时,游戏程序中的大键大小触发崩溃
大型内容长度HTTP标头值触发应用程序在即时消息应用程序中崩溃,因为内存分配失败
+潜在的缓解

阶段:实施;建筑和设计

对任何影响分配的内存量的值执行足够的输入验证。定义一个适当的策略,用于处理超过限制的请求,并考虑支持配置选项,以便管理员可以在必要时扩展要使用的内存量。

阶段:操作

使用系统提供的资源限制来运行您的程序。这可能仍会导致该程序崩溃或退出,但是对系统的其余部分的影响将最小化。
+弱点
条件 描述
基本的
(弱点独立于其他弱点的地方)
结果
(弱点通常与其他一些弱点有关)
+会员资格
部分帮助此成员关系表显示了其他CWE类别和视图,将此弱点称为成员。该信息通常可用于理解弱点适合外部信息源的何处。
自然 类型 ID 姓名
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 1131 CISQ质量措施(2016年) - 安全性
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 1162 SEI CERT C编码标准 - 指南08.内存管理(MEM)
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 1179 SEI CERT PERL编码标准 - 指南01.输入验证和数据消毒(IDS)
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 1308 CISQ质量措施 - 安全性
+笔记

关系

这种弱点可能与整数溢出密切相关(CWE-190)。整数溢出攻击将集中于提供一个极大的数量,该数字触发溢出,从而导致内存少于预期。通过提供不会触发整数溢出的大价值,攻击者仍然可以导致分配过多的内存。

适用平台

在许多语言中,不受控制的内存分配是可能的,例如perl中的动态数组分配或Java集合中的初始大小参数。但是,像C和C ++这样的语言更容易直接控制内存管理。

+分类映射
映射的分类名称 节点ID 合身 映射的节点名称
WASC 35 肥皂阵列滥用
证书C安全编码 MEM35-C 不精确 为对象分配足够的内存
SEI CERT PERL编码标准 IDS32-PL 不精确 验证任何用作数组索引的整数
OMG ASCSM ASCSM-CWE-789
+参考
[Ref-62] Mark Dowd,John McDonald和Justin Schuh。“软件安全评估的艺术”。第10章,“资源限制”,第574页。第一版。艾迪生·卫斯理。2006。
[Ref-962]对象管理组(OMG)。“自动源代码安全度量(ASCSM)”。ASCSM-CWE-789。2016-01。<http://www.omg.org/spec/ascsm/1.0/>。
+内容历史记录
+提交
提交日期 提交者 组织
2009-10-21 CWE内容团队 MITER
+修改
修改日期 修饰符 组织
2010-02-16 CWE内容团队 MITER
更新的分类法_ mappings
2011-03-29 CWE内容团队 MITER
更新的common_ccessquences,obsoved_examples
2011-06-01 CWE内容团队 MITER
更新的common_cconsquences
2012-05-11 CWE内容团队 MITER
更新的引用
2017-11-08 CWE内容团队 MITER
更新了适用的_platforms,gualomy_mappings
2019-01-03 CWE内容团队 MITER
更新的参考,关系,分类_mappings
2019-06-20 CWE内容团队 MITER
更新的关系
2020-02-24 CWE内容团队 MITER
更新的关系
2020-06-25 CWE内容团队 MITER
更新的关系
2020-08-20 CWE内容团队 MITER
更新的关系
2020-12-10 CWE内容团队 MITER
更新的备用_terms,explyative_examples,Description,likelihood_of_exploit,name,obseved_examples,关系,time_of_introduction
2021-03-15 CWE内容团队 MITER
更新的示范_examples,关系
2022-10-13 CWE内容团队 MITER
更新了观察到的examples
+先前的输入名称
改变日期 先前的输入名称
2020-12-10 不受控制的内存分配
提供更多信息 - 请选择其他过滤器。
页面最后更新:2023年1月31日