CWE-416: Use After Free(释放后使用)

 

 ID: 416

类型:基础
结构:简单

状态:草稿

 

描述

释放内存后引用内存可能导致程序崩溃、使用意外值或执行代码。

扩展描述

取决于缺陷的实例化应及发生的时点,使用释放的内存可能会产生许多不利的后果,从损坏有效数据到执行任意代码。 发生数据损坏的最简单方法是重新使用释放的内存。释放后使用有两个常见的,有时是重叠的原因:

  • 错误情况和其他异常情况。
  • 对程序的哪个部分负责释放内存感到困惑。

在这种情况下,在释放内存之后的某个时刻,问题内存又被有效地分配给另一个指针。释放内存的原始指针将再次使用,并指向新分配中的某个位置。随着数据的变化,它会损坏有效使用的内存;这会导致进程中出现未定义的行为。

如果新分配的数据恰好保存了一个类,例如在C++中,在堆数据中散布着不同的函数指针。如果这些函数指针中的一个被指向有效壳代码的地址覆盖,则可以实现任意代码的执行。

关联视图

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

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

引入模式

 

阶段

说明

架构与设计

 

实现

 

应用平台

语言

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

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

后果

范围

冲击

可能性

完整性

技术冲击: 修改内存

如果在其他地方正确分配和使用了相关的内存区域,则使用以前释放的内存可能会损坏有效数据。

 

可用性

技术冲击: DoS: 崩溃、退出或重启

如果在使用以前释放的数据之后发生块合并,则当将无效数据用作块信息时,进程可能会崩溃。

 

完整性
保密性
可用性

技术冲击: 执行未获授权的代码或命令

如果在进行块合并之前输入了恶意数据,则可以利用write-what-where缺陷来执行任意代码。

 

被利用的可能性:

示例

例1

(问题代码)

Example Language:

#include <stdio.h>
#include <unistd.h>
#define BUFSIZER1 512
#define BUFSIZER2 ((BUFSIZER1/2) - 8)
int main(int argc, char **argv) {

char *buf1R1;
char *buf2R1;
char *buf2R2;
char *buf3R2;
buf1R1 = (char *) malloc(BUFSIZER1);
buf2R1 = (char *) malloc(BUFSIZER1);
free(buf2R1);
buf2R2 = (char *) malloc(BUFSIZER2);
buf3R2 = (char *) malloc(BUFSIZER2);
strncpy(buf2R1, argv[1], BUFSIZER1-1);
free(buf1R1);
free(buf2R2);
free(buf3R2);

}

例2

 (问题代码)

Example Language:

char* ptr = (char*)malloc (SIZE);
if (err) {

abrt = 1;
free(ptr);

}
...
if (abrt) {

logError("operation aborted before commit", ptr);

}

错误发生时,指针立刻被释放。然而,这个指针在后米的logError函数中被错误的使用。

应对措施

阶段: 架构与设计

选择提供自动内存管理的语言。

阶段: 实现

当释放指针时,确认释放后立刻将其置为NUL。然而,重叠或者复杂数据的使用降低了这个策略的可用性。

种属

关系

类型

ID

名称

属于

398

7PK - Code Quality

属于

399

Resource Management Errors

属于

742

CERT C Secure Coding Standard (2008) Chapter 9 - Memory Management (MEM)

属于

808

2010 Top 25 - Weaknesses On the Cusp

属于

876

CERT C++ Secure Coding Section 08 - Memory Management (MEM)

属于

983

SFP Secondary Cluster: Faulty Resource Use

属于

1162

SEI CERT C Coding Standard - Guidelines 08. Memory Management (MEM)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值