ID: 130 类型:基础 | 状态:未完成 |
描述
软件解析格式化的消息或结构,但不会处理或错误处理与关联数据的实际长度不一致的长度字段。
扩展描述
如果攻击者可以操纵与输入相关联的长度参数,使其与输入的实际长度不一致,则可以利用该参数使目标应用程序以意外的、可能是恶意的方式运行。这样做的一个可能动机是将任意大的输入传递给应用程序。另一个可能的动机是通过为应用程序的后续属性包含无效数据来修改应用程序状态。这些弱点通常会导致诸如缓冲区溢出和任意代码执行等攻击。
相关视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
架构与设计 | |
实现 |
应用平台
语言
C (有时出现)
C++ (有时出现)
Class: 语言独立 (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
其它 | 技术冲击:依赖上下文 |
示例
例1
在下面的C/C++示例中,方法进程MeaseAccocket()将从套接字中获取消息,放入缓冲区中,并将缓冲区的内容解析为包含消息长度和消息体的结构。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循环的条件,而不验证消息长度变量是否准确反映消息体的长度。如果message length变量指示的长度大于消息正文(CWE-130)的大小,则可能会导致从超出缓冲区界限的内存中读取的缓冲区被过度读取。
应对措施
阶段: 实现 处理包含大小字段和原始数据的结构化传入数据时,请确保识别并解决大小字段与数据实际大小之间的任何不一致。 |
阶段: 实现 不要让用户控制缓冲区的大小。 |
阶段: 实现 验证用户提供的数据的长度是否与缓冲区大小一致。 |
种属
关系 | 类型 | ID | 名称 |
属于 | 990 |
说明
关联
这可能与其他类别重叠,包括零长度问题。