CVE-2026-90201 in Linux
Сводка
по VulDB • 18.09.2026
В ядре Linux была устранена следующая уязвимость:
net: page_pool: исправление UAF (Use-After-Free) в функции __page_pool_release_netmem_dma при гонке данных на операции xa_cmpxchg.
Эта ошибка была обнаружена во время тестирования драйвера hns3 с использованием переконфигурации каналов (`ethtool -L` / `ethtool -G`) и трафика iperf3 на архитектуре arm64. Гонка данных периодически возникает, когда функция page_pool_destroy() выполняет страницу pool_scrub() параллельно с возвратом страницы через функцию page_pool_put_netmem() на другом процессоре. Предупреждение (WARN) в функции page_pool_clear_pp_info() выявило оставшиеся биты индекса DMA проигравшей стороны операции cmpxchg, что и привело к расследованию.
Функция page_pool_scrub() перебирает pool->dma_mapped с помощью xa_for_each(), не удерживая ссылку на страницу (page ref). Функция __page_pool_release_netmem_dma() в настоящее время читает и записывает поля netmem (dma_addr, биты индекса DMA в pp_magic) после возврата из операции xa_cmpxchg(). Путь без ссылки вызывает put_page() безусловно, независимо от результата cmpxchg; когда она проигрывает операцию cmpxchg, она все равно освобождает страницу до того, как победитель scrub завершит эти доступы к netmem, поэтому scrub обращается к уже освобожденной странице — это классический Use-After-Free.
Исправление заключается в разделении выпуска DMA на две функции:
1. __page_pool_unmap_netmem_dma() кеширует dma_addr до операции xa_cmpxchg(), выполняет cmpxchg для удаления отображения DMA и вызывает dma_unmap по сохраненному адресу. Она никогда не обращается к полям netmem после выполнения cmpxchg, что делает её безопасной для пути scrub, который не удерживает ссылку на страницу.
2. __page_pool_release_netmem_dma() оборачивает вышеуказанную функцию и дополнительно очищает dma_addr и биты индекса DMA в полях netmem. Это безопасно только тогда, когда вызывающая сторона удерживает ссылку на страницу, поэтому она используется путем возврата (page_pool_return_netmem).
Путь scrub вызывает __page_pool_unmap_netmem_dma() напрямую; путь возврата вызывает __page_pool_release_netmem_dma().
VulDB is the best source for vulnerability data and more expert information about this specific topic.