ID: 188 类型:基础 | 状态:草稿 |
描述
软件对协议数据或内存在较低级别的组织方式进行了无效的假设,从而导致意外的程序行为
扩展描述
当更改平台或协议版本时,内存中的数据组织可能会以意外的方式更改。例如,有些体系结构可以将局部变量a和b放在一起,a放在上面;有些体系结构可以将局部变量a和b放在一起,b放在上面;另一些体系结构可以为每个局部变量添加一些填充。填充大小可能会有所不同,以确保每个变量都与适当的字大小对齐。
在协议实现中,通常计算相对于另一个字段的偏移量来挑选特定的数据块。异常情况(通常涉及新的协议版本)可能会添加以异常方式更改数据布局的角情况。结果可能是,实现访问包中的意外字段,将一种类型的数据视为另一种类型的数据。
相关视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
架构与设计 | |
实现 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
完整性 | 技术冲击: 修改内存; 读取内存 可能导致意外修改或敏感记忆暴露。 |
被利用的可能性:
低
示例
例1
在这个示例函数中,变量b的内存地址是通过在变量a的地址中添加1来派生的。然后,这个派生地址用于将值0赋给b。
(问题代码)
Example Language: C
void example() {
char a;
char b;
*(&a + 1) = 0;
}
这里,b可能不是a后面的一个字节。它可以是a前面的一个字节。或者,它们之间可能有三个字节,因为它们在32位边界上对齐。
应对措施
阶段: 实现; 架构与设计 在扁平地址空间的情况下,绝不允许计算内存地址作为与另一个内存地址的偏移量。 |
阶段: 架构与设计 完全明确地指定协议布局,提供结构化语法(例如,可编译的yacc语法) |
阶段: 测试 测试:测试代码正确的处理了语法协议包含的所有情况。 |
种属
关系 | 类型 | ID | 名称 |
属于 | 977 |