CWE

常见的弱点枚举

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

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

cwe - 252:不返回值

弱点ID: 252
抽象:基地
结构:简单的
视图定制的信息:
+描述
产品不会检查方法或函数返回值,可以防止检测意想不到的状态和条件。
+扩展描述
两个常见的程序员的假设是“这个函数调用不能失败”和“没关系”如果这个函数调用失败。如果攻击者可以强制函数失败或预计不会返回一个值,那么后续的程序逻辑可能导致脆弱,因为产品不是程序员假定。例如,如果程序调用一个函数放弃特权,但不检查返回代码以确保特权被成功了,那么程序将继续运行更高的特权。
+的关系
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关的视图”研究概念”(cwe - 1000)
自然 类型 ID 的名字
ChildOf 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 754年 不适当的检查异常或异常情况
PeerOf 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 273年 检查了不当的特权
CanPrecede 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 476年 空指针废弃
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关观点“软件开发”(cwe - 699)
自然 类型 ID 的名字
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 389年 错误条件,返回值,状态代码
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+简化映射的相关视图”缺点漏洞发布”(cwe - 1003)
自然 类型 ID 的名字
ChildOf 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 754年 不适当的检查异常或异常情况
+背景细节
许多函数会返回一些关于他们的行动的成功的价值。这将提醒程序是否处理函数的任何错误造成的。
+模式的介绍
部分帮助不同模式的引入提供了信息如何以及何时可以纳入这一弱点。生命周期的阶段识别点的介绍可能发生,而相关的报告提供了一个典型的场景介绍在给定的阶段。
阶段 请注意
实现
+适用的平台
部分帮助该清单显示了给定的弱点可以可能的地区出现。这些可能是为特定命名的语言,操作系统,架构、模式、技术、或一个类这样的平台。列出的平台是随着频率的出现疲态实例。

语言

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

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

技术的影响:意想不到的状态;DoS:崩溃,退出或重新启动

一个意想不到的返回值可以将系统的状态可能导致崩溃或其他意想不到的行为。
+利用的可能性
+示范例子

示例1

考虑下面的代码段:

(坏的代码)
例如语言:C
char buf [10], cp_buf [10];
fgets (buf 10 stdin);
strcpy (cp_buf buf);

程序员预计,当fgets()返回,但将包含一个以null结尾的字符串长度为9的或更少。但如果发生I / O错误,fgets()不会null-terminate缓冲区。此外,如果到达文件的末尾读取任何字符之前,fgets()返回而无需编写任何缓冲区。在这两种情况下,fgets()信号,发生了一些不寻常的东西通过返回NULL,但是在这段代码中,警告不会被注意到。缺乏一个空终结者buf会导致缓冲区溢出在随后调用strcpy ()。

示例2

在下面的示例中,可以要求memcpy比假定移动更大的内存段:

(坏的代码)
例如语言:C
int returnChunkSize (void *) {

/ *如果块信息有效,返回可用内存的大小,

*,返回1表示一个错误

* /
}
int main () {

memcpy (destBuf srcBuf (returnChunkSize (destBuf) 1));
}

如果returnChunkSize()碰巧遇到一个错误将返回1。注意,返回值不是之前检查memcpy操作(cwe - 2521),所以可以作为尺寸参数传递给memcpy () (cwe - 805)。因为memcpy()假设值是无符号,它将被视为MAXINT-1 (cwe - 195),因此将远比可能可用内存复制到目标缓冲区(cwe - 787,cwe - 788)。

示例3

下面的代码不检查内存分配成功之前使用malloc()返回的指针。

(坏的代码)
例如语言:C
buf = (char *) malloc (req_size);
strncpy (buf转送,req_size);

这个编码错误的传统防御是:“如果我的程序运行的内存,它就会失败。不管我是否处理错误的或允许程序模段错误当试图废弃空指针”。This argument ignores three important considerations:

  • 取决于应用程序的类型和大小,它可能会释放内存,在其他地方使用,以便能继续执行。
  • 程序执行不可能如果需要体面地退出。如果程序执行一个原子操作,它可以让系统处于不一致的状态。
  • 程序员已经失去了机会来记录诊断信息。并调用malloc()失败,因为req_size太大或因为有太多的请求被处理在同一时间吗?还是内存泄漏造成的,随着时间的推移建立?没有处理错误,就没有办法知道。

示例4

下面的示例文件读入一个字节数组。

