Переполнение кучи
Что такое Переполнение кучи?
Переполнение кучиПереполнение буфера, возникающее в динамически выделяемой памяти и часто повреждающее метаданные аллокатора, указатели на функции или таблицы виртуальных методов объектов.
Переполнение кучи записывает данные за пределами конца буфера, выделенного в куче, затирая соседние чанки или служебные метаданные, которыми управляют malloc/free, jemalloc, mimalloc и другие аллокаторы. В отличие от переполнения стека, здесь нет адреса возврата, который можно было бы перехватить напрямую; вместо этого злоумышленники повреждают данные, которым программа доверится позже, — указатель на функцию соседнего объекта, указатель на vtable в C++, управляющий блок умного указателя или ссылки списка свободных блоков аллокатора, используемые при вызове free() (классический примитив «unlink»).
Поскольку расположение объектов в куче недетерминировано, эксплуатация зависит от груминга кучи / фэн-шуй (heap grooming / feng shui): выполнения контролируемых выделений и освобождений памяти, чтобы полезная цель оказалась непосредственно после уязвимого буфера. Каноничный реальный пример — GHOST (CVE-2015-0235), переполнение кучи в функции __nss_hostname_digits_dots() библиотеки glibc, достижимое через gethostbyname(); в 2015 году Qualys продемонстрировала полное удалённое выполнение кода против почтового сервера Exim, а сам дефект незаметно существовал начиная с glibc 2.2. CVE-2018-4407 показала тот же класс уязвимостей в ядре XNU компании Apple, вызываемый удалённо одним специально сформированным TCP-пакетом.
flowchart TD
A[Выделить объект-жертву и уязвимый буфер рядом] --> B[Груминг кучи размещает цель после буфера]
B --> C[Переполнение пишет за пределы конца буфера]
C --> D{Повреждённая цель}
D -->|Метаданные аллокатора| E[free unlink -> произвольная запись]
D -->|Указатель на функцию / vtable| F[Перенаправить поток управления]
E --> G[Выполнение кода]
F --> GЗащита сочетает усиление аллокатора (проверки целостности метаданных, безопасный unlink, изоляцию чанков, страницы-охранники) с ASLR, CFI, песочницами и переходом на безопасные по памяти языки, такие как Rust. Переполнения кучи остаются центральными для эксплуатации браузеров, ядер и парсеров документов и часто фигурируют в победных цепочках Pwn2Own.
● Примеры
- 01
GHOST (CVE-2015-0235) — переполнение кучи в функции gethostbyname библиотеки glibc, достижимое через почтовые серверы Exim.
- 02
CVE-2018-4407 — переполнение кучи в TCP-опциях ядра XNU, вызываемое по сети.
● Частые вопросы
Что такое Переполнение кучи?
Переполнение буфера, возникающее в динамически выделяемой памяти и часто повреждающее метаданные аллокатора, указатели на функции или таблицы виртуальных методов объектов. Относится к категории Уязвимости в кибербезопасности.
Что означает Переполнение кучи?
Переполнение буфера, возникающее в динамически выделяемой памяти и часто повреждающее метаданные аллокатора, указатели на функции или таблицы виртуальных методов объектов.
Как защититься от Переполнение кучи?
Защита от Переполнение кучи обычно сочетает технические меры и операционные практики, как описано в определении выше.
Какие есть другие названия Переполнение кучи?
Распространённые альтернативные названия: Переполнение буфера в куче.