Переполнение кучи , переполнение кучи или разрушение кучи — это тип переполнения буфера , которое происходит в области данных кучи . Переполнение кучи можно эксплуатировать иным образом, чем переполнение на основе стека . Память в куче динамически выделяется во время выполнения и обычно содержит данные программы. Эксплуатация выполняется путем повреждения этих данных определенным образом, чтобы заставить приложение перезаписать внутренние структуры, такие как указатели связанных списков . Канонический метод переполнения кучи перезаписывает динамическую связь выделения памяти (такую как метаданные) и использует полученный обмен указателями для перезаписи указателя функции программы .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]