CWE

常见的弱点枚举

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

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

cwe - 839:数字范围比较没有最低检查

弱点ID: 839
抽象:基地
结构:简单的
视图定制的信息:
+描述
产品检查一个值,以确保它是小于或等于最大,但它也不验证值是大于或等于最低。
+扩展描述

签署的一些产品使用整数或浮点数,即使他们的价值观只是将积极或0。一个输入验证检查可能假设值是正数,且仅检查最大值。如果该值是负的,但代码假设值是正数,这可以产生一个错误。错误可能安全后果如果负值用于内存分配,数组访问、缓冲区访问,等。最终,错误可能导致缓冲区溢出或其他类型的内存腐败。

使用一个负数positive-only上下文可能对其他类型的资源安全的影响。例如,购物车可以检查用户没有要求超过10项,但要求3项可能导致应用程序计算-价格和信贷攻击者的帐户。

+替代条款
签署的比较:
签署的“比较”常被用来形容当签署的产品使用一个变量并检查以确保它小于最大值(通常是最大缓冲区大小),但不确认它大于0。
+的关系
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关的视图”研究概念”(cwe - 1000)
自然 类型 ID 的名字
ChildOf 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 1023年 不完全与缺失的因素
CanPrecede 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 119年 不当的操作限制的范围内一个内存缓冲区
CanPrecede 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 124年 缓冲区承销(缓冲区下溢)
CanPrecede 变体变体——一个弱点与某种类型的产品,通常涉及到一个特定的语言或技术。更具体的比基本的弱点。变异水平弱点通常描述问题的3到5以下维度:行为、财产、技术、语言,和资源。 195年 签署无符号转换错误
CanPrecede 支柱支柱——一个弱点是最抽象类型的弱点和代表一个主题类/基地/变体相关弱点。支柱是不同于一个类别作为支柱技术上仍然是一种弱点,描述了一个错误,而一个类别代表一个共同特征用于组相关的东西。 682年 错误的计算
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关观点“软件开发”(cwe - 699)
自然 类型 ID 的名字
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 189年 数字错误
+适用的平台
部分帮助该清单显示了给定的弱点可以可能的地区出现。这些可能是为特定命名的语言,操作系统,架构、模式、技术、或一个类这样的平台。列出的平台是随着频率的出现疲态实例。

语言

C(通常是普遍的)

c++(通常是普遍的)

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

技术的影响:修改应用程序数据;执行未经授权的代码或命令

攻击者可以修改消息的结构或数据被发送到下游组件,可能注入命令。
可用性

技术的影响:DoS:资源消耗(其他)

在某些情况下,一个负值会导致资源消耗。
保密
完整性

技术的影响:修改内存;读记忆

如果一个负值用于访问内存,缓冲区,或其他可转位结构,它可以访问内存缓冲区的边界之外。
+示范例子

示例1

下面的代码是为了从套接字读取传入数据包和提取一个或多个标题。

(坏的代码)
例如语言: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()使用一个非常小的正数,然后分配一个缓冲区,远小于预期,可能导致缓冲区溢出。

示例2

下面的代码读取一个最大尺寸和大小上执行一个检查。然后执行strncpy,假设它不会超过数组的边界。虽然使用“短”是强制在这个特定的例子中,短整型的实际代码中经常使用,例如代码处理结构化数据。

(坏的代码)
例如语言:C
int GetUntrustedInt () {
返回(0 x0000ffff);
}

