CWE

普遍的弱点

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

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

CWE-456:缺少变量的初始化

弱点ID:456
抽象:变体
结构:简单的
查看自定义信息:
+描述
该产品不会初始化关键变量,这会导致执行环境使用意外值。
+关系
部分帮助该表显示了与该弱点相关的弱点和高级类别。这些关系定义为childof,parentof,ementof,并深入了解可能存在于较高和较低抽象水平的类似项目。此外,定义了诸如Peerof和Canalsobe之类的关系,以显示用户可能想要探索的类似弱点。
+与观点“研究概念”相关(CWE-1000)
自然 类型 ID 姓名
Childof 根据基础 - 仍然主要独立于资源或技术的弱点,但有足够的细节来提供特定的检测和预防方法。基本水平的弱点通常用以下维度的2或3来描述问题:行为,财产,技术,语言和资源。 909 缺少资源初始化
canpreceede 根据基础 - 仍然主要独立于资源或技术的弱点,但有足够的细节来提供特定的检测和预防方法。基本水平的弱点通常用以下维度的2或3来描述问题:行为,财产,技术,语言和资源。 89 SQL命令中使用的特殊元素的中和不当('SQL注入')
canpreceede 变体变体 - 与某种类型的产品相关的弱点,通常涉及特定的语言或技术。比基本弱点更具体。变体级别的弱点通常以以下维度的3到5来描述问题:行为,财产,技术,语言和资源。 98 在PHP程序中对文件名的不当控制(“ PHP远程文件包含”)
canpreceede 根据基础 - 仍然主要独立于资源或技术的弱点,但有足够的细节来提供特定的检测和预防方法。基本水平的弱点通常用以下维度的2或3来描述问题:行为,财产,技术,语言和资源。 120 缓冲区副本未检查输入的大小(“经典缓冲区溢出”)
canpreceede 变体变体 - 与某种类型的产品相关的弱点,通常涉及特定的语言或技术。比基本弱点更具体。变体级别的弱点通常以以下维度的3到5来描述问题:行为,财产,技术,语言和资源。 457 使用非初始化变量
部分帮助该表显示了与该弱点相关的弱点和高级类别。这些关系定义为childof,parentof,ementof,并深入了解可能存在于较高和较低抽象水平的类似项目。此外,定义了诸如Peerof和Canalsobe之类的关系,以显示用户可能想要探索的类似弱点。
+与“ CISQ质量措施(2020)”相关(CWE-1305)
自然 类型 ID 姓名
Childof 班级班级 - 以非常抽象的方式描述的弱点,通常与任何特定的语言或技术无关。比支柱弱点更具体,但比基本弱点更一般。班级弱点通常用以下维度的1或2来描述问题:行为,属性和资源。 665 初始化不当
部分帮助该表显示了与该弱点相关的弱点和高级类别。这些关系定义为childof,parentof,ementof,并深入了解可能存在于较高和较低抽象水平的类似项目。此外,定义了诸如Peerof和Canalsobe之类的关系,以显示用户可能想要探索的类似弱点。
+与“ CISQ数据保护措施”(CWE-1340)有关
自然 类型 ID 姓名
Childof 班级班级 - 以非常抽象的方式描述的弱点,通常与任何特定的语言或技术无关。比支柱弱点更具体,但比基本弱点更一般。班级弱点通常用以下维度的1或2来描述问题:行为,属性和资源。 665 初始化不当
+介绍模式
部分帮助引言的不同模式提供了有关如何以及何时引入这种弱点的信息。该阶段识别可能发生介绍的生命周期中的一个点,而音符提供了与给定阶段中引言有关的典型情况。
阶段 笔记
执行
+适用的平台
部分帮助该清单显示了可能出现的弱点的可能区域。这些可能适用于特定的命名语言,操作系统,体系结构,范式,技术或一类此类平台。该平台与给定弱点出现在该实例的频率一起列出。

语言

班级:不是特定语言的(不确定的患病率)

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

技术影响:意外状态;质量退化;随上下文而变化

非传统数据可能无效,导致程序中的逻辑错误。在某些情况下,这可能导致安全问题。
+示例的例子

示例1

此功能试图从用户填充的字符串中提取一对数字。

(不良代码)
示例语言:C
void parse_data(char *untrusted_input){
int m,n,错误;
error = sscanf(untrusted_input,“%d:%d”,&m,&n);
如果(eof ==错误){
die(“没有指定整数价值。DieEvil Hacker!\ n”);
}
/ *假设正确初始化N和M的过程 */
}

该代码试图从格式化的用户提供的输入中提取两个整数值。但是,如果攻击者提供表格的输入:

(攻击代码)
123:

