CWE-123: Write-what-where Condition(任意写入)

 ID: 123

类型:基础
结构:简单

状态:草稿

 

+描述

攻击者能够将任意值写入任意位置的情形。通常是由于缓冲区溢出导致的。

+关联视图

+与“研究层面”视图(CWE-1000)相关

+同"已发布弱点简版"视图 (CWE-1003)相关

+与“开发层面”视图(CWE-699)相关

+引入模式

 

阶段

说明

实现

 

+应用平台

语言

C (出现的可能性不确定)

C++ (出现的可能性不确定)

+后果

范围

冲击

可能性

完整性
保密性
可利用性
访问控制

技术冲击: 修改内存; 执行未获授权的代码或命令; 获取特权或者伪装身份; DoS: 崩溃、推出或者重启: 越过保护机制

很明显,“任意写入”可以用于将数据写入策略范围之外的内存区域。而且,它们几乎总是可以用于执行任意代码,这通常不在程序隐式安全策略的范围之内。如果攻击者可以覆盖指针的内存值(通常为32或64位),那么他们可以将函数指针重定向到自己的恶意代码。即使攻击者只能修改单字节代码,也可以执行任意代码。有时,这是因为同一个问题可以重复利用,达到同样的效果。另一些时候,这是因为攻击者可以覆盖安全关键的应用程序特定数据,例如指示用户是否是管理员的标志。

 

完整性
可利用性

技术冲击: DoS: 崩溃、推出或者重启: 修改内存

许多内存访问可能导致程序终止,例如写入对当前进程无效的地址时。

 

访问控制
其它

技术冲击: 越过保护机制; 其它

当结果是任意代码执行时,这通常可以用来破坏任何其他安全服务。

 

+被利用的可能性:

+示例

例1

当内存分配的记帐信息以特定的方式被覆盖时,会发生“任意写入”的经典示例。下面是一个潜在易受攻击代码的示例:

(问题代码)

Example Language:

#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

SFP Secondary Cluster: Faulty Buffer Access

属于

1160

SEI CERT C Coding Standard - Guidelines 06. Arrays (ARR)

属于

1161

SEI CERT C Coding Standard - Guidelines 07. Characters and Strings (STR)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值