void main (int命令行参数个数,char * * argv) {
char路径[256];
char *输入;
int我;
短的年代;
unsigned int深圳;

i = GetUntrustedInt ();
s = i;
/ * s是1,所以通过了安全检查cwe - 697* /
如果(> 256){
DiePainfully(“走开! \ n”);
}

/ * s符号扩展和保存在深圳* /
深圳= s;

/ *输出:我= 65535 s = 1,深圳= 4294967295 -你的情况可能不同* /
printf (" i = % d s = % d,深圳= % u \ n”,我,年代,sz);

输入= GetUserInput(“输入路径名:”);

/ * strncpy解释年代unsigned int,视为MAX_INT
(cwe - 195),使缓冲区溢出(cwe - 119)* /
strncpy(路径,输入,年代);
路[255]= ' \ 0 ';/ *不希望的cwe - 170* /
printf("路径是:% s \ n”,路径);
}

这段代码首先展示的一个例子cwe - 839,允许“s”是一个负数。当消极的短“s”转化为一个无符号整数,它成为一个非常大的正整数。当使用这个转换整数strncpy()会导致缓冲区溢出(cwe - 119)。

示例3

在以下代码,方法检索一个值在一个特定的数组索引数组位置作为输入参数的方法

(坏的代码)
例如语言:C
int getValueFromArray (int *数组,int len, int指数){

int值;

/ /检查数组下标小于最大

/ /数组的长度
如果(指数< len) {

/ /获取值的指定索引数组
值=数组(指数);
}
/ /如果数组索引无效则输出错误消息

/ /并返回值指示错误
其他{
printf(“价值:% d \ n”,阵列(指数));
值= 1;
}

返回值;
}

然而,这种方法只验证给定的数组下标小于数组的最大长度但不检查的最小值(cwe - 839)。这将允许一个负值被接受作为输入数组索引,这将导致一个界外读(cwe - 125),并可能允许访问敏感的记忆。输入数组索引应该检查来验证在最大和最小范围内所需的阵列(cwe - 129)。在这个例子中if语句应该修改为包括一个最小范围检查,如下所示。

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



/ /检查数组索引内是正确的

/ /数组的值的范围
如果(指数> = 0 & &指数< len) {

示例4

下面的代码显示了一个简单的BankAccount类存款和提取方法。

(坏的代码)
例如语言:Java
公开课BankAccount {

公众最终int MAXIMUM_WITHDRAWAL_LIMIT = 350;

/ /变量到银行账户的平衡
私人双accountBalance;

/ /构造函数BankAccount
公共BankAccount () {
accountBalance = 0;
}

/ /方法向BankAccount存款金额
公共空间存款(双depositAmount) {…}

/ /方法从BankAccount支取金额
公共空间撤回(双withdrawAmount) {

如果(withdrawAmount < MAXIMUM_WITHDRAWAL_LIMIT) {

双newBalance = accountBalance - withdrawAmount;
accountBalance = newBalance;
}
其他{
System.err。println(“撤军数量超过允许的最大限制,请再试一次…”);
}
}

/ /访问BankAccount对象的其他方法
}

提取方法包括一个检查以确保撤军数量不超过允许的最大极限,然而该方法不会检查以确保取款金额大于最小值(cwe - 129)。执行一个检查一个值范围,不包括最低限度检查可以有重大的安全隐患,在这种情况下不包括最小范围检查可以允许使用负值将导致金融应用程序使用这个类存款到用户帐户,而不是取消。在这个例子中if语句的修改应该包括最低范围检查,如下所示。

(好的代码)
例如语言:Java
公开课BankAccount {

公众最终int MINIMUM_WITHDRAWAL_LIMIT = 0;
公众最终int MAXIMUM_WITHDRAWAL_LIMIT = 350;



/ /方法从BankAccount支取金额
公共空间撤回(双withdrawAmount) {

如果(withdrawAmount < MAXIMUM_WITHDRAWAL_LIMIT & &
withdrawAmount > MINIMUM_WITHDRAWAL_LIMIT) {

注意,这个例子并不防止并发访问BankAccount平衡变量,明白了cwe - 413cwe - 362

虽然范围对于这个示例,注意使用双打或漂浮在金融计算可能会受到某些类型的攻击,攻击者使用舍入误差来偷钱。

+观察到的例子
参考 描述
链:整数溢出导致负面价值,签署后绕过maximum-only检查,导致基于堆的缓冲区溢出。
链:16位计数器可以被解释为负值,而32位的最大价值,导致缓冲under-write。
链:内核缺乏一个检查一个负值会导致内存泄露。
链:解析器使用atoi()但不检查一个负值,这可能发生在一些平台上,导致缓冲under-write。
链:消极的值存储在一个int绕过尺寸检查,导致分配大量的内存。
链:负的偏移值IOCTL绕过检查最大指数,然后用作缓冲under-read数组索引。
链:文件传输客户端执行签署比较,导致整数溢出和基于堆的缓冲区溢出。
链:- ID在媒体播放器绕过检查最大指数,然后用作缓冲under-read数组索引。
+潜在的缓解措施

实施阶段:

战略:执行的转换

如果要使用的数量总是将积极改变的变量类型无符号或size_t签署。

实施阶段:

策略:输入验证

如果要使用的数量可以有负面价值的基础上,规范(因此需要签名的值),但只应积极保护代码的正确性,然后包括检查以确保价值是正的。
+会员资格
部分帮助这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
自然 类型 ID 的名字
MemberOf 视图视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。 884年 CWE横截面
+引用
(ref - 62)马克·多德约翰麦克唐纳和贾斯汀Schuh。“软件安全评估的艺术”。第六章,246页“类型转换漏洞”。1版。艾迪生卫斯理》2006。
(ref - 62)马克·多德约翰麦克唐纳和贾斯汀Schuh。“软件安全评估的艺术”。第六章,“比较”,265页。1版。艾迪生卫斯理》2006。
+内容的历史
+提交
提交日期 提交者 组织
2011-03-24 CWE内容团队 主教法冠
+修改
修改日期 修饰符 组织
2011-06-01 CWE内容团队 主教法冠
更新Common_Consequences
2012-05-11 CWE内容团队 主教法冠
更新Demonstrative_Examples、引用关系
2014-02-18 CWE内容团队 主教法冠
更新的关系
2018-03-27 CWE内容团队 主教法冠
更新描述
2019-01-03 CWE内容团队 主教法冠
更新的关系
2023-01-31 CWE内容团队 主教法冠
更新Alternate_Terms、描述
更多的信息是可用的,请选择一个不同的过滤器。
页面最后更新:2023年1月31日