Переполнение кучи - 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 также помогают смягчить эту атаку.

Смотрите также

использованная литература

внешние ссылки