CWE

常见的弱点枚举

一个由社区开发的软件&硬件缺陷类型的列表

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

cwe - 763:释放无效的指针或引用

弱点ID: 763
抽象:基地
结构:简单的
视图定制的信息:
+描述
产品试图返回系统内存资源,但它调用错误的释放函数或调用适当的释放函数不正确。
+扩展描述

这个弱点可以采取多种形式,如:

  • 内存分配,直接或间接地通过一个使用不同的内存管理方法和分配,不相容的函数(cwe - 762)。
  • 内存管理函数调用或例程选择是合适的,然而他们使用不当,如cwe - 761
+的关系
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关的视图”研究概念”(cwe - 1000)
自然 类型 ID 的名字
ChildOf 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 404年 不当关机或释放资源
ParentOf 变体变体——一个弱点与某种类型的产品,通常涉及到一个特定的语言或技术。更具体的比基本的弱点。变异水平弱点通常描述问题的3到5以下维度:行为、财产、技术、语言,和资源。 761年 免费的指针不在缓冲区的开始
ParentOf 变体变体——一个弱点与某种类型的产品,通常涉及到一个特定的语言或技术。更具体的比基本的弱点。变异水平弱点通常描述问题的3到5以下维度:行为、财产、技术、语言,和资源。 762年 不匹配的内存管理程序
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关观点“软件开发”(cwe - 699)
自然 类型 ID 的名字
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 399年 资源管理错误
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 465年 指针的问题
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+简化映射的相关视图”缺点漏洞发布”(cwe - 1003)
自然 类型 ID 的名字
ChildOf 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 404年 不当关机或释放资源
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关的视图”方案及数据保护措施”(cwe - 1340)
自然 类型 ID 的名字
ChildOf 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 404年 不当关机或释放资源
+模式的介绍
部分帮助不同模式的引入提供了信息如何以及何时可以纳入这一弱点。生命周期的阶段识别点的介绍可能发生,而相关的报告提供了一个典型的场景介绍在给定的阶段。
阶段 请注意
实现
+常见的后果
部分帮助这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
范围 影响 可能性
完整性
可用性
保密

技术的影响:修改内存;DoS:崩溃,退出或重新启动;执行未经授权的代码或命令

这个弱点可能导致腐败的内存,或者指示,可能导致崩溃。如果损坏内存可以有效地控制,可以执行任意代码。
+示范例子

示例1

这段代码尝试标记一个字符串,并将其变成一个数组使用strsep函数,插入一个\ 0字节的空格或制表符。完成循环后,美联社指向一个数组中的每个字符串输入字符串中的位置。

(坏的代码)
例如语言:C
据美联社,char * * * argv [10], * inputstring;
(美联社= argv;(*美联社= strsep (&inputstring \ t)) !) =零;
如果(* *美联社! = ' \ 0 ')
如果(+ + ap > = argv [10])
打破;

/……
免费(美联社[4]);

自strsep不是分配新的内存,释放一个元素的数组相当于免费inputstring中间的指针。

示例2

这个例子分配BarObj对象使用新的操作符在c++中,然而,程序员然后重新分配对象使用免费的(),这可能会导致意想不到的行为。

(坏的代码)
例如语言:c++
空白foo () {
新BarObj BarObj * ptr = ()
/ * ptr这里* /做一些工作



免费(ptr);
}

相反,程序员应该要么创建对象的malloc家庭功能,否则删除对象的删除操作。

(好的代码)
例如语言:c++
空白foo () {
新BarObj BarObj * ptr = ()
/ * ptr这里* /做一些工作



删除ptr;
}

示例3

在这个例子中,程序员动态分配一个缓冲区来保存一个字符串,然后搜索一个特定的角色。完成搜索后,程序员试图释放分配的内存和成功或失败返回给调用者。注意:为了简化,本例中使用硬编码的字符串“搜索我!”和一个常量字符串的长度20。

(坏的代码)
例如语言:C
#定义成功(1)
#定义失败(0)

int contains_char (char c) {
char * str;
str = (char *) malloc (20 * sizeof (char));
strcpy (str,“搜索我!”);
而(* str ! = NULL) {
如果(* str = = c) {

/ *匹配字符,免费字符串并返回成功* /
免费(str);
返回成功;
}
/ *不匹配,增加指针并尝试下一个char * /

str = str + 1;
}
/ *我们不匹配字符的字符串,免费mem和返回失败* /

免费(str);
返回失败;
}

然而,如果字符不是一开始的字符串,或如果它不是字符串,那么指针不会开始的时候当程序员释放缓冲区。

而不是释放缓冲区的指针在中间,程序员可以使用一个索引指针遍历内存或抽象内存计算通过使用数组索引。

(好的代码)
例如语言:C
#定义成功(1)
#定义失败(0)

