Double Free
Basic Information
Якщо ви звільняєте блок пам'яті більше ніж один раз, це може порушити дані аллокатора і відкрити двері для атак. Ось як це відбувається: коли ви звільняєте блок пам'яті, він повертається до списку вільних частин (наприклад, "швидкий бін"). Якщо ви звільняєте той самий блок двічі підряд, аллокатор виявляє це і видає помилку. Але якщо ви звільняєте іншу частину між цим, перевірка на подвійне звільнення обходиться, що призводить до пошкодження.
Тепер, коли ви запитуєте нову пам'ять (використовуючи malloc
), аллокатор може надати вам блок, який був звільнений двічі. Це може призвести до того, що два різні вказівники вказують на одне й те саме місце в пам'яті. Якщо зловмисник контролює один з цих вказівників, він може змінити вміст цієї пам'яті, що може викликати проблеми з безпекою або навіть дозволити йому виконати код.
Example:
У цьому прикладі, після заповнення tcache кількома звільненими частинами (7), код звільняє частину h
, потім частину i
, а потім знову h
, що викликає подвійне звільнення (також відоме як Fast Bin dup). Це відкриває можливість отримання перекриваючих адрес пам'яті під час повторного виділення, що означає, що два або більше вказівників можуть вказувати на одне й те саме місце в пам'яті. Маніпулювання даними через один вказівник може вплинути на інший, створюючи критичний ризик безпеки та потенціал для експлуатації.
Виконуючи це, зверніть увагу, як i1
і i2
отримали одну й ту ж адресу:
Приклади
Ми можемо виділяти лише частини розміру Fast-Bin, за винятком розміру
0x70
, що запобігає звичайному переписуванню__malloc_hook
.Натомість ми використовуємо адреси PIE, які починаються з
0x56
, як ціль для Fast Bin dup (1/2 шанс).Одне місце, де зберігаються адреси PIE, - це
main_arena
, який знаходиться всередині Glibc і поруч з__malloc_hook
.Ми націлюємося на конкретний зсув
main_arena
, щоб виділити частину там і продовжувати виділяти частини, поки не досягнемо__malloc_hook
, щоб отримати виконання коду.Використовуючи Tcache bins і переповнення нульовим байтом, ми можемо досягти ситуації з подвійним звільненням:
Ми виділяємо три частини розміру
0x110
(A
,B
,C
)Ми звільняємо
B
Ми звільняємо
A
і знову виділяємо, щоб використати переповнення нульовим байтомТепер поле розміру
B
становить0x100
, замість0x111
, тому ми можемо звільнити його зновуУ нас є один Tcache-bin розміру
0x110
і один розміру0x100
, які вказують на одну й ту ж адресу. Отже, у нас є подвійне звільнення.Ми використовуємо подвійне звільнення за допомогою Tcache poisoning
Посилання
Last updated