(坏的代码)
例如语言:c#
char[]中byteArray = new char [1024];
(IEnumerator i = users.GetEnumerator ();i.MoveNext (); i.Current ()) {
字符串的用户名=(字符串)i.Current ();
字符串pFileName = PFILE_ROOT + " +用户名;
StreamReader sr = new StreamReader (pFileName);
sr.Read(中byteArray, 0, 1024); / /总是1 k字节的文件
sr.Close ();
processPFile(用户名、中byteArray);
}
(坏的代码)
例如语言:Java
FileInputStream fis;
byte[]中byteArray =新字节[1024];
迭代器(i = users.iterator ();i.hasNext ();) {
字符串的用户名=(字符串)i.next ();
字符串pFileName = PFILE_ROOT + " +用户名;
FileInputStream fis = new FileInputStream (pFileName);
fis.read(中byteArray);/ /文件总是1 k字节
fis.close ();
processPFile(用户名、中byteArray);

代码遍历一组用户,阅读一个私人数据文件为每个用户。程序员总是假设文件1 kb大小,因此忽略了阅读()的返回值。如果攻击者可以创建一个小文件,程序将回收的其余部分之前的数据用户和治疗它,好像它属于攻击者。

示例5

下面的代码并没有检查getParameter()返回的字符串为空在调用成员函数之前compareTo(),可能导致零废弃。

(坏的代码)
例如语言:Java
字符串itemName = request.getParameter (ITEM_NAME);
如果(itemName.compareTo (IMPORTANT_ITEM) = = 0) {
}

下面的代码不检查返回的字符串是否在调用成员函数之前项目属性为空=(),可能导致零废弃。

(坏的代码)
例如语言:Java
字符串itemName = request.Item (ITEM_NAME);
如果(itemName.Equals (IMPORTANT_ITEM)) {
}

传统的防御这个编码错误的方法是:“我知道请求的值将总是存在,因为....如果它不存在,程序不能执行所需的行为,所以不管我处理错误的或允许程序死非关联化一个null值。”But attackers are skilled at finding unexpected paths through programs, particularly when exceptions are involved.

例子6

下面的代码显示了一个系统属性设置为null,后来引用时的程序员错误地假定它将总是被定义。

(坏的代码)
例如语言:Java
System.clearProperty (“os.name”);

字符串操作系统= System.getProperty (“os.name”);
如果(os)。equalsIgnoreCase (Windows 95)) system . out。println(“不支持”);

传统的防御这个编码错误的方法是:“我知道请求的值将总是存在,因为....如果它不存在,程序不能执行所需的行为,所以不管我处理错误的或允许程序死非关联化一个null值。”But attackers are skilled at finding unexpected paths through programs, particularly when exceptions are involved.

例7

下面的VB。NET代码不会检查,以确保它从myfile.txt读取50字节。这可能会导致DoDangerousOperation()来操作一个意想不到的价值。

(坏的代码)
例如语言:c#
昏暗的MyFile MyFile新文件流”。txt”, FileMode。开放,FileAccess。读取、FileShare.Read)
暗MyArray(50)字节
MyFile。读(MyArray 0 50)
DoDangerousOperation (MyArray (20))

在。net,它并不少见为程序员误解读()和相关方法,许多系统的一部分。IO类。流和读者类并不认为这是不寻常的或特殊如果只有少量的数据可用。这些类只需添加少量的数据返回的缓冲区,并将返回值设置为读取的字节数或字符。没有保证返回的数据量等于请求的数据量。

示例8

对Java程序员来说并不少见误解读()和相关的许多Java方法的一部分。io类。大多数错误和不寻常的事件在Java中导致一个异常被抛出。但流和读者类不考虑不寻常或特殊如果只有少量的数据可用。这些类只需添加少量的数据返回的缓冲区,并将返回值设置为读取的字节数或字符。没有保证返回的数据量等于请求的数据量。这种行为使它重要的程序员检查返回值从读()和其他IO方法来确保他们得到他们期望的数据量。

例9

这个例子将IP地址从一个用户,验证它是完整的,然后查找主机名和拷贝到缓冲区。

(坏的代码)
例如语言:C
空白host_lookup (char * user_supplied_addr) {
struct hostent *惠普;
in_addr_t * addr;
char主机名[64];
in_addr_t inet_addr (const char * cp);

/ *程序确保user_supplied_addr是正确的格式转换* /

validate_addr_form (user_supplied_addr);
addr = inet_addr (user_supplied_addr);
惠普= gethostbyaddr (addr, sizeof (struct in_addr) AF_INET);
strcpy(主机名、hp - > h_name);
}

如果攻击者提供了一个地址,似乎是格式良好的,但是地址不解决一个主机名,然后调用gethostbyaddr()将返回NULL。由于代码从gethostbyaddr不会检查返回值(cwe - 252),一个空指针(cwe - 476)将发生在调用strcpy ()。

