UAF漏洞

UAF(use after free)漏洞

Double Free(双重释放漏洞)

Double Free,即双重释放,是指在程序中对同一块内存使用 free() 函数(在C或C++语言中)释放两次。这种情况通常发生在手动管理内存的编程语言中,如C和C++。当一个动态分配的内存块不再需要时,应该通过调用 free() 函数来释放这块内存。然而,如果这块内存已经被释放过一次,再次尝试释放就会导致“双重释放”的错误。

双重释放形成的原因

重复调用 free():对同一个指针两次调用 free(),而没有在第一次释放后将其置为 NULL

1
2
free(ptr);
free(ptr); // 双重释放

未置空的指针:释放内存后没有将指针置为 NULL,后续误操作再次释放。

1
2
3
free(ptr);
// 没有 ptr = NULL;
free(ptr); // 错误

多个指针指向同一块内存:两个指针指向同一块动态分配的内存,分别对其调用 free()

1
2
3
4
int *p1 = malloc(sizeof(int));
int *p2 = p1;
free(p1);
free(p2); // 双重释放

错误的对象管理

在C++中,如果类的对象包含动态分配的资源,但未正确实现拷贝构造函数或赋值操作符(深拷贝),可能导致两个对象尝试释放同一块内存。

多线程竞争

多个线程同时释放同一块内存,缺乏同步保护。

库函数误用

某些库函数可能已经释放了传入的内存,外部又再次释放。