stringtranslate.com

Переполнение кучи

Переполнение кучи , переполнение кучи или разрушение кучи — это тип переполнения буфера , которое происходит в области данных кучи . Переполнение кучи можно эксплуатировать иным образом, чем переполнение на основе стека . Память в куче динамически выделяется во время выполнения и обычно содержит данные программы. Эксплуатация выполняется путем повреждения этих данных определенным образом, чтобы заставить приложение перезаписать внутренние структуры, такие как указатели связанных списков . Канонический метод переполнения кучи перезаписывает динамическую связь выделения памяти (такую ​​как метаданные) и использует полученный обмен указателями для перезаписи указателя функции программы .malloc

Например, в старых версиях Linux два буфера, выделенные рядом друг с другом в куче, могут привести к тому, что первый буфер перезапишет метаданные второго буфера. Установив бит использования в ноль второго буфера и установив длину в небольшое отрицательное значение, которое позволяет копировать нулевые байты, когда программа вызывает free()первый буфер, она попытается объединить эти два буфера в один буфер. Когда это произойдет, буфер, который предполагается освобожденным, будет содержать два указателя FD и BK в первых 8 байтах ранее выделенного буфера. BK записывается в FD и может использоваться для перезаписи указателя.

Последствия

Случайное переполнение может привести к повреждению данных или неожиданному поведению любого процесса, который обращается к затронутой области памяти. В операционных системах без защиты памяти это может быть любой процесс в системе.

Например, уязвимость переполнения буфера Microsoft JPEG GDI+ может позволить удаленное выполнение кода на уязвимой машине. [1]

Взлом iOS часто использует переполнение кучи для выполнения произвольного кода .

Обнаружение и предотвращение

Как и в случае с переполнением буфера, есть три основных способа защиты от переполнения кучи. Несколько современных операционных систем, таких как Windows и Linux, предоставляют некоторую реализацию всех трех.

Начиная с версии 2.3.6 GNU libc включает в себя защиту, которая может обнаружить переполнение кучи постфактум, например, путем проверки согласованности указателя при вызове unlink. Однако эти защиты от предыдущих эксплойтов почти сразу же оказались также пригодными для эксплуатации. [2] [3] Кроме того, Linux включил поддержку ASLR с 2005 года, хотя PaX представил лучшую реализацию за несколько лет до этого. Также Linux включил поддержку NX-bit с 2004 года.

Microsoft включила защиту от переполнения буфера резидентной кучи с апреля 2003 года в Windows Server 2003 и августа 2004 года в Windows XP с пакетом обновления 2. Этими мерами были безопасное отсоединение и файлы cookie заголовка записи кучи. Более поздние версии Windows, такие как Vista , Server 2008 и Windows 7, включают: удаление часто используемых целевых структур данных, рандомизацию метаданных записи кучи, расширенную роль файла cookie заголовка кучи, рандомизированный базовый адрес кучи, кодирование указателя функции , прекращение повреждения кучи и изменение алгоритма. Обычное предотвращение выполнения данных (DEP) и ASLR также помогают смягчить эту атаку. [4]

Наиболее распространенным методом обнаружения переполнений кучи является динамический анализ в режиме реального времени. Этот метод наблюдает за выполнением программ во время выполнения для выявления уязвимостей посредством обнаружения нарушений безопасности. [5]

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

Ссылки

  1. ^ "Microsoft Security Bulletin MS04-028, Переполнение буфера при обработке JPEG (GDI+) может привести к выполнению кода (833987)". Microsoft . 14 сентября 2004 г. Получено 29 марта 2016 г.
  2. ^ "The Malloc Maleficarum". Октябрь 2005 г. Получено 24 апреля 2017 г.
  3. ^ "MALLOC DES-MALEFICARUM". 2009 . Получено 29 марта 2016 .
  4. ^ "Предотвращение эксплуатации уязвимостей повреждения кучи пользовательского режима". Блог Technet, Microsoft Security Research & Defense. 4 августа 2009 г. Получено 29 марта 2016 г.
  5. ^ Ассоциация USENIX, ред. (2005). Труды Второго семинара по реальным, большим распределенным системам: 13 декабря 2005 г., Сан-Франциско, Калифорния, США . Ассоциация USENIX. ISBN 978-1-931971-40-9.

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