注意,这段代码也容易受到缓冲区溢出(cwe - 119)。

示例10

以下函数试图获得一个锁,以执行操作在一个共享资源。

(坏的代码)
例如语言:C
空白f (pthread_mutex_t *互斥){
pthread_mutex_lock(互斥);

/ * * /访问共享资源


pthread_mutex_unlock(互斥);
}

然而,代码不检查pthread_mutex_lock()返回的值的错误。如果pthread_mutex_lock()由于任何原因无法获得互斥锁,功能可能引入竞争条件和导致未定义行为的程序。

为了避免数据竞争,正确的写程序必须检查的结果线程同步功能和妥善处理所有错误,通过试图恢复他们或报告他们更高的水平。

(好的代码)
例如语言:C
int f (pthread_mutex_t *互斥){
int结果;

结果= pthread_mutex_lock(互斥);
如果(0 ! =结果)
返回结果;


/ * * /访问共享资源


返回pthread_mutex_unlock(互斥);
}
+观察到的例子
参考 描述
链:未经检查返回值(cwe - 252)策略实施的一些函数会导致授权旁路(cwe - 862)
链:一个函数的返回值返回一个指针不是成功的检查(cwe - 252)导致以后使用未初始化的变量(cwe - 456)和一个空指针(cwe - 476)
链:sscanf()调用用于检查用户名和组存在,但sscanf()调用的返回值不是检查(cwe - 252),导致未初始化的变量检查(cwe - 457),返回成功执行特权允许授权旁路(cwe - 863)。
检查返回值会导致合成整数溢出和代码执行。
程序不检查返回值在调用函数时放弃特权,特权可以留给用户高于预期迫使这些功能失败。
程序不检查返回值在调用函数时放弃特权,特权可以留给用户高于预期迫使这些功能失败。
链:未经检查返回值会导致零废弃
链:未经检查返回值(cwe - 252)导致的无效,未初始化的指针(cwe - 824)。
基于linux的设备映射器加密程序不检查setuid和setgid允许攻击者的返回值来执行代码与意想不到的特权。
+潜在的缓解措施

实施阶段:

检查结果的返回值的函数,并验证预期的值。

有效性:高

注意:检查函数的返回值通常是足够的,但是当心竞态条件(cwe - 362在并发环境中)。

实施阶段:

确保你占所有可能的返回值的函数。

实施阶段:

