Переповнення купи ( або ) — це тип переповнення буфера, який виникає в області даних купи. Переповнення купи можна використати способом, відмінним від переповнення стека. Пам’ять у купі динамічно виділяється під час виконання і зазвичай містить дані програми. Експлуатація здійснюється шляхом пошкодження цих даних певним чином, щоб змусити застосунок перезаписати внутрішні структури, такі як вказівники у зв'язаних списках. Канонічний метод експлуатації переповнення купи перезаписує структури зв’язків динамічного виділення пам’яті (такі як метадані malloc) і використовує отриманий унаслідок цього обмін вказівниками для перезапису вказівника на функцію програми.
Наприклад, у старих версіях Linux два буфери, виділені поруч один з одним у купі, могли призвести до того, що перший буфер перезаписував метадані другого буфера. Якщо встановити біт використання другого буфера в нуль і задати довжину невеликим від’ємним значенням, яке дозволяє копіювати нульові байти, то коли програма викликає free() для першого буфера, вона спробує об’єднати ці два буфери в один буфер. Коли це відбувається, очікується, що буфер, який вважається звільненим, міститиме два вказівники FD і BK у перших 8 байтах раніше виділеного буфера. BK записується у FD і може бути використаний для перезапису вказівника.
Наслідки
Випадкове переповнення може призвести до пошкодження даних або непередбачуваної поведінки будь-якого процесу, який звертається до ураженої області пам’яті. В операційних системах без захисту пам’яті це може бути будь-який процес у системі.
Наприклад, вразливість переповнення буфера Microsoft у JPEG GDI+ могла дозволити віддалене виконання коду на ураженій машині.
Джейлбрейк iOS часто використовує переповнення купи для отримання виконання довільного коду.
Виявлення та запобігання
Як і у випадку з переповненнями буфера, існує переважно три способи захисту від переповнень купи. Кілька сучасних операційних систем, таких як Windows і Linux, надають певну реалізацію всіх трьох.
Запобігання виконанню корисного навантаження шляхом розділення коду та даних, зазвичай за допомогою апаратних засобів, таких як NX bit Впровадження рандомізації, щоб купа не знаходилася за фіксованим зміщенням, зазвичай за допомогою можливостей ядра, таких як ASLR () Впровадження перевірок узгодженості в менеджер купи
Починаючи з версії 2.3.6, GNU libc містить засоби захисту, здатні виявляти переповнення купи постфактум, наприклад перевіряючи узгодженість вказівників під час виклику unlink. Однак ці засоби захисту від попередніх експлойтів майже одразу виявилися також придатними для експлойтів. Крім того, Linux включив підтримку ASLR у 2005 році, хоча PaX запровадив кращу реалізацію за кілька років до цього. Також Linux включив підтримку NX-біта у 2004 році.
Microsoft включила засоби захисту від переповнення буфера, що перебуває в купі, у квітні 2003 року в Windows Server 2003 та в серпні 2004 року в Windows XP з Service Pack 2. Цими засобами захисту були безпечне від’єднання (safe unlinking) та cookie заголовка запису купи. Пізніші версії Windows, такі як Vista, Server 2008 та Windows 7, містять: видалення структур даних, які часто є цілями атак, рандомізацію метаданих записів купи, розширену роль cookie заголовка купи, рандомізовану базову адресу купи, кодування вказівників на функції, завершення роботи у разі пошкодження купи та варіацію алгоритмів. Алгоритми DEP та ASLR також допомагають пом’якшити цю атаку.
Найпоширенішим методом виявлення переповнень купи є динамічний аналіз у режимі реального часу. Цей метод спостерігає за виконанням програм під час роботи, щоб виявляти вразливості шляхом виявлення порушень безпеки.
Див. також Переповнення буфера Heap spraying Переповнення стекового буфера Шелл-код
Примітки
Посилання Vudo malloc tricks Heap Overflow article at Heise Security Defeating Microsoft Windows XP SP2 Heap protection and DEP bypass