Use After Free ======================================== 概述 ---------------------------------------- 基本概念 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UAF的产生涉及到两个事件,产生和使用悬垂指针。 当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称悬垂指针(也叫迷途指针,Dangling pointer)。 某些编程语言允许未初始化的指针的存在,而这类指针即为野指针(Wild pointer)。 成因 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 在许多编程语言中(比如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指向的空间的内容。 危害 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 可以概括为三方面: - 破坏完整性:例如对已经释放的内存进行的操作可能破坏正常的数据 - 破坏可用性:例如内存块释放后恰好发生了内存块合并,一些进程使用非法数据作为内存块就会崩溃 - 破坏访问控制:利用UAF读取私密信息