ID: 125 类型:基础 | 状态:草稿 |
描述
软件读取缓冲区之前或者之后的数据。
扩展描述
通常,这会允许攻击者从其它内存位置读取敏感信息或导致崩溃。假定存在用于停止读取操作(如字符串中的nul)的哨兵变量时,当代码读取可变数量的数据时候可能会发生崩溃。预期的哨兵可能不在越界内存边界之内,导致读取过多数据,引发“分段错误”或“缓冲区溢出”。软件可以修改索引或执行指针运算,该索引或运算结果指向缓冲区边界之外的内存位置。随后的读取操作将产生未定义或意外的结果。
关联视图
与“研究层面”视图(CWE-1000)相关
同 "简化已发布漏洞映射的弱点" 视图CWE-1003)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
实现 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
保密性 | 技术冲击: 内存读取 |
示例
例1
在下面的代码中,该方法从特定数组索引位置的数组中检索一个值,该值作为该方法的输入参数给定。
(问题代码)
Example Language: C
int getValueFromArray(int *array, int len, int index) {
int value;
// check that the array index is less than the maximum
// length of the array
if (index < len) {
// get the value at the specified index of the array
value = array[index];
}
// if array index is invalid then output error message
// and return value indicating error
else {
printf("Value is: %d\n", array[index]);
value = -1;
}
return value;
}
但是,此方法只验证给定的数组索引是否小于数组的最大长度,但不检查最小值(CWE-839)。这将允许接受负值作为输入数组索引,这将导致越界读取(CWE-125),并允许访问敏感内存。应检查输入数组索引,以验证是否在数组所需的最大和最小范围内(CWE-129)。在这个例子中,if语句应该修改为包含一个最小范围检查,如下所示
(正确代码)
Example Language: C
...
// check that the array index is within the correct
// range of values for the array
if (index >= 0 && index < len) {
...
种属
关系 | 类型 | ID | 名称 |
属于 | 970 | ||
属于 | 1157 | SEI CERT C Coding Standard - Guidelines 03. Expressions (EXP) | |
属于 | 1160 | ||
属于 | 1161 | SEI CERT C Coding Standard - Guidelines 07. Characters and Strings (STR) |