Libc Protections
Last updated
Last updated
Вивчайте та практикуйте хакінг AWS: Школа хакінгу HackTricks для експертів червоної команди AWS (ARTE) Вивчайте та практикуйте хакінг GCP: Школа хакінгу HackTricks для експертів червоної команди GCP (GRTE)
Malloc виділяє пам'ять у групах по 8 байтів (32-біт) або 16 байтів (64-біт). Це означає, що кінець чанків у системах 32-біт повинен вирівнюватися з 0x8, а в системах 64-біт - з 0x0. Функція безпеки перевіряє, що кожен чанк вирівнюється правильно на цих конкретних місцях перед використанням вказівника з біна.
Забезпечення вирівнювання чанків у системах 64-біт значно підвищує безпеку Malloc, обмежуючи розміщення фейкових чанків лише на 1 з 16 адрес. Це ускладнює зусилля експлуатації, особливо в сценаріях, де користувач має обмежений контроль над вхідними значеннями, роблячи атаки більш складними та важкими для успішного виконання.
Атака Fastbin на __malloc_hook
Нові правила вирівнювання в Malloc також перешкоджають класичній атакі, що включає __malloc_hook
. Раніше зловмисники могли маніпулювати розмірами чанків, щоб перезаписати цей вказівник функції та отримати виконання коду. Тепер строга вимога вирівнювання гарантує, що такі маніпуляції більше не є життєздатними, закриваючи загальний шлях експлуатації та підвищуючи загальну безпеку.
Змішування вказівників - це захист використовуваний для захисту вказівників Fd fastbin та tcache в операціях управління пам'яттю. Ця техніка допомагає запобігти певним видам тактик експлуатації пам'яті, зокрема тим, які не потребують витоку інформації про пам'ять або які маніпулюють місцями пам'яті безпосередньо відомих позицій (відносні перезаписи).
Основа цієї техніки - це формула затемнення:
New_Ptr = (L >> 12) XOR P
L - це Місце зберігання вказівника.
P - це фактичний вказівник Fd fastbin/tcache.
Причина побітового зсуву місця зберігання (L) на 12 бітів праворуч перед операцією XOR є критичною. Ця маніпуляція вирішує вразливість, що властива визначеній природі менш значущих 12 бітів адрес пам'яті, які зазвичай передбачувані через обмеження архітектури системи. Зсув бітів переносить передбачувану частину з рівняння, підвищуючи випадковість нового, змішаного вказівника та тим самим захищаючи від експлуатацій, які ґрунтуються на передбачуваності цих бітів.
Цей змішаний вказівник використовує існуючу випадковість, яку надає Випадкове розташування простору адрес (ASLR), яке рандомізує адреси, використовані програмами, щоб ускладнити передбачення пам'яті процесу зловмисниками.
Розмішування вказівника для отримання початкової адреси включає в себе використання тієї ж операції XOR. Тут змішаний вказівник розглядається як P у формулі, і коли він XOR-ується з незмінним місцем зберігання (L), він розкриває початковий вказівник. Ця симетрія в змішуванні та розмішуванні забезпечує, що система може ефективно кодувати та декодувати вказівники без значного накладу, значно підвищуючи безпеку від атак, які маніпулюють вказівниками пам'яті.
Змішування вказівників спрямоване на запобігання частковим та повним перезаписам вказівників в купі - значна покращення безпеки. Ця функція впливає на техніки експлуатації кількома способами:
Запобігання відносним перезаписам байтів: Раніше зловмисники могли змінювати частину вказівника, щоб перенаправляти чанки купи на різні місця без точних адрес, техніка, яка була очевидна в експлойті без витоку House of Roman. З змішуванням вказівників такі відносні перезаписи без витоку купи тепер потребують грубої сили, що значно зменшує їх ймовірність успіху.
Підвищення складності атак на Tcache Bin/Fastbin: Загальні атаки, які перезаписують вказівники функцій (наприклад, __malloc_hook
) шляхом маніпулювання записами fastbin або tcache, ускладнені. Наприклад, атака може включати витік адреси LibC, вивільнення чанку в tcache bin, а потім перезапис вказівника Fd для перенаправлення його на __malloc_hook
для виконання довільного коду. З змішуванням вказівників ці вказівники повинні бути правильно змішані, потребуючи витоку купи для точної маніпуляції, тим самим підвищуючи бар'єр експлуатації.
Вимога витоку купи в некупових місцях: Створення фейкового чанку в некупових областях (наприклад, стек, секція .bss або PLT/GOT) тепер також потребує витоку купи через потребу в змішуванні вказівників. Це розширює складність експлуатації цих областей, подібно до вимоги маніпулювання адресами LibC.
Витік адрес купи стає складнішим: Змішування вказівників обмежує корисність вказівників Fd в fastbin та tcache bins як джерел для витоку адрес купи. Однак вказівники в несортованих, малих та великих бінах залишаються незмішаними, тому все ще можна використовувати їх для витоку адрес. Цей зсув змушує зловмисників досліджувати ці біни для експлойтабельної інформації, хоча деякі техніки все ще можуть дозволяти розмішування вказівників перед витоком, хоча з обмеженнями.
Для кращого пояснення процесу перевірте оригінальний пост тут.
Формула, яка використовується для змішування та розмішування вказівників:
New_Ptr = (L >> 12) XOR P
Де L - це місце зберігання, а P - це вказівник Fd. Коли L зсувається праворуч на 12 бітів, ви отримуєте найбільш значущі біти P, через природу XOR, яка виводить 0, коли біти XOR-уються самі з собою.
Ключові кроки в алгоритмі:
Початковий витік найбільш значущих бітів: Проводячи XOR зі зсунутим L та P, ви отримуєте верхні 12 бітів P, оскільки зсунута частина L буде нульовою, залишаючи відповідні біти P без змін.
Відновлення бітів вказівника: Оскільки XOR є оборотнім, знання результату та одного з операндів дозволяє вам обчислити інший операнд. Ця властивість використовується для виведення всього набору бітів для P, послідовно XOR-уючи відомі набори бітів з частинами змішаного вказівника.
Ітеративне розмішування: Процес повторюється, кожного разу використовуючи відкриті біти P з попереднього кроку для декодування наступного сегмента змішаного вказівника, поки всі біти не будуть відновлені.
Обробка детермінованих бітів: Останні 12 бітів L втрачаються через зсув, але вони детерміновані і можуть бути відновлені після процесу.
Ви можете знайти реалізацію цього алгоритму тут: https://github.com/mdulin2/mangle
Захист від використання вказівників - це техніка мінімізації вразливостей, яка використовується в glibc для захисту збережених вказівників функцій, зокрема тих, які зареєстровані викликами бібліотеки, такими як atexit()
. Цей захист полягає в перемішуванні вказівників шляхом використання операції XOR з секретом, збереженим у даних потоку (fs:0x30
), та застосуванням побітового зсуву. Цей механізм спрямований на запобігання атакам, спрямованим на захоплення керування шляхом перезапису вказівників функцій.
Розуміння Операцій захисту від використання вказівників: Перемішування (змішування) вказівників виконується за допомогою макроса PTR_MANGLE
, який виконує операцію XOR з вказівником на 64 біти, а потім виконує лівий зсув на 0x11 бітів. Зворотна операція для відновлення початкового вказівника виконується за допомогою PTR_DEMANGLE
.
Стратегія атаки: Атака базується на підході з відомим текстом, де атакер повинен знати як початкову, так і перемішану версії вказівника для визначення секрету, використаного для перемішування.
Використання Відомих Текстів:
Визначення Фіксованих Вказівників Функцій: Шляхом аналізу вихідного коду glibc або таблиць вказівників функцій (наприклад, __libc_pthread_functions
), атакер може знайти передбачувані вказівники функцій.
Обчислення Секрету: З використанням відомого вказівника функції, такого як __pthread_attr_destroy
та його перемішаної версії з таблиці вказівників функцій, секрет можна обчислити, виконавши зворотний зсув (правий зсув) перемішаного вказівника, а потім виконавши операцію XOR з адресою функції.
Альтернативні Відомі Тексти: Атакер також може експериментувати з перемішуванням вказівників з відомими значеннями, такими як 0 або -1, щоб перевірити, чи вони створюють ідентифіковані шаблони в пам'яті, що потенційно розкриє секрет, коли ці шаблони будуть знайдені в витоках пам'яті.
Практичне Застосування: Після обчислення секрету атакер може маніпулювати вказівниками контрольованим способом, фактично обходячи захист від використання вказівників у багатопотоковій програмі знанням базової адреси libc та можливістю читати довільні місця в пам'яті.