CWE

常见的弱点枚举

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

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

cwe - 1341:多个版本的相同的资源或处理

弱点ID: 1341
抽象:基地
结构:简单的
视图定制的信息:
+描述
产品试图关闭或释放资源或处理不止一次,没有任何成功打开之间的关闭操作。
+扩展描述

代码通常需要“开放”处理或引用资源如内存、文件、设备、套接字连接,服务,等。当代码完成和使用资源,它通常将“关闭”或“释放”的资源,这表明环境(如操作系统),可以重新分配资源或重用不相关的进程或演员,或者在某些情况下,在相同的过程。API函数或其他抽象通常用于执行此版本,如免费()或删除()在C / c++中,或文件句柄关闭()操作中使用多种语言。

不幸的是,这种api的实现或设计可能期望开发人员负责确保这些api只叫一次每释放资源。如果开发人员试图释放相同的资源/处理不止一次,那么这个API的期望没有得到满足,导致未定义和/或不安全的行为。这可能导致后果,比如内存损坏,数据丢失,执行路径腐败或其他后果。

注意,尽管大多数(如果不是全部的话)的实现资源预订涉及分配一个惟一的标识符/指针/符号引用,如果这个标识符是重用,检查资源的标识符关闭可能会导致一个错误的错误的资源的开放和关闭的状态。出于这个原因,标识符是气馁的重用。

+的关系
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关的视图”研究概念”(cwe - 1000)
自然 类型 ID 的名字
ChildOf 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 675年 在单操作环境中多个操作资源
ParentOf 变体变体——一个弱点与某种类型的产品,通常涉及到一个特定的语言或技术。更具体的比基本的弱点。变异水平弱点通常描述问题的3到5以下维度:行为、财产、技术、语言,和资源。 415年 双自由
CanPrecede 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 672年 过期或释放后操作资源
+模式的介绍
部分帮助不同模式的引入提供了信息如何以及何时可以纳入这一弱点。生命周期的阶段识别点的介绍可能发生,而相关的报告提供了一个典型的场景介绍在给定的阶段。
阶段 请注意
实现
+适用的平台
部分帮助该清单显示了给定的弱点可以可能的地区出现。这些可能是为特定命名的语言,操作系统,架构、模式、技术、或一个类这样的平台。列出的平台是随着频率的出现疲态实例。

语言

Java患病率(待定)

生锈患病率(待定)

类:不是特定于语言的患病率(待定)

C患病率(待定)

c++患病率(待定)

操作系统

类:不使用患病率(待定)

体系结构

类:不是特定于体系结构的患病率(待定)

技术

类:不是特定于技术的患病率(待定)

+常见的后果
部分帮助这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
范围 影响 可能性
可用性
完整性

技术的影响:DoS:崩溃,退出或重新启动

媒介
+示范例子

示例1

这个例子中两次试图关闭一个文件。在某些情况下,C库文件关闭()函数将捕获错误和返回一个错误代码。在其他实现双重释放(cwe - 415)发生,导致程序错误。注意,这里给出的例子是简单,双fclose()调用经常会遍布一个程序,使他们更难找到在代码审查。

