CWE

普遍的弱点

社区开发的软件和硬件弱点类型清单

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

CWE-481:分配而不是比较

弱点ID:481
抽象:变体
结构:简单的
查看自定义信息:
+描述
当打算进行比较时,该代码使用操作员进行分配。
+扩展描述
在许多语言中,比较语句的外观非常接近分配语句,并且经常感到困惑。此错误通常是错字的结果,通常会导致程序执行的明显问题。如果比较在IF语句中,则IF语句通常会评估谓词右侧的值。
+关系
部分帮助该表显示了与该弱点相关的弱点和高级类别。这些关系定义为childof,parentof,ementof,并深入了解可能存在于较高和较低抽象水平的类似项目。此外,定义了诸如Peerof和Canalsobe之类的关系,以显示用户可能想要探索的类似弱点。
+与观点“研究概念”相关(CWE-1000)
自然 类型 ID 姓名
Childof 根据基础 - 仍然主要独立于资源或技术的弱点,但有足够的细节来提供特定的检测和预防方法。基本水平的弱点通常用以下维度的2或3来描述问题:行为,财产,技术,语言和资源。 480 使用不正确的操作员
canpreceede 支柱支柱 - 弱点是最抽象的弱点类型,代表了与之相关的所有类别/基础/变体弱点的主题。从技术上讲,柱子与类别不同,因为在技术上仍然是一种描述错误的弱点,而类别代表用于分组相关事物的常见特征。 697 不正确的比较
+介绍模式
部分帮助引言的不同模式提供了有关如何以及何时引入这种弱点的信息。该阶段识别可能发生介绍的生命周期中的一个点,而音符提供了与给定阶段中引言有关的典型情况。
阶段 笔记
执行
+适用的平台
部分帮助该清单显示了可能出现的弱点的可能区域。这些可能适用于特定的命名语言,操作系统,体系结构,范式,技术或一类此类平台。该平台与给定弱点出现在该实例的频率一起列出。

语言

C(不确定的患病率)

C ++(不确定的患病率)

爪哇(不确定的患病率)

C#(不确定的患病率)

+常见后果
部分帮助该表指定与弱点相关的不同个人后果。该范围确定了违反的应用程序安全区域,而影响描述了如果对手成功利用这一弱点,就会产生负面的技术影响。其可能性提供了有关预期相对于列表中其他后果的特定后果的可能性的信息。例如,可能会利用弱点来实现一定的影响,但很可能会利用它来实现不同的影响。
范围 影响 可能性
其他

技术影响:更改执行逻辑

+利用的可能性
低的
+示例的例子

示例1

以下C/C ++和C#示例试图针对整数值100验证INT输入参数。

(不良代码)
示例语言:C
int iSvalid(int value){
如果(值= 100){
printf(“ value是有效的\ n”);
返回(1);
}
printf(“值无效\ n”);
返回(0);
}
(不良代码)
示例语言:C#
bool iSvalid(int value){
如果(值= 100){
Console.Writeline(“ Value是有效的。”);
返回true;
}
Console.Writeline(“值无效。”);
返回false;
}

但是,在IF语句中要评估的表达式使用分配运算符“ =”而不是比较操作员“ ==”。使用分配运算符代替比较操作员的结果导致int变量在本地重新分配,并且IF语句中的表达式将始终评估表达式的右侧值。这将导致输入值未正确验证,这可能会导致意外的结果。

示例2

在此示例中,我们说明当通过引用而不是通过值传递值时,分配而不是比较会影响代码。考虑从用户输入处理字符串的方案。假设字符串已经格式化,以使不同的用户输入与结肠字符串联。当调用过程带函数时,结肠字符的测试将导致结肠字符的插入,并添加新的输入分离器。由于字符串是通过引用传递的,因此数据前哨将插入原始字符串(CWE-464),并将更改输入的进一步处理,可能会畸形。

(不良代码)
示例语言:C
void processString(char *str){
int i;

for(i = 0; i if(isalnum(str [i])){
ProcessChar(str [i]);
}
否则if(str [i] =':'){
MoveToneWinput();}
}
}
}

示例3

