ID: 123 类型:基础 | 状态:草稿 |
描述
攻击者能够将任意值写入任意位置的情形。通常是由于缓冲区溢出导致的。
关联视图
与“研究层面”视图(CWE-1000)相关
同"已发布弱点简版"视图 (CWE-1003)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
实现 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
完整性 | 技术冲击: 修改内存; 执行未获授权的代码或命令; 获取特权或者伪装身份; DoS: 崩溃、推出或者重启: 越过保护机制 很明显,“任意写入”可以用于将数据写入策略范围之外的内存区域。而且,它们几乎总是可以用于执行任意代码,这通常不在程序隐式安全策略的范围之内。如果攻击者可以覆盖指针的内存值(通常为32或64位),那么他们可以将函数指针重定向到自己的恶意代码。即使攻击者只能修改单字节代码,也可以执行任意代码。有时,这是因为同一个问题可以重复利用,达到同样的效果。另一些时候,这是因为攻击者可以覆盖安全关键的应用程序特定数据,例如指示用户是否是管理员的标志。 | |
完整性 | 技术冲击: DoS: 崩溃、推出或者重启: 修改内存 许多内存访问可能导致程序终止,例如写入对当前进程无效的地址时。 | |
访问控制 | 技术冲击: 越过保护机制; 其它 当结果是任意代码执行时,这通常可以用来破坏任何其他安全服务。 |
被利用的可能性:
高
示例
例1
当内存分配的记帐信息以特定的方式被覆盖时,会发生“任意写入”的经典示例。下面是一个潜在易受攻击代码的示例:
(问题代码)
Example Language: C
#define BUFSIZE 256
int main(int argc, char **argv) {
char *buf1 = (char *) malloc(BUFSIZE);
char *buf2 = (char *) malloc(BUFSIZE);
strcpy(buf1, argv[1]);
free(buf2);
}
在这种情况下,脆弱性取决于内存布局。对strcpy()的调用可用于写入超过buf1的末尾,并且,对于典型的布局,可以覆盖分配时系统为buf2保留的记帐信息。注意,如果可以覆盖buf2的分配头,那么buf2本身也可以被覆盖。
分配头通常会保留内存“块”的链接列表。特别是,可能有一个“上一个”块和一个“下一个”块。这里,buf2的前一个块可能是buf1,下一个块可能为空。当free()发生时,大多数内存分配器将使用来自buf2的数据重写链接列表。特别是,将更新buf1的“下一个”块,并更新任何后续块的“上一个”块。攻击者可以为“下一个”块插入一个内存地址,并为“上一个”块向该内存地址写入一个值。
这可用于覆盖稍后被取消引用的函数指针,将其替换为攻击者合法访问的内存地址,在该地址中放置恶意代码,从而导致任意代码执行。
应对措施
阶段: 架构与设计 策略: 语言选择 使用提供适当内存抽象的语言 |
阶段: 操作 点发生后,使用操作系统级保护。不是一个完整的解决方案。 |
种属
关系 | 类型 | ID | 名称 |
属于 | 970 | ||
属于 | 1160 | ||
属于 | 1161 | SEI CERT C Coding Standard - Guidelines 07. Characters and Strings (STR) |