CVE-2026-89805 in Linux
Сводка
по VulDB • 16.09.2026
В ядре Linux была устранена следующая уязвимость:
drm/pagemap: исправление механизма резервного выделения folio и ошибки использования после освобождения (use-after-put)
Функция drm_pagemap_migrate_populate_ram_pfn() имела две проблемы при заполнении PFN оперативной памяти с использованием folio высокого порядка:
1. Вызовы vma_alloc_folio()/folio_alloc() для folio высокого порядка не передавали флаг __GFP_NOWARN, поэтому отказ от выделения THP (Transparent Huge Pages) под давлением памяти приводил к засорению журнала ядра сообщениями об ошибках; кроме того, отсутствовал путь резервного копирования, несмотря на комментарий TODO, указывающий на его необходимость. Добавлен флаг __GFP_NOWARN для выделения высокого порядка и при отказе выполняется переход (fallback) к выделению folio нулевого порядка (order-0) для всего диапазона, изначально охваченного неудачным выделением высокого порядка; при этом флагу MIGRATE_PFN_COMPOUND у этих PFN не устанавливается значение.
2. В пути обработки ошибок free_pages порядок (order) вычислялся через folio_order(page_folio(page)) *после* того, как put_page(page) уже уменьшил счетчик ссылок, что приводило к ошибке use-after-free/put в случае, если это была последняя ссылка на страницу. Порядок необходимо вычислить до освобождения страницы.
Внедрение механизма резервного копирования (fallback), описанного в пункте 1, также требует изменения способа формирования массива исходных страниц, передаваемого функции ->copy_to_ram(). Оба вызывающих объекта заполняли только запись в начале каждого исходного folio, полагаясь на колбэк копирования для получения остальных частей folio из порядка (order), записанного в соответствующей записи drm_pagemap_addr. После того как целевой объект понижен до folio нулевого порядка, записи drm_pagemap_addr становятся страницно-ориентированными; следовательно, требуется исходная страница для каждой из них; оставление их равными NULL приводит к тому, что колбэк копирования останавливается после первой страницы, а остальная часть диапазона никогда не копируется.
Исходный folio разделяется позже функциями migrate_vma_pages() / migrate_device_pages(), поэтому его порядок нельзя использовать для обнаружения понижения (demotion) — вместо этого следует проверять целевой объект на наличие флага MIGRATE_PFN_COMPOUND. Вынесите заполнение массива в отдельную функцию drm_pagemap_migrate_populate_src_pages() и используйте ее как из drm_pagemap_evict_to_ram(), так и из __drm_pagemap_migrate_to_ram().
If you want to get best quality of vulnerability data, you may have to visit VulDB.