当设计一个函数,确保你返回一个值或在出错的情况下抛出异常。
+弱点Ordinalities
Ordinality 描述
(其他弱点的弱点存在独立的)
+会员资格
部分帮助这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
自然 类型 ID 的名字
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 227年 7 pk - API滥用
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 728年 OWASP十大2004类别A7 -错误处理不当
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 742年 CERT C安全编码标准(2008)第9章-内存管理(MEM)
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 847年 CERT甲骨文安全Java编码标准(2011)第4章-表达式(EXP)
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 876年 CERT c++安全编码部分08 -内存管理(MEM)
MemberOf 视图视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。 884年 CWE横截面
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 962年 SFP二级集群:未经检查的状态情况
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 1129年 方案》(2016)——可靠性质量措施
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 1131年 方案》(2016)——安全质量措施
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 1136年 SEI CERT甲骨文安全编码标准Java - 02指导方针。表达式(EXP)
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 1167年 SEI CERT 12 C编码标准指导方针。错误处理(ERR)
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 1171年 SEI CERT 50 C编码标准指导方针。POSIX (POS)
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 1181年 03 SEI CERT Perl编码标准,指导方针。表达式(EXP)
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 1306年 方案及质量措施——可靠性
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 1308年 方案及质量措施,安全
+分类法映射
映射分类名称 节点ID 适合 映射节点名
7有害的王国 不返回值
忽略函数返回值
OWASP十大2004 A7 CWE更具体 错误处理不当
CERT C安全编码 ERR33-C 不精确的 检测和处理标准库错误
CERT C安全编码 POS54-C 不精确的 检测和处理POSIX库错误
CERT甲骨文安全Java编码标准(2011) EXP00-J 不要忽略返回值的方法吗
SEI CERT Perl编码标准 EXP32-PL 确切的 不要忽略函数返回值
软件故障模式 SFP4 不受控制的状态条件
OMG ASCSM ASCSM -cwe - 252资源
OMG ASCRM ASCRM -cwe - 252
OMG ASCRM ASCRM -cwe - 252资源
+引用
卡特里娜REF-6 Tsipenyuk,布莱恩象棋和加里·麦克格劳博士。“七有害的王国:分类软件安全错误”。NIST研讨会软件安全保障技术和度量工具。NIST的。2005-11-07。<https://samate.nist.gov/SSATTM_Content/papers/Seven%20Pernicious%20Kingdoms%20-%20Taxonomy%20of%20Sw%20Security%20Errors%20-%20Tsipenyuk%20-%20Chess%20-%20McGraw.pdf>。
(ref - 62)马克·多德约翰麦克唐纳和贾斯汀Schuh。“软件安全评估的艺术”。第七章,341页“程序构建块”。1版。艾迪生卫斯理》2006。
[REF-7]大卫迈克尔·霍华德和勒布朗。编写安全代码。第20章”,检查返回“624页。第二版。微软出版社。2002-12-04。<https://www.microsoftpressstore.com/store/writing -安全-代码- 9780735617223>。
迈克尔•霍华德(REF-44)大卫·勒布朗和Viega约翰。软件安全的“24宗罪”。“罪孽11:未能正确处理错误。”Page 183. McGraw-Hill. 2010.
(ref - 961)对象管理组织(OMG)。“自动源代码可靠性措施(ASCRM)”。ascrm cwe - 252数据。2016 - 01。<http://www.omg.org/spec/ASCRM/1.0/>。
(ref - 961)对象管理组织(OMG)。“自动源代码可靠性措施(ASCRM)”。ascrm cwe - 252资源。2016 - 01。<http://www.omg.org/spec/ASCRM/1.0/>。
(ref - 962)对象管理组织(OMG)。“自动源代码安全措施(ASCSM)”。ascsm cwe - 252资源。2016 - 01。<http://www.omg.org/spec/ASCSM/1.0/>。
+内容的历史
+提交
提交日期 提交者 组织
2006-07-19 7有害的王国
+贡献
贡献的日期 贡献者 组织
2010-04-30 马丁Sebor 思科系统公司
提供了示范例子和建议CERT参考
+修改
修改日期 修饰符 组织
2008-09-08 CWE内容团队 主教法冠
更新Common_Consequences、关系、Other_Notes Taxonomy_Mappings
2008-11-24 CWE内容团队 主教法冠
更新的关系,Taxonomy_Mappings
2009-01-12 CWE内容团队 主教法冠
更新Background_Details Demonstrative_Examples,描述、Observed_Examples Other_Notes Potential_Mitigations
2009-03-10 CWE内容团队 主教法冠
更新的关系
2009-05-27 CWE内容团队 主教法冠
更新Demonstrative_Examples
2009-07-27 CWE内容团队 主教法冠
更新Demonstrative_Examples
2009-12-28 CWE内容团队 主教法冠
更新Common_Consequences Demonstrative_Examples,引用
2010-02-16 CWE内容团队 主教法冠
更新Demonstrative_Examples Potential_Mitigations,引用
2010-04-05 CWE内容团队 主教法冠
更新Demonstrative_Examples
2010-06-21 CWE内容团队 主教法冠
更新Demonstrative_Examples,引用
2010-09-27 CWE内容团队 主教法冠
更新Observed_Examples
2010-12-13 CWE内容团队 主教法冠
更新Demonstrative_Examples
2011-06-01 CWE内容团队 主教法冠
更新Common_Consequences Demonstrative_Examples,关系,Taxonomy_Mappings
2011-06-27 CWE内容团队 主教法冠
更新Common_Consequences
2011-09-13 CWE内容团队 主教法冠
更新的关系,Taxonomy_Mappings
2012-05-11 CWE内容团队 主教法冠
更新Common_Consequences、引用关系
2014-06-23 CWE内容团队 主教法冠
更新Demonstrative_Examples Potential_Mitigations
2014-07-30 CWE内容团队 主教法冠
更新Demonstrative_Examples、关系、Taxonomy_Mappings
2017-11-08 CWE内容团队 主教法冠
更新Applicable_Platforms、引用关系,Taxonomy_Mappings
2018-03-27 CWE内容团队 主教法冠
更新的引用
2019-01-03 CWE内容团队 主教法冠
更新引用关系,Taxonomy_Mappings
2019-06-20 CWE内容团队 主教法冠
更新的关系
2020-02-24 CWE内容团队 主教法冠
更新的引用
2020-06-25 CWE内容团队 主教法冠
更新Observed_Examples
2020-08-20 CWE内容团队 主教法冠
更新的关系
2021-03-15 CWE内容团队 主教法冠
更新Demonstrative_Examples Observed_Examples,关系,Weakness_Ordinalities
2021-07-20 CWE内容团队 主教法冠
更新Observed_Examples
2023-01-31 CWE内容团队 主教法冠
更新描述
更多的信息是可用的,请选择一个不同的过滤器。
页面最后更新:2023年1月31日