ID: 124 类型:基础 | 状态:未完成 |
描述
软件使用在缓冲区起始内存地址之前的位置索引或指针进行相应位置的写入操作。
扩展描述
这通常发生在指针或其索引递减到缓冲区起始位置之前的位置、指针算术在有效内存位置开始之前的位置或使用负索引时。
关联视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
架构与设计 | |
实现 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
完整性 | 技术冲击: 修改内存; DoS: 崩溃、退出或重启 越界的内存访问很可能导致相关内存的损坏,或者指令的损坏,可能导致崩溃。 | |
完整性 | 技术冲击: 执行未获授权的代码或命令; 修改内存; 越过保护机制; 其它 如果可以有效地控制损坏的内存,则可以执行任意代码。如果损坏的内存是数据而不是指令,系统将继续在发生不恰当变化的情况下运行,可能违反了隐式或显式策略。结果将仅限于受影响数据的使用方式,例如用于指定用户是否具有特殊权限的相邻内存位置。 | |
访问控制 | 技术冲击: 越过保护机制; 其它 当结果是任意代码执行时,这通常可以用来破坏任何其他安全服务。 |
被利用的可能性:
中等
示例
例1
在下面的C/C++示例中,使用实用函数来修剪字符串中的尾随空白。函数将输入字符串复制到本地字符串,并使用while语句通过向后移动字符串并用NUL字符覆盖空白来删除后面的空白。
(问题代码)
Example Language: C
char* trimTrailingWhitespace(char *strMessage, int length) {
char *retMessage;
char *message = malloc(sizeof(char)*(length+1));
// copy input string to a temporary string
char message[length+1];
int index;
for (index = 0; index < length; index++) {
message[index] = strMessage[index];
}
message[index] = '\0';
// trim trailing whitespace
int len = index-1;
while (isspace(message[len])) {
message[len] = '\0';
len--;
}
// return string without trailing whitespace
retMessage = message;
return retMessage;
}
但是,如果输入字符串全部是空白,则此函数可能会导致缓冲区下界之下写入。在某些系统上,while语句将向后移过字符串的开头,并对本地缓冲区边界之外的地址调用isspace()函数。
例2
下面是一个代码示例,如果find()返回一个负值以指示在srcbuf中找不到ch,则可能导致缓冲区下界之下写入。:
(问题代码)
Example Language: C
int main() {
...
strncpy(destBuf, &srcBuf[find(srcBuf, ch)], 1024);
...
}
如果srcBuf的索引失去了用户控制,这将会是一个随意的“任意写入”情形。
应对措施
需求规范:可以选择使用不易受这些问题影响的语言。 |
阶段: 实现 应对用作索引或指针算术的所有计算值执行健全性检查。 |
种属
关系 | 类型 | ID | 名称 |
属于 | | 970 |
说明
关联弱点
这可能是由几个错误导致的,包括错误的偏移量或在缓冲区开始之前递减的数组索引(请参阅CWE-129)。
研究空白
人们对缓冲区溢出非常关注,但是“下溢”有时存在于几乎没有溢出的产品中,因此很可能这种变体缺乏研究。