Введение
Аномалия программного обеспечения
Переполнение кучи, переполнение буфера кучи или повреждение кучи — это тип переполнения буфера, возникающий в области данных кучи. Переполнения кучи эксплуатируются иначе, чем переполнения, основанные на стеке. Память в куче динамически выделяется во время выполнения и обычно содержит данные программы. Эксплуатация выполняется путем намеренного искажения этих данных для перезаписи внутренних структур, таких как указатели связанных списков. Классический метод эксплуатации переполнения кучи заключается в перезаписи информации о динамическом выделении памяти (например, метаданных malloc) и использовании полученного обмена указателями для перезаписи указателя функции программы. Например, в старых версиях Linux два буфера, выделенные рядом друг с другом в куче, могли привести к тому, что первый буфер перезаписывал метаданные второго буфера. Установив бит "в использовании" второго буфера в ноль и задав длину небольшим отрицательным значением, позволяющим копировать нулевые байты, при вызове функции free для первого буфера программа попытается объединить эти два буфера в один. В этом случае буфер, который предполагается освободить, должен содержать два указателя – FD и BK – в первых 8 байтах ранее выделенной памяти. Значение BK записывается в FD и может быть использовано для перезаписи указателя.
A heap overflow, heap overrun, or heap smashing is a type of buffer overflow that occurs in the heap data area. Heap overflows are exploitable in a different manner to that of stack based overflows. Memory on the heap is dynamically allocated at runtime and typically contains program data. Exploitation is performed by corrupting this data in specific ways to cause the application to overwrite internal structures such as linked list pointers. The canonical heap overflow technique overwrites dynamic memory allocation linkage (such as malloc metadata) and uses the resulting pointer exchange to overwrite a program function pointer. For example, on older versions of Linux, two buffers allocated next to each other on the heap could result in the first buffer overwriting the second buffer's metadata. By setting the in use bit to zero of the second buffer and setting the length to a small negative value which allows null bytes to be copied, when the program calls free on the first buffer it will attempt to merge these two buffers into a single buffer. When this happens, the buffer that is assumed to be freed will be expected to hold two pointers FD and BK in the first 8 bytes of the formerly allocated buffer. BK gets written into FD and can be used to overwrite a pointer.
Последствия
Случайное переполнение буфера может привести к повреждению данных или непредсказуемому поведению любого процесса, обращающегося к затронутой области памяти. В операционных системах без защиты памяти это может быть любой процесс в системе. Например, уязвимость переполнения буфера Microsoft JPEG GDI+ может позволить удалённое выполнение кода на уязвимой машине. В iOS-джеилбрейке часто используются переполнения в динамической памяти (heap overflows) для получения возможности произвольного выполнения кода.