然后,仅将M变量初始化。随后使用N可能会导致使用非初始化变量(CWE-457)。

示例2

在这里,Java类中的非初始化字段用于很少被称为方法,这会导致丢弃NullPoInterException。

(不良代码)
示例语言:爪哇
私人用户;
公共void somemethod(){

//做一些有趣的事情。
...

//如果用户尚未正确初始化,则将NPE投掷。
字符串用户名= user.getName();
}

示例3

该代码首先对用户进行身份验证,然后如果用户是管理员,则允许删除命令。

(不良代码)
示例语言:php
if(authenticate($ username,$ password)&& setadmin($ username)){
$ isadmin = true;
}
/.../

如果($ isadmin){
deleteuser($ usertodelete);
}

如果用户是管理员,则$ ISADMIN变量设置为TRUE,但否则不可原始化。如果启用了PHP的寄存器_globals功能,则攻击者可以将$ iSadmin(例如$ isadmin)等非初始化变量设置为任意值,在这种情况下,通过将$ isadmin设置为true来获得管理员特权。

示例4

在以下Java代码中,BankManager类使用类用户的用户变量允许授权用户执行银行管理器任务。用户变量是在方法设置器中初始化的,该方法设置器从用户数据库中检索用户。然后,通过方法AuthenticateUser将用户作为未经授权的用户进行身份验证。

(不良代码)
示例语言:爪哇
公共类Bankmanager {

//允许用户执行银行经理任务
私人用户= null;
私人布尔iSuserauthentic = false;

// BankManager类的构造函数
public bankmanager(){
...
}

//从用户数据库中检索用户
公共用户getUserFromuserDatabase(字符串用户名){
...
}

//使用用户名设置用户变量
public void setuser(字符串用户名){
this.user = getUserFromuserDatabase(用户名);
}

//身份验证用户
public boolean authenticateuser(字符串用户名,字符串密码){
if(username.equals(user.getUsername())&& password.equals(user.getPassword())){
Isuserauthentic = true;
}
返回IseSerauthentic;
}

//执行银行经理任务的方法
...
}

但是,如果在AuthenticateUser之前未调用方法设置器,则不会初始化用户变量,并且会导致NullPoInterException。该代码应在使用以下代码中之前验证用户变量是否已在使用之前已初始化。

(好代码)
示例语言:爪哇
公共类Bankmanager {

//允许用户执行银行经理任务
私人用户= null;
私人布尔iSuserauthentic = false;

// BankManager类的构造函数
public bankmanager(字符串用户名){
user = getUserFromuserDatabase(用户名);
}

//从用户数据库中检索用户
公共用户getUserFromuserDatabase(字符串用户名){...}

//身份验证用户
public boolean authenticateuser(字符串用户名,字符串密码){
如果(user == null){
system.out.println(“找不到用户” +用户名);
}
别的 {
if(password.equals(user.getPassword())){
Isuserauthentic = true;
}
}
返回IseSerauthentic;
}

//执行银行经理任务的方法
...

}

示例5

当我与err_val相同时,此示例将使test_string处于未知条件下,因为test_string未初始化(CWE-456)。取决于该代码段出现的位置(例如在功能主体内),如果将其存储在堆或堆栈上,则可能是随机的。如果变量在静态内存中声明,则可能为零或null。编译器优化可能有助于该地址的不可预测性。

(不良代码)
示例语言:C
char *test_string;
如果(i!= err_val)
{
test_string =“ Hello World!”;
}
printf(“%s”,test_string);

到达printf()时,test_string可能是一个意外的地址,因此printf可能会打印垃圾字符串(CWE-457)。

为了修复此代码,有几种方法可以确保Test_string在达到printf()后才正确设置。

一种解决方案是将test_string设置为有条件之前的可接受默认值:

(好代码)
示例语言:C
char *test_string =“开始完成”;
如果(i!= err_val)
{
test_string =“ Hello World!”;
}
printf(“%s”,test_string);

另一个解决方案是确保条件的每个分支(包括默认分支)可以确保设置test_string:

