Переполнение кучи
Переполнение кучи , переполнение кучи или разрушение кучи — это тип переполнения буфера , который происходит в области данных кучи . Переполнение кучи можно использовать иначе, чем переполнение стека . Память в куче динамически выделяется во время выполнения и обычно содержит данные программы. Эксплуатация осуществляется путем повреждения этих данных определенным образом, что заставляет приложение перезаписывать внутренние структуры, такие как связанных списков указатели . Метод канонического переполнения кучи перезаписывает связь динамического распределения памяти (например, malloc
метаданные) и использует полученный обмен указателями для перезаписи указателя функции программы .
Например, в старых версиях Linux два буфера, расположенные рядом друг с другом в куче, могут привести к тому, что первый буфер перезапишет метаданные второго буфера. Установив бит использования на ноль во втором буфере и установив длину на небольшое отрицательное значение, которое позволяет копировать нулевые байты, когда программа вызывает free()
в первом буфере он попытается объединить эти два буфера в один. Когда это произойдет, ожидается, что буфер, который предположительно будет освобожден, будет содержать два указателя FD и BK в первых 8 байтах ранее выделенного буфера. BK записывается в FD и может использоваться для перезаписи указателя.
Последствия [ править ]
Случайное переполнение может привести к повреждению данных или неожиданному поведению любого процесса, обращающегося к затронутой области памяти. В операционных системах без защиты памяти это может быть любой процесс в системе.
Например, уязвимость переполнения буфера Microsoft JPEG GDI+ может сделать возможным удаленное выполнение кода на уязвимом компьютере. [1]
При джейлбрейке iOS часто используется переполнение кучи для выполнения произвольного кода .
Обнаружение и предотвращение [ править ]
Как и в случае с переполнением буфера, существует три способа защиты от переполнения кучи. Некоторые современные операционные системы , такие как Windows и Linux, в некоторой степени реализуют все три.
- Предотвратите выполнение полезной нагрузки, разделив код и данные, обычно с помощью аппаратных функций, таких как NX-бит.
- Ввести рандомизацию, чтобы куча не находилась по фиксированному смещению, обычно с помощью таких функций ядра, как ASLR ( рандомизация макета адресного пространства ).
- Внедрить проверки работоспособности в менеджере кучи
Начиная с версии 2.3.6, библиотека GNU libc включает средства защиты, которые могут обнаружить переполнение кучи постфактум, например, проверяя согласованность указателя при вызове. unlink
. Однако почти сразу же выяснилось, что эта защита от предыдущих эксплойтов также может быть использована. [2] [3] Кроме того, с 2005 года в Linux включена поддержка ASLR , хотя несколько лет назад PaX представил лучшую реализацию. Также с 2004 года в Linux включена поддержка NX-бита.
Microsoft включила защиту от переполнения резидентного буфера кучи с апреля 2003 года в Windows Server 2003 и с августа 2004 года в Windows XP с пакетом обновления 2 . Этими мерами по смягчению последствий были безопасное отсоединение и файлы cookie заголовков записи в куче. Более поздние версии Windows, такие как Vista , Server 2008 и Windows 7, включают: удаление часто используемых структур данных, рандомизацию метаданных записи кучи, расширенную роль файла cookie заголовка кучи, рандомизированный базовый адрес кучи, кодирование указателя функции , прекращение повреждения кучи и изменение алгоритма. . Предотвращение выполнения обычных данных (DEP) и ASLR также помогают смягчить эту атаку. [4]
Наиболее распространенным методом обнаружения переполнения кучи является онлайн-динамический анализ. Этот метод наблюдает за выполнением программ во время выполнения для выявления уязвимостей посредством обнаружения нарушений безопасности. [5]
См. также [ править ]
Ссылки [ править ]
- ^ «Бюллетень по безопасности Microsoft MS04-028, Переполнение буфера при обработке JPEG (GDI+) может разрешить выполнение кода (833987)» . Майкрософт . 14 сентября 2004 г. Проверено 29 марта 2016 г.
- ^ «Маллок Малефикарум» . Октябрь 2005 года . Проверено 24 апреля 2017 г. .
- ^ «МАЛЛОК ДЕ-МАЛЕФИКАРУМ» . 2009 . Проверено 29 марта 2016 г.
- ^ «Предотвращение использования уязвимостей повреждения кучи пользовательского режима» . Блог Technet, Microsoft Security Research & Defense. 4 августа 2009 г. Проверено 29 марта 2016 г.
- ^ Ассоциация USENIX, изд. (2005). Материалы второго семинара по реальным большим распределенным системам: 13 декабря 2005 г., Сан-Франциско, Калифорния, США . Ассоциация ЮСЕНИКС. ISBN 978-1-931971-40-9 .