11.1. Use After Free

11.1.1. 概述

11.1.1.1. 基本概念

UAF的产生涉及到两个事件,产生和使用悬垂指针。

当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称悬垂指针(也叫迷途指针,Dangling pointer)。

某些编程语言允许未初始化的指针的存在,而这类指针即为野指针(Wild pointer)。

11.1.1.2. 成因

在许多编程语言中(比如C),显示地从内存中删除一个对象或者返回时通过销毁栈帧,并不会改变相关的指针的值。该指针仍旧指向内存中相同的位置,即使引用已经被删除,现在可能已经挪作他用。

举例来说

char* a = malloc(512);
char* b = malloc(256);
char* c;
strcpy(a, "A here");
free(a);
c = malloc(500);
strcpy(c, "C here");

因为glibc使用首次适应(FirstFit)来选取合适的chunk,当a被free后,调用相近大小的malloc,则会分配a的地址。此时没有设置a的地址为 null ,则可以通过a来访问和修改c指向的空间的内容。

11.1.1.3. 危害

可以概括为三方面:

  • 破坏完整性:例如对已经释放的内存进行的操作可能破坏正常的数据

  • 破坏可用性:例如内存块释放后恰好发生了内存块合并,一些进程使用非法数据作为内存块就会崩溃

  • 破坏访问控制:利用UAF读取私密信息