int cointains_char (char c) {
char * str;
int i = 0;
str = (char *) malloc (20 * sizeof (char));
strcpy (str,“搜索我!”);
虽然(我< strlen (str)) {
如果(str[我]= = c) {

/ *匹配字符,免费字符串并返回成功* /
免费(str);
返回成功;
}
/ *不匹配,增加指针并尝试下一个char * /

我=我+ 1;
}
/ *我们不匹配字符的字符串,免费mem和返回失败* /

免费(str);
返回失败;
}

示例4

考虑下面的代码解析应用程序的上下文中提取命令的用户数据。目的是解析每个命令并将它添加到队列的命令,执行丢弃每个畸形的条目。

(坏的代码)
例如语言:C

/ /硬编码输入长度为简单起见
char *输入= (char *) malloc (40 * sizeof (char));
char *托托;
char * 9 = " \ t”;

get_user_input(输入);

/ *以下循环将解析和处理每个令牌在输入字符串* /

托托= strtok(输入、9月);
而(零! =托托){
如果(isMalformed (tok)) {

* / / *忽视抛弃坏数据
免费(托托);
}
其他{
add_to_command_queue(托托);
}
托托= strtok (NULL, 9月));
}

在上面的代码尝试空闲内存与糟糕的命令,因为分配的内存都是在一块,它必须一起被释放。

解决这个问题的一个方法是将命令复制到一个新的内存位置之前将它们放到队列中。所有命令都被处理之后,可以安全地释放的内存。

(好的代码)
例如语言:C

/ /硬编码输入长度为简单起见
char *输入= (char *) malloc (40 * sizeof (char));
char *托托,*命令;
char * 9 = " \ t”;

get_user_input(输入);

/ *以下循环将解析和处理每个令牌在输入字符串* /

托托= strtok(输入、9月);
而(零! =托托){
如果(! isMalformed(命令)){

/ * * /复制和排队好数据
命令= (char *) malloc ((strlen (tok) + 1) * sizeof (char));
拷贝字符串(命令,托托);
add_to_command_queue(命令);
}
托托= strtok (NULL, 9月));
}

免费(输入)
+潜在的缓解措施

实施阶段:

只调用匹配的内存管理函数。不要混合和匹配的例程。例如,当你和malloc()分配一个缓冲区,处理原始指针与自由的()。

实施阶段:

在c++编程时,考虑使用boost库提供的智能指针来帮助正确和一致地管理内存。

阶段:体系结构和设计

策略:库或框架

使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

例如,glibc Linux提供保护反对自由的无效的指针。

阶段:体系结构和设计

使用一种语言,提供了抽象内存分配和重分配。

测试阶段:

使用一个工具,动态检测内存管理问题,如valgrind。
+影响资源
  • 内存
+会员资格
部分帮助这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
自然 类型 ID 的名字
MemberOf 视图视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。 884年 CWE横截面
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 969年 SFP二级集群:错误的内存释放
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 1237年 SFP主要集群:错误的资源释放
+笔记

维护

视图- 1000相关联的子树,这个弱点需要额外的工作。可能会在这个分支创建几个条目。当前重点是免费的()的内存,但删除和其他相关发布程序可能需要中间条目的创建并非特定于一个特定的函数。此外,其他类型的无效的指针的作用,如过期指针,即cwe - 415双未初始化的指针,自由和释放有关cwe - 457
+分类法映射
映射分类名称 节点ID 适合 映射节点名
软件故障模式 SFP12 错误的内存释放
+引用
[ref - 657]“提高c++库智能指针”。<http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/smart_ptr.htm>。
[ref - 480]“Valgrind”。<http://valgrind.org/>。
+内容的历史
+提交
提交日期 提交者 组织
2009-05-08 CWE内容团队 主教法冠
+修改
修改日期 修饰符 组织
2010-06-21 CWE内容团队 主教法冠
更新描述
2010-09-27 CWE内容团队 主教法冠
更新的关系
2011-06-01 CWE内容团队 主教法冠
更新Common_Consequences
2012-05-11 CWE内容团队 主教法冠
更新Common_Consequences Demonstrative_Examples,关系
2012-10-30 CWE内容团队 主教法冠
更新Potential_Mitigations
2014-02-18 CWE内容团队 主教法冠
更新Potential_Mitigations
2014-07-30 CWE内容团队 主教法冠
更新的关系,Taxonomy_Mappings
2017-11-08 CWE内容团队 主教法冠
更新的关系
2019-06-20 CWE内容团队 主教法冠
更新的关系
2020-02-24 CWE内容团队 主教法冠
更新的关系
2020-12-10 CWE内容团队 主教法冠
更新的关系
2021-03-15 CWE内容团队 主教法冠
更新Maintenance_Notes
2023-01-31 CWE内容团队 主教法冠
更新描述
更多的信息是可用的,请选择一个不同的过滤器。
页面最后更新:2023年1月31日