cwe - 131:不正确的缓冲区大小的计算
视图定制的信息:
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
相关的视图”研究概念”(cwe - 1000)
相关观点“软件开发”(cwe - 699)
简化映射的相关视图”缺点漏洞发布”(cwe - 1003)
相关的视图”方案及质量的措施(2020)”(CWE-1305)
相关的视图”方案及数据保护措施”(cwe - 1340)
该清单显示了给定的弱点可以可能的地区出现。这些可能是为特定命名的语言,操作系统,架构、模式、技术、或一个类这样的平台。列出的平台是随着频率的出现疲态实例。
语言 C患病率(待定) c++患病率(待定)
这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
示例1 下面的代码分配内存的最大数量的小部件。然后获得指定数量的小部件,确保用户不要求太多。然后初始化数组的元素使用InitializeWidget ()。因为小部件的数量可以为每个请求不同,插入一个空指针的代码意味着最后一个部件的位置。
(坏的代码)
例如语言:C
int我;
unsigned int numWidgets; 小部件* * WidgetList; numWidgets = GetUntrustedSizeValue (); 如果((numWidgets = = 0) | | (numWidgets > MAX_NUM_WIDGETS)) {
ExitError(“不正确的请求数量的小部件!”); }WidgetList =(小部件* *)malloc (numWidgets * sizeof(小部件*)); printf (" WidgetList ptr = % p \ n ", WidgetList); (我= 0;我< numWidgets;我+ +){
WidgetList[我]= InitializeWidget (); }WidgetList [numWidgets] =零; showWidgets (WidgetList); 然而,这段代码包含一个这些计算错误(-cwe - 193)。它分配足够的空间来包含指定数量的部件,但不包括空指针的空间。因此,分配缓冲区比它应该是(小cwe - 131)。如果用户请求MAX_NUM_WIDGETS,有一个界外写(cwe - 787当零分配。根据环境和编译设置,这可能会导致内存泄露。 示例2 以下为图像图像处理代码分配一个表。
(坏的代码)
例如语言:C
img_t table_ptr;/ *结构包含img数据,每个* / 10 kb
int num_imgs; … num_imgs = get_num_imgs (); table_ptr = (img_t *) malloc (sizeof (img_t) * num_imgs); … 这段代码将分配一个表大小num_imgs,然而随着num_imgs越来越大,计算确定的大小最终会溢出列表(cwe - 190)。这将导致一个非常小的列表来分配。如果后续代码运行在名单上,就好像它是num_imgs长,这可能会导致许多类型的界外问题(cwe - 119)。 示例3 这个例子中一个编码过程适用于一个输入字符串并将其存储到缓冲区。
(坏的代码)
例如语言:C
char * copy_input (char * user_supplied_string) {
int i, dst_index;
char * dst_buf = (char *) malloc (4 * sizeof (char) * MAX_SIZE); 如果(MAX_SIZE < = strlen (user_supplied_string)) {
死亡(“用户字符串太长,死亡邪恶的黑客!”); }dst_index = 0; (我= 0;我< strlen (user_supplied_string);我+ +){
如果(' & ' = = user_supplied_string[我]){
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[我]){ / * & lt编码;* / 其他dst_buf [dst_index + +] = user_supplied_string[我]; 返回dst_buf; 程序员试图编码用户控制的&字符字符串,然而字符串的长度编码应用程序之前进行验证。此外,程序员假定编码扩张只会扩大给定字符的4倍,而编码&扩展的5。结果,当编码过程扩展了字符串可以溢出目的地缓冲区,如果攻击者提供了许多与符号的字符串。 示例4 下面的代码是为了从套接字读取传入数据包和提取一个或多个标题。
(坏的代码)
例如语言:C
DataPacket *包;
int numHeaders; PacketHeader *头; 袜子= AcceptSocketConnection (); ReadPacket(包、袜子); numHeaders =包- >标题; 如果(numHeaders > 100) {
ExitError(“太多的头!”); }头= malloc (numHeaders * sizeof (PacketHeader); ParsePacketHeaders(包、头); 代码执行一个检查,确保包不包含太多的头。然而,numHeaders被定义为int签署,所以它可以是负数。如果传入的数据包指定一个值,如3,然后malloc计算将产生一个负数(-300年说,如果每个标题最多可达100个字节)。当这个结果提供给malloc(),它是第一个转换为size_t类型。这种转换然后产生一个较大的值,如4294966996,这可能导致malloc()失败或分配极其大量的内存(cwe - 195)。用适当的负数,攻击者可以诱骗malloc()使用一个非常小的正数,然后分配一个缓冲区,远小于预期,可能导致缓冲区溢出。 示例5 下面的代码尝试将三种不同的身份证号码保存到一个数组。的数组分配内存使用调用malloc ()。
(坏的代码)
例如语言:C
int * id_sequence;
/ *为三个id的数组分配空间。* / id_sequence = (int *) malloc (3); 如果(id_sequence = = NULL)退出(1); / *填充id数组。* / id_sequence [0] = 13579; id_sequence [1] = 24680; id_sequence [2] = 97531; 上面的代码的问题是尺寸参数的值中使用malloc()调用。它使用一个值为“3”,根据定义的结果要创建三个字节的缓冲区。然而,目的是创建一个缓冲区,拥有三个整数,并在C语言中,每一个int需要4个字节的内存,因此需要12字节的数组,每个int 4字节。执行上面的代码可能导致缓冲区溢出12字节的数据被保存到3个字节的空间分配。溢出发生在转让id_sequence[0],并将继续转让id_sequence[1]和id_sequence [2]。 malloc()调用可以使用“3 * sizeof (int)”作为大小的值参数来分配正确的所需的空间来存储三个整数。
这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
更多的信息是可用的,请选择一个不同的过滤器。
|
使用常见的弱点枚举(CWE)和相关的引用从这个网站的使用条款。CWE赞助的美国国土安全部(DHS)网络和基础设施安全机构(CISA)和管理的国土安全系统工程和发展研究所这是由(HSSEDI)manbetx客户端首页(斜方)。版权©2006 - 2023,斜方公司。manbetx客户端首页CWE、水煤浆、CWRAF, CWE标志是斜方公司的商标。manbetx客户端首页 |