以下Java示例尝试根据输入参数的布尔值执行一些处理。但是,在IF语句中要评估的表达式使用分配运算符“ =”而不是比较操作员“ ==”。与先前的示例一样,该变量将在本地重新分配,IF语句中的表达式将评估为真实和意外的处理。

(不良代码)
示例语言:爪哇
public void checkvalid(布尔伊斯瓦利德){
如果(iSvalid = true){
system.out.println(“执行处理”);
DosomethingImptem();
}
别的 {
system.out.println(“无效,不执行处理”);
返回;
}
}

虽然当需要比较操作员时,大多数Java编译器都会捕获分配运算符的使用,但对于Java中的布尔变量,允许在表达式中使用分配运算符。如果可能的话,请尝试避免使用Java中布尔变量的比较操作员。取而代之的是,就像以下代码一样,让变量的值代表自己。

(好代码)
示例语言:爪哇
public void checkvalid(布尔伊斯瓦利德){
如果(Isvalid){
system.out.println(“执行处理”);
DosomethingImptem();
}
别的 {
system.out.println(“无效,不执行处理”);
返回;
}
}

另外,要测试错误,只需使用布尔值非操作员即可。

(好代码)
示例语言:爪哇
public void checkvalid(布尔伊斯瓦利德){
如果(!iSvalid){
system.out.println(“无效,不执行处理”);
返回;
}
system.out.println(“执行处理”);
DosomethingImptem();
}

示例4

以下示例证明了弱点。

(不良代码)
示例语言:C
void呼叫(int foo){
if(foo = 1)printf(“ foo \ n”);
}
int main(){

称为(2);
返回0;
}
+潜在的缓解

阶段:测试

许多IDE和静态分析产品将检测到此问题。

阶段:实施

将常数放在左侧。如果尝试使用变量分配常数,则编译器将产生错误。
+会员资格
部分帮助此成员关系表显示了其他CWE类别和视图,将此弱点称为成员。该信息通常可用于理解弱点适合外部信息源的何处。
自然 类型 ID 姓名
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 998 SFP次级群集:计算中的故障
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 1157 SEI CERT C编码标准 - 指南03.表达式(EXP)
+分类映射
映射的分类名称 节点ID 合身 映射的节点名称
扣子 分配而不是比较
软件故障模式 SFP1 计算中的故障
证书C安全编码 EXP45-C CWE更抽象 在选择语句中不执行作业
+参考
[Ref-18] Secure Software,Inc.。“ The CLASP应用程序安全过程”。2005年。<https://cwe.mitre.org/documents/sources/theclaspapplicationsecurityprocess.pdf>。
[Ref-62] Mark Dowd,John McDonald和Justin Schuh。“软件安全评估的艺术”。第6章,“错别字”,第289页。第一版。艾迪生·卫斯理。2006。
+内容历史记录
+提交
提交日期 提交者 组织
2006-07-19 扣子
+修改
修改日期 修饰符 组织
2008-07-01 埃里克·达奇(Eric Dalci) 雪茄
更新的time_of_introduction
2008-09-08 CWE内容团队 MITER
更新了适用的_platforms,描述,关系,其他_notes,gualomy_mappings
2009-05-27 CWE内容团队 MITER
更新了示范_examples
2009-07-27 CWE内容团队 MITER
更新的描述,其他_notes
2011-06-01 CWE内容团队 MITER
更新的common_cconsquences
2012-05-11 CWE内容团队 MITER
更新的引用,关系
2012-10-30 CWE内容团队 MITER
更新了示范_examples,势_mitigations
2014-07-30 CWE内容团队 MITER
更新的关系,分类_mappings
2017-01-19 CWE内容团队 MITER
更新的关系
2017-11-08 CWE内容团队 MITER
更新的示范_examples,gualomy_mappings
2019-01-03 CWE内容团队 MITER
更新的关系
2020-02-24 CWE内容团队 MITER
更新的引用,关系
2021-03-15 CWE内容团队 MITER
更新了示范_examples,势_mitigations
提供更多信息 - 请选择其他过滤器。
页面最后更新:2023年1月31日