ID: 463 类型:基础 |
状态:未完成 |
描述
意外删除数据结构哨兵会导致严重的编程逻辑问题。
扩展描述
通常情况下,数据结构哨兵用来标记数据结构的结构。一个常见的例子是字符串末尾的空字符。另一个常见的例子是链表,其中可能包含一个标记列表结尾的哨兵。允许轻松访问此类控制数据是危险的。因此,在一些提供安全性的包装器接口之外,保护它不被删除或修改是很重要的。
相关视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 |
说明 |
架构与设计 | |
实现 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
后果
范围 |
冲击 |
可能性 |
可利用性 |
技术冲击: 其它 通常,此错误会导致数据结构无法正常工作。 | |
认证 |
技术冲击: 其它 如果删除了空字符等控制字符,可能会导致资源访问控制问题。 |
示例
例1
此示例创建以空结尾的字符串并打印其内容。
(问题代码)
Example Language: C
char *foo;
int counter;
foo=calloc(sizeof(char)*10);
for (counter=0;counter!=10;counter++) {
foo[counter]='a';
printf("%s\n",foo);
}
字符串foo有9个字符的空间和一个空终止符,但其中写入了10个字符。因此,字符串foo不是以空结尾的,对其调用printf()将产生不可预测的可能危险的结果。
应对措施
阶段: 架构与设计 使用精简库以便舍弃有风险的API。不是一个完整的解决方案。 |
阶段: 编译及链接 策略: 强化编译与链接 使用自动提供保护机制的功能或扩展运行或编译软件,以减轻或消除缓冲区溢出。 例如,某些编译器和扩展提供了内置于编译代码中的自动缓冲区溢出检测机制。示例包括Microsoft Visual Studio/GS标志、Fedora/Red Hat强化源代码gcc标志、StackGuard和Propolice。有效性: 深度防御 Note: 这不一定是一个完整的解决方案,因为这些机制只能检测某些类型的溢出。此外,攻击仍然可能导致拒绝服务,因为典型的响应是退出应用程序。 |
阶段: 操作 使用操作系统级别的预防功能。不是完整的解决方案。 |