(好代码)
示例语言:C
char *test_string;
如果(i!= err_val)
{
test_string =“ Hello World!”;
}
别的 {
test_string =“在另一侧完成!”;
}
printf(“%s”,test_string);
+观察到的例子
参考 描述
链:返回指针的函数的返回值未检查成功(成功(CWE-252)导致以后使用非初始化变量(CWE-456)和无效的指针解除(CWE-476
链:使用未实现的网络插座操作指向非初始化处理程序功能(CWE-456)由于无效的指针退出而导致崩溃(CWE-476)。
当条件失败时,有时会使用其在条件语句中设置其值的变量,有时会导致数据泄漏
产品使用非初始化的变量来进行大小和索引,从而导致结果缓冲区溢出。
PHP应用程序中的内部变量未初始化,从而允许外部修改。
阵列变量未在PHP应用中初始化,从而导致SQL注入。
+潜在的缓解

阶段:实施

检查关键变量是否初始化。

阶段:测试

使用静态分析工具发现非启示变量。
+会员资格
部分帮助此成员关系表显示了其他CWE类别和视图,将此弱点称为成员。该信息通常可用于理解弱点适合外部信息源的何处。
自然 类型 ID 姓名
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 808 2010年前25名 - 风口浪尖上的弱点
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 867 2011前25名 - 风口浪尖上的弱点
成员 看法查看 - CWE条目的子集,提供了一种检查CWE内容的方法。两个主视图结构是切片(平面列表)和图(包含条目之间的关系)。 884 CWE横截面
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 998 SFP次级群集:计算中的故障
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 1129 CISQ质量措施(2016年) - 可靠性
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 1131 CISQ质量措施(2016年) - 安全性
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 1167 SEI CERT C编码标准 - 指南12.错误处理(ERR)
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 1180 SEI CERT PERL编码标准 - 指南02.声明和初始化(DCL)
+笔记

关系

这种弱点是许多结果弱点的主要因素,尤其是在Web应用程序中允许全局变量初始化(例如PHP)与可以直接请求的库。

研究差距

大量导致的弱点很可能缺少初始化,但研究人员报告通常没有提供这种细节。
+分类映射
映射的分类名称 节点ID 合身 映射的节点名称
plover 缺少初始化
软件故障模式 SFP1 计算中的故障
证书C安全编码 ERR30-C CWE更抽象 在调用已知要设置errno的库函数之前,将errno设置为零,并仅在函数返回值表示失败的值之后才检查errno
SEI CERT PERL编码标准 DCL04-PL 精确的 始终初始化本地变量
SEI CERT PERL编码标准 dcl33-pl 不精确 在使用标识符之前声明标识符
OMG ASCSM ASCSM-CWE-456
OMG ASCRM ascrm-CWE-456
+参考
[Ref-62] Mark Dowd,John McDonald和Justin Schuh。“软件安全评估的艺术”。第7章,“可变初始化”,第312页。第一版。艾迪生·卫斯理。2006。
[Ref-961]对象管理组(OMG)。“自动源代码可靠性度量(ASCRM)”。ASCRM-CWE-456。2016-01。<http://www.omg.org/spec/ascrm/1.0/>。
[Ref-962]对象管理组(OMG)。“自动源代码安全度量(ASCSM)”。ASCSM-CWE-456。2016-01。<http://www.omg.org/spec/ascsm/1.0/>。
+内容历史记录
+提交
提交日期 提交者 组织
2006-07-19 plover
+修改
修改日期 修饰符 组织
2008-07-01 Sean Eidemiller 雪茄
添加/更新的示例
2008-07-01 埃里克·达奇(Eric Dalci) 雪茄
更新的势_METIGATIONS,time_of_introduction
2008-09-08 CWE内容团队 MITER
更新的关系,其他_notes,分类_mappings
2010-02-16 CWE内容团队 MITER
更新的关系
2010-04-05 CWE内容团队 MITER
更新了适用的_platforms,示例_examples
2010-06-21 CWE内容团队 MITER
更新其他_notes,关系_notes
2011-03-29 CWE内容团队 MITER
更新了示范_examples
2011-06-01 CWE内容团队 MITER
更新的common_cconsquences
2011-06-27 CWE内容团队 MITER
更新的COMMON_CCONSQUENCES,关系
2012-05-11 CWE内容团队 MITER
更新的引用,关系
2012-10-30 CWE内容团队 MITER
更新的势_MINEIGATIONS
2013-02-21 CWE内容团队 MITER
更新的名称,关系
2014-07-30 CWE内容团队 MITER
更新的关系,分类_mappings
2017-11-08 CWE内容团队 MITER
更新的分类法_ mappings
2019-01-03 CWE内容团队 MITER
更新的参考,关系,分类_mappings
2019-06-20 CWE内容团队 MITER
更新的关系,类型
2020-02-24 CWE内容团队 MITER
更新的关系
2020-06-25 CWE内容团队 MITER
更新了示范_examples
2020-08-20 CWE内容团队 MITER
更新的关系
2020-12-10 CWE内容团队 MITER
更新的关系
2021-03-15 CWE内容团队 MITER
更新了示范示例,观察_ examples,关系
2023-01-31 CWE内容团队 MITER
更新的描述
+先前的输入名称
改变日期 先前的输入名称
2013-02-21 缺少初始化
提供更多信息 - 请选择其他过滤器。
页面最后更新:2023年1月31日