ID: 457 类型:变量 | 状态:草稿 |
描述
代码使用没有初始化的变量,这可能导致不可预知的结果。
扩展描述
在某些诸如C和C++中,堆栈变量在默认情况下不会初始化。在调用函数之前,它们通常包含包含堆栈内存内容的垃圾数据。攻击者有时可以控制或读取这些内容。在其他语言或条件中,根据程序的逻辑,未显式初始化的变量可以被赋予具有安全含义的默认值。如果存在未初始化的变量,有时会指示代码中存在排版错误。
关联视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
范围 | 说明 |
实现 | 在C语言中,在某些字符串库中使用未初始化的char*将返回错误的结果,因为库希望空终止符始终位于字符串的末尾,即使字符串为空。 |
应用平台
语言
C (有时出现)
C++ (有时出现)
Perl (经常出现)
PHP (经常出现)
Class: 语言独立 (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
可利用性 | 技术冲击: 其它 初始变量通常包含垃圾,这是不可信的一致性。这可能导致拒绝服务条件,或者以意外的方式修改控制流。在某些情况下,攻击者可以使用以前的操作“预初始化”变量,这可能会启用代码执行。如果锁变量检查在不应通过时通过,这可能会导致竞争条件。 | |
验证 | 技术冲击: 其它 未初始化的字符串尤其危险,因为许多函数期望在字符串的末尾(并且只在字符串的末尾)有一个空值 |
被利用的可能性:
高
示例
例1
此代码使用存储在Post请求中的信息打印问候语:
(问题代码)
Example Language: PHP
if (isset($_POST['names'])) {
$nameArray = $_POST['names'];
}
echo "Hello " . $nameArray['first'];
此代码检查后数组“name”是否已设置,然后再将其分配给$namearray变量。但是,如果数组不在POST请求中,$namearray将保持未初始化状态。当访问数组以打印问候语时,这将导致一个错误,这可能导致进一步的攻击。
例2
以下switch语句用于在使用变量an和bn之前设置它们的值:
(问题代码)
Example Language: C
int aN, Bn;
switch (ctl) {
case -1:
aN = 0;
bN = 0;
break;
case 0:
aN = i;
bN = -i;
break;
case 1:
aN = i + NEXT_SZ;
bN = i - NEXT_SZ;
break;
default:
aN = -1;
aN = -1;
break;
}
repaint(aN, bN);
在switch语句的默认情况下,程序员意外地将值设置了两次。因此,bn将具有未定义的值。大多数未初始化的变量问题都会导致一般的软件可靠性问题,但如果攻击者可以故意触发使用未初始化的变量,他们可能会通过崩溃程序来启动拒绝服务攻击。在恰当的情况下,攻击者可以通过在调用函数之前影响堆栈上的值来控制未初始化变量的值。
应对措施
阶段: 实现 策略: 减少被攻击的可能 定义任何变量都赋一个初始值 |
阶段: 编译及链接 策略: 强化编译与链接 如果打开警告,大多数编译器都会警告未初始化变量的使用。 |
阶段: 实现; 操作 使用不需要显式声明变量的语言时,以报告未声明或未知变量的模式运行或编译软件。这可能表明变量名称中存在印刷错误。 |
阶段: 需求 可以选择使用不易受这些问题影响的语言。 |
阶段: 架构与设计 可以引入安全字符串库和容器抽象等缓解技术。 |
种属
关系 | 类型 | ID | 名称 |
属于 | 398 | ||
属于 | 998 |