Переполнение кучи - Heap overflow
Переполнение , кучи переполнения или куча ломка представляет собой тип переполнения буфера , что происходит в кучах области данных. Переполнение кучи может использоваться иначе, чем переполнение на основе стека . Память в куче динамически выделяется во время выполнения и обычно содержит данные программы. Эксплуатация выполняется путем повреждения этих данных определенными способами, чтобы приложение перезаписало внутренние структуры, такие как указатели связанных списков . Метод канонического переполнения кучи перезаписывает связь распределения динамической памяти (например, метаданные) и использует результирующий обмен указателями для перезаписи указателя программной функции .
malloc
Например, в более старых версиях Linux два буфера, расположенные рядом друг с другом в куче, могут привести к тому, что первый буфер перезапишет метаданные второго буфера. Установив нулевой бит использования второго буфера и установив длину небольшого отрицательного значения, которое позволяет копировать нулевые байты, когда программа вызывает free()
первый буфер, она попытается объединить эти два буфера в один буфер. . Когда это произойдет, ожидается, что буфер, который предполагается освобожденным, будет содержать два указателя FD и BK в первых 8 байтах ранее выделенного буфера. BK записывается в FD и может использоваться для перезаписи указателя.
Последствия
Случайное переполнение может привести к повреждению данных или неожиданному поведению любого процесса, обращающегося к затронутой области памяти. В операционных системах без защиты памяти это может быть любой процесс в системе.
Например, уязвимость, связанная с переполнением буфера Microsoft JPEG GDI +, может сделать возможным удаленное выполнение кода на уязвимом компьютере.
Взлом iOS часто использует переполнение кучи для выполнения произвольного кода .
Обнаружение и предотвращение
Как и в случае с переполнением буфера, существует три основных способа защиты от переполнения кучи. Некоторые современные операционные системы, такие как Windows и Linux, предоставляют некоторую реализацию всех трех.
- Предотвратить выполнение полезной нагрузки, разделив код и данные, обычно с помощью аппаратных функций, таких как NX-бит
- Ввести рандомизацию, чтобы куча не находилась с фиксированным смещением, обычно с такими функциями ядра , как ASLR ( рандомизация разметки адресного пространства )
- Ввести проверки работоспособности в диспетчер кучи
Начиная с версии 2.3.6, GNU libc включает средства защиты, которые могут обнаруживать переполнение кучи постфактум, например, проверяя согласованность указателя при вызове unlink
. Однако почти сразу же было показано, что эти средства защиты от предыдущих эксплойтов тоже могут быть использованы. Кроме того, Linux поддерживает ASLR с 2005 года, хотя PaX несколько лет назад представил лучшую реализацию. Также Linux с 2004 года поддерживает NX-bit.
Microsoft включила средства защиты от переполнения резидентного буфера кучи с апреля 2003 г. в Windows Server 2003 и с августа 2004 г. в Windows XP с пакетом обновления 2 . Этими смягчениями были безопасное отключение и файлы cookie заголовка записи в куче. Более поздние версии Windows, такие как Vista , Server 2008 и Windows 7, включают в себя: удаление часто используемых структур данных, рандомизацию метаданных записи кучи, расширенную роль файла cookie заголовка кучи, рандомизированный базовый адрес кучи, кодирование указателя функций , прекращение повреждения кучи и изменение алгоритма. . Нормальное предотвращение выполнения данных (DEP) и ASLR также помогают смягчить эту атаку.