ID: 468 类型:基础 | 状态:未完成 |
描述
在 C和C++中,由于存在指针索引的隐式数据转换,人们经常会意外地引用错误的内存。
相关视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
实现 | 程序员可以通过添加一些字节来尝试从指针索引。这是不正确的,因为C和C++隐式地将操作数按数据类型的大小进行缩放。 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
保密性 | 技术冲击: 内存读取; 修改内存 I指针缩放不正确通常会导致缓冲区溢出。如果弱点是在缓冲区的上下文中,则可能会破坏其保密性。 |
被利用的可能性:
一般
示例
例1
此示例尝试计算指针第二个字节的位置。
(问题代码)
Example Language: C
int *p = x;
char * second_char = (char *)(p + 1);
在本例中,第二个_char用于指向p的第二个字节。但是,将1添加到p实际上会将sizeof(int)添加到p,从而导致不正确的结果(在32位平台上为3个字节)。如果读取结果内存地址,这可能是信息泄漏。如果是一个写,它可能是对非授权内存的安全关键性的写入,不管它是否是缓冲区溢出。请注意,上述代码在其他方面也可能是错误的,特别是在低位编址环境中。
应对措施
阶段: 架构与设计 使用具有高级内存抽象的平台。 |
阶段: 实现 始终使用数组索引而不是直接指针操作。 |
阶段: 架构与设计 使用防止缓冲区溢出的技术。 |
种属
关系 | 类型 | ID | 名称 |
属于 | 737 | CERT C Secure Coding Standard (2008) Chapter 4 - Expressions (EXP) | |
属于 | 884 | ||
属于 | 998 | ||
属于 | 1160 |