Введение

Аномалия программного обеспечения
Переполнение кучи, переполнение буфера кучи или повреждение кучи — это тип переполнения буфера, возникающий в области данных кучи. Переполнения кучи эксплуатируются иначе, чем переполнения, основанные на стеке. Память в куче динамически выделяется во время выполнения и обычно содержит данные программы. Эксплуатация выполняется путем намеренного искажения этих данных для перезаписи внутренних структур, таких как указатели связанных списков. Классический метод эксплуатации переполнения кучи заключается в перезаписи информации о динамическом выделении памяти (например, метаданных malloc) и использовании полученного обмена указателями для перезаписи указателя функции программы. Например, в старых версиях Linux два буфера, выделенные рядом друг с другом в куче, могли привести к тому, что первый буфер перезаписывал метаданные второго буфера. Установив бит "в использовании" второго буфера в ноль и задав длину небольшим отрицательным значением, позволяющим копировать нулевые байты, при вызове функции free для первого буфера программа попытается объединить эти два буфера в один. В этом случае буфер, который предполагается освободить, должен содержать два указателя – FD и BK – в первых 8 байтах ранее выделенной памяти. Значение BK записывается в FD и может быть использовано для перезаписи указателя.

Последствия

Случайное переполнение буфера может привести к повреждению данных или непредсказуемому поведению любого процесса, обращающегося к затронутой области памяти. В операционных системах без защиты памяти это может быть любой процесс в системе. Например, уязвимость переполнения буфера Microsoft JPEG GDI+ может позволить удалённое выполнение кода на уязвимой машине. В iOS-джеилбрейке часто используются переполнения в динамической памяти (heap overflows) для получения возможности произвольного выполнения кода.