编号: 126 摘要:变量 结构:简单 | 状态:草稿t |
描述
软件通过缓冲区访问机制如索引或指针等方式从缓冲区上界之外读取数据。
扩展描述
此弱点一般是当指针或者索引累加到一个超出边界的位置时发生;或者当指针计算结果指向合法内存区间之外时发生。它可能会导致敏感信息外泄或系统崩溃。
关系
与“研究层面”视图 (CWE-1000)相关
与"开发层面"视图 (CWE-699)相关
引入模式
阶段 | 说明 |
实现 |
应用平台
语言:
C
C++
一般后果
范围 | 冲击 | 可能性 |
保密 | 技术冲击: 读取内存 |
示例
例1
方法processMessageFromSocket()从socket收到一条消息并将其置入 缓冲区,接着会解析缓冲区的内容并将其存入一个包含消息长度和消息体的结构体中。使用一个for循环将消息体拷贝到本地字符串中,这个字符串将会被传递给另外一个方法进行后续处理。
Example Language: C
int processMessageFromSocket(int socket) {
int success;
char buffer[BUFFER_SIZE];
char message[MESSAGE_SIZE];
// get message from socket and store into buffer
//Ignoring possibliity that buffer > BUFFER_SIZE
if (getMessage(socket, buffer, BUFFER_SIZE) > 0) {
// place contents of the buffer into message structure
ExMessage *msg = recastBuffer(buffer);
// copy message body into string for processing
int index;
for (index = 0; index < msg->msgLength; index++) {
message[index] = msg->msgBody[index];
}
message[index] = '\0';
// process message
success = processMessage(message);
}
return success;
}
然而,在没有验证消息长度变量是否真实反映了消息体的长度的情况下,就使用消息长度变量作为for循环的结束条件。如果消息的长度变量的值比消息体的真实大小要长的的话,就会导致缓冲区越界读取。
例2
一下示例演示了由于缺失NULL结束符导致的缓冲区越界读取。模式匹配的主方法使用strncopy()将用户在命令行输入的文件名和模式赋值到对应的字符数组中,然后在特定文件中寻找这个特定的模式,
Example Language: C
int main(int argc, char **argv)
{
char Filename[256];
char Pattern[32];
/* Validate number of parameters and ensure valid content */
...
/* copy filename parameter to variable, may cause off-by-one overflow */
strncpy(Filename, argv[1], sizeof(Filename));
/* copy pattern parameter to variable, may cause off-by-one overflow */
strncpy(Pattern, argv[2], sizeof(Pattern));
printf("Searching file: %s for the pattern: %s\n", Filename, Pattern);
Scan_File(Filename, Pattern);
}
然而,代码忽略了一点:当源缓冲区的长度大于或者等于目标缓冲区的时候,strncpy()不会自动添加NULL结束符。因此,如果用户输入了一个文件名或者模式同其对应的字符数组的长度相等(或者大于),执行时程序不会自动添加NULL结束符。这将导致printf()读取到数组长度之外的内容。
要想修复这个问题,确认调用sizeof()给NULL预留出一个字节的空间。
Example Language: C
/* copy filename parameter to variable, no off-by-one overflow */
strncpy(Filename, argv[2], sizeof(Filename)-1);
Filename[255]='\0';
/* copy pattern parameter to variable, no off-by-one overflow */
strncpy(Pattern, argv[3], sizeof(Pattern)-1);
Pattern[31]='\0';
属种
关系 | 类型 | ID | 名称 |
成员 | 970 |
说明
关联
这些问题可能是由于保护值缺失造成的后果(CWE-463)或者信任一个受用户影响的输入的长度变量