Libc Protections
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Malloc виділяє пам'ять у групах по 8 байт (32-біт) або 16 байт (64-біт). Це означає, що кінець частин у 32-бітних системах повинен відповідати 0x8, а в 64-бітних системах - 0x0. Функція безпеки перевіряє, що кожна частина правильно вирівняна в цих конкретних місцях перед використанням вказівника з бін.
Забезпечення вирівнювання частин у 64-бітних системах значно підвищує безпеку Malloc, обмежуючи розміщення підроблених частин лише до 1 з кожних 16 адрес. Це ускладнює зусилля з експлуатації, особливо в сценаріях, де користувач має обмежений контроль над значеннями введення, ускладнюючи атаки та роблячи їх важчими для успішного виконання.
Fastbin Attack on __malloc_hook
Нові правила вирівнювання в Malloc також заважають класичній атаці, що стосується __malloc_hook
. Раніше зловмисники могли маніпулювати розмірами частин, щоб перезаписати цей вказівник функції та отримати виконання коду. Тепер сувора вимога до вирівнювання забезпечує, що такі маніпуляції більше не є життєздатними, закриваючи загальний шлях експлуатації та підвищуючи загальну безпеку.
Pointer Mangling - це вдосконалення безпеки, яке використовується для захисту вказівників fastbin і tcache Fd в операціях управління пам'яттю. Ця техніка допомагає запобігти певним типам тактик експлуатації пам'яті, зокрема тим, які не вимагають витоку інформації про пам'ять або які маніпулюють місцями пам'яті безпосередньо відносно відомих позицій (відносні перезаписи).
Суть цієї техніки - формула обфускації:
New_Ptr = (L >> 12) XOR P
L - це Місце зберігання вказівника.
P - це фактичний вказівник fastbin/tcache Fd.
Причина бітового зсуву місця зберігання (L) на 12 біт вправо перед операцією XOR є критично важливою. Ця маніпуляція вирішує вразливість, властиву детерміністичній природі найменш значущих 12 біт адрес пам'яті, які зазвичай є передбачуваними через обмеження архітектури системи. Зміщуючи біти, передбачувана частина виводиться з рівняння, підвищуючи випадковість нового, спотвореного вказівника і, таким чином, захищаючи від експлуатацій, які покладаються на передбачуваність цих біт.
Цей спотворений вказівник використовує існуючу випадковість, надану Address Space Layout Randomization (ASLR), яка рандомізує адреси, використовувані програмами, щоб ускладнити зловмисникам передбачення макета пам'яті процесу.
Demangling вказівника для отримання оригінальної адреси передбачає використання тієї ж операції 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 як джерел для витоків адрес купи. Однак вказівники в неупорядкованих, малих і великих бінів залишаються неспотвореними, отже, все ще можуть використовуватися для витоку адрес. Ця зміна підштовхує зловмисників досліджувати ці біні для експлуатованої інформації, хоча деякі техніки все ще можуть дозволити деманглінг вказівників перед витоком, хоча з обмеженнями.
For a better explanation of the process check the original post from here.
Формула, що використовується для спотворення та деманглінгу вказівників, є:
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
Pointer guard - це техніка пом'якшення експлуатації, що використовується в glibc для захисту збережених вказівників функцій, особливо тих, що реєструються бібліотечними викликами, такими як atexit()
. Цей захист передбачає перемішування вказівників шляхом XOR'ування їх з секретом, збереженим у даних потоку (fs:0x30
), і застосування бітового зсуву. Цей механізм має на меті запобігти зловмисникам перехоплення управлінського потоку шляхом перезапису вказівників функцій.
Розуміння операцій Pointer Guard: Перемішування (спотворення) вказівників виконується за допомогою макроса PTR_MANGLE
, який XOR'ує вказівник з 64-бітним секретом, а потім виконує лівий зсув на 0x11 біт. Зворотна операція для відновлення оригінального вказівника обробляється PTR_DEMANGLE
.
Стратегія атаки: Атака базується на підході з відомим відкритим текстом, де зловмисник повинен знати як оригінальну, так і спотворену версії вказівника, щоб вивести секрет, використаний для спотворення.
Експлуатація відомих відкритих текстів:
Визначення фіксованих вказівників функцій: Вивчаючи вихідний код glibc або ініціалізовані таблиці вказівників функцій (як __libc_pthread_functions
), зловмисник може знайти передбачувані вказівники функцій.
Обчислення секрету: Використовуючи відомий вказівник функції, такий як __pthread_attr_destroy
, і його спотворену версію з таблиці вказівників функцій, секрет можна обчислити, виконавши зворотний зсув (правий зсув) спотвореного вказівника, а потім XOR'уючи його з адресою функції.
Альтернативні відкриті тексти: Зловмисник також може експериментувати зі спотворенням вказівників з відомими значеннями, такими як 0 або -1, щоб перевірити, чи виробляють вони впізнавані шаблони в пам'яті, потенційно розкриваючи секрет, коли ці шаблони виявляються в дампах пам'яті.
Практичне застосування: Після обчислення секрету зловмисник може маніпулювати вказівниками контрольованим чином, фактично обходячи захист Pointer Guard у багатопотоковому додатку з знанням базової адреси libc та можливістю читати довільні адреси пам'яті.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)