0Pricing
Cyber Security Academy · Урок

Эксплуатация кучи: Use-After-Free и распыление кучи

Разберитесь во внутреннем устройстве malloc в glibc, условиях Use-After-Free и методах распыления кучи.

«Эксплуатация кучи: Use-After-Free и распыление кучи» — бесплатный урок Cyber Security Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cyber Security Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cyber Security Academy содержит 4 уроков всего.

Куча

Куча — это динамическая память, выделяемая во время выполнения с помощью malloc()/free()/new/delete. В отличие от стека, размещение данных в куче определяется последовательностями выделения и освобождения памяти, а не стеком вызовов. Уязвимости кучи часто встречаются в браузерах, анализаторах и сетевых службах.

Использование после освобождения (UAF)

Уязвимость Use-After-Free возникает, когда программа продолжает использовать область памяти после её освобождения. Если освобождённая область повторно выделяется под данные, контролируемые злоумышленником, программа начинает работать с данными злоумышленника через устаревший указатель.

Пример UAF

Шаблон UAF:

// Vulnerable C code:
struct Object *obj = malloc(sizeof(*obj));
free(obj);
// Later, attacker causes a new malloc to fill the freed region
// with their data...
obj->method();  // now calls attacker's function pointer!

Фэншуй кучи

Фэншуй кучи (или формирование кучи) — это техника управления распределителем кучи, позволяющая размещать объекты в определённых позициях и контролируемо повторно использовать освобождённую память. Злоумышленник формирует нужную структуру кучи, вызывая выделение и освобождение памяти в точно заданной последовательности.

Распыление по куче

Распыление по куче размещает большие объёмы данных, контролируемых злоумышленником (шелл-код и последовательности NOP), по всей куче. Когда значительная часть кучи заполнена, ошибочный указатель с большой вероятностью попадёт в данные злоумышленника. Этот приём часто используется вместе с уязвимостями UAF или путаницей типов.

// JavaScript heap spray:
var spray = [];
for(var i = 0; i < 100000; i++) {
  spray[i] = unescape("%90%90...shellcode...");
}

Двойное освобождение

Двойное освобождение возникает, когда память освобождается дважды. Второе освобождение повреждает метаданные распределителя кучи (указатели свободного списка), что потенциально позволяет злоумышленнику управлять размещением следующего выделенного блока — то есть записывать данные по произвольному адресу.

Переполнение буфера кучи

Как и при переполнении стека, переполнение буфера кучи записывает данные за пределами выделенного блока в куче. В отличие от переполнений стека, целью обычно становятся метаданные кучи (размер, прямые и обратные указатели) или соседние блоки, содержащие указатели на функции либо указатели виртуальных таблиц.

Путаница типов

Путаница типов возникает, когда область памяти, выделенная под один тип, используется как другой тип. Это часто встречается в движках JavaScript и коде C++. Если злоумышленник может управлять порядком выделения памяти, он может заставить движок воспринимать данные злоумышленника как доверенный объект.

Внутреннее устройство ptmalloc и tcmalloc

Понимание работы распределителя кучи помогает при разработке эксплойтов. ptmalloc из glibc использует корзины (несортированные, малые и большие), а также быстрые корзины. tcache (кэш для каждого потока) является первым источником для выделения памяти. Эксплойты часто направлены на повреждение корзин, чтобы управлять адресами будущих выделений.

Механизмы защиты

Механизмы защиты от эксплуатирования кучи:

  • Рандомизация кучи (часть ASLR) — рандомизирует базовый адрес кучи
  • Безопасное удаление из списка — проверяет прямые и обратные указатели перед удалением
  • Обнаружение отравления tcache — добавлено в glibc 2.32
  • Маскирование указателей — шифрует сохранённые указатели в tcache
  • Языки с безопасным управлением памятью — Rust устраняет UAF во время компиляции

Эксплойты кучи в браузерах

Большинство уязвимостей нулевого дня в браузерах связано с уязвимостями кучи в движках JavaScript (V8, SpiderMonkey). Современные браузеры используют многоэтапные цепочки выхода из песочницы: уязвимость кучи в процессе визуализации → выход в процесс браузера → повышение привилегий OS. Для каждого шага требуется собственная техника.

Быстрая проверка: эксплуатирование кучи

Какая уязвимость позволяет злоумышленнику управлять выполнением программы, используя устаревший указатель на память, которая уже была освобождена и повторно выделена под данные злоумышленника?

Итоги урока

Уязвимости кучи — UAF, двойное освобождение, переполнение кучи и путаница типов — эксплуатируют ошибки управления динамической памятью. Использование после освобождения — наиболее распространённый современный класс эксплойтов. Распыление по куче повышает вероятность попадания в данные злоумышленника. Механизмы защиты: ASLR, безопасное удаление из списка и маскирование указателей. Языки с безопасным управлением памятью, такие как Rust, полностью устраняют эти классы уязвимостей.

Часто задаваемые вопросы

Урок «Эксплуатация кучи: Use-After-Free и распыление кучи» бесплатный?

Да — полный текст урока «Эксплуатация кучи: Use-After-Free и распыление кучи» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cyber Security Academy, подпишись на CoddyKit PRO. Курс Cyber Security Academy содержит 4 уроков всего.

Чему я научусь в уроке «Эксплуатация кучи: Use-After-Free и распыление кучи»?

Разберитесь во внутреннем устройстве malloc в glibc, условиях Use-After-Free и методах распыления кучи. Ты практикуешь Cyber Security Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Cyber Security Academy?

Предыдущий опыт не требуется. Cyber Security Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Эксплуатация кучи: Use-After-Free и распыление кучи»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Cyber Security Academy?

Да. Каждый урок Cyber Security Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Переполнение буфера стека
  2. Программирование, ориентированное на возврат (ROP)
  3. Уязвимости форматных строк
  4. Эксплуатация кучи: Use-After-Free и распыление кучи
← Назад к Cyber Security Academy