(坏的代码)
例如语言:C
字符b [2000];
文件* f = fopen (“dbl_cls。c”、“r”);
如果(f)
{
b [0] = 0;
从文件中读(b 1 sizeof (b) - 1, f);
printf (" % s \ n’”, b);
int r1 = fclose (f);
printf (" \ n - - - - - - - - - - - - - - - - - - \ n1接近完成% d \ n”, r1);

int r2 = fclose (f);/ /双闭
printf(" 2近% d \ n”完成,r2);
}

有多种可能的修复。这解决只有一个叫fclose(),它通常是首选的处理这个问题,但这个简单的方法并不总是可能的。

(好的代码)
例如语言:C
字符b [2000];
文件* f = fopen (“dbl_cls。c”、“r”);
如果(f)
{
b [0] = 0;
从文件中读(b 1 sizeof (b) - 1, f);
printf (" % s \ n’”, b);
int r =文件关闭(f);
printf (" \ n - - - - - - - - - - - - - - - - - - \ n1接近完成% d \ n”, r);
}

这个修复使用国旗叫fclose()只有一次。注意,这个标志是明确的。“f”的变量也可以被使用,因为它将是NULL如果文件不能被打开或一个有效的指针如果文件被成功打开了。如果“f”取代“f_flg”那么“f”后需要设置为NULL第一fclose()调用第二个文件关闭电话永远不会被执行。

(好的代码)
例如语言:C
字符b [2000];
int f_flg = 0;
文件* f = fopen (“dbl_cls。c”、“r”);
如果(f)
{
f_flg = 1;
b [0] = 0;
从文件中读(b 1 sizeof (b) - 1, f);
printf (" % s \ n’”, b);
如果(f_flg)
{
int r1 = fclose (f);
f_flg = 0;
printf (" \ n - - - - - - - - - - - - - - - - - - \ n1接近完成% d \ n”, r1);

}

如果(f_flg)
{
int r2 = fclose (f);/ /双闭
f_flg = 0;
printf(" 2近% d \ n”完成,r2);

}

}

示例2

下面的代码显示了一个简单的双自由漏洞的例子。

(坏的代码)
例如语言:C
char * ptr = (char *) malloc(大小);

如果(abrt) {
免费(ptr);
}

免费(ptr);

双自由漏洞有两个共同的(有时是重叠的)原因:

  • 错误条件和其他特殊情况
  • 混乱的程序负责释放内存的一部分

虽然有些双自由漏洞并不比这个例子更复杂,大多数分布在数百行代码,甚至不同的文件。程序员似乎特别容易释放全局变量不止一次。

+观察到的例子
参考 描述
文件描述符双关闭可能会导致错误的文件被关联到一个文件描述符。
链:信号处理程序包含太多的功能(cwe - 828),引入竞争条件,导致双重免费(cwe - 415)。
双合成摆脱某些错误条件。
+潜在的缓解措施

实施阶段:

修改代码的逻辑,以便资源只收一次。这可能需要简化或重构。此修复小代码块可以是简单的,但是更加困难当多个关闭埋在复杂的条件。

实施阶段:

策略:重构

它可以有效实现国旗时(1)设置资源打开,(2)清除时关闭,(3)之前检查关闭。这种方法可能是有用的在不同的情况下,关闭必须执行。然而,flag-tracking可以增加代码的复杂性,需要由程序员勤奋的遵从性。

实施阶段:

策略:重构

当关闭一个资源时,资源相关联的变量设置为NULL或等值为给定的语言。一些api将忽略这个空值不会造成错误。对于其他api,这可能导致程序崩溃或例外,这可能仍然是比腐化一个意想不到的资源,如内存或数据。

有效性:深度防御

+检测方法

自动静态分析

对于常用的api和资源类型,自动化工具都有签名,可以发现这个问题。

自动动态分析

一些编译器仪表工具如AddressSanitizer(峨山)可以间接检测出这个弱点的一些实例。
+笔记

术语

相关的术语“释放”可能取决于资源的类型,编程语言,规范,或框架。“关闭”也用于释放资源,比如文件描述符和文件句柄。“回归”有时被用来代替。“免费”通常用在当释放内存或缓冲回系统重用。
+引用
(ref - 1198)”——Perldoc浏览器”。<https://perldoc.perl.org/functions/close>。
[ref - 1199]“io -核心工具处理流Python 3.9.7文档”。2021-09-02。<https://docs.python.org/3.9/library/io.html io.IOBase.close>。
[ref - 1200]“FileOutputStream (Java SE 7平台)”。2020年。<https://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html>。
[ref - 1201]“FileOutputStream (Java SE 11 & JDK 11)”。2021年。<https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/FileOutputStream.html>。
+内容的历史
+提交
提交日期 提交者 组织
2021-09-07 CWE内容团队 主教法冠
+修改
修改日期 修饰符 组织
2022-04-28 CWE内容团队 主教法冠
更新Demonstrative_Examples、描述Potential_Mitigations
2022-10-13 CWE内容团队 主教法冠
更新的引用
更多的信息是可用的,请选择一个不同的过滤器。
页面最后更新:2023年1月31日