CVE-2026-46242
eventpoll: исправление UAF в ep_remove для struct eventpoll / struct file
- Опубликовано
- 30 мая 2026 г.
- Обновлено
- 5 авг. 2026 г.
- Назначение CNA
- Linux
- Наблюдены доказательства
- 8 авг. 2026 г.
Первичный CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HНизкий · следующие 30 дней
- Процентиль
- 87,4 %
- Дата модели
- 21 сент. 2026 г.
EPSS – это статистическая оценка, а не достоверность или мера воздействия. Объедините это с CVSS, статусом KEV, воздействием и вашей средой.
Резюме
В ядре Linux устранена следующая уязвимость: eventpoll: исправление UAF (use-after-free) для struct eventpoll / struct file в ep_remove. В ep_remove() (через ep_remove_file()) очищался file->f_ep под защитой file->f_lock, но затем @file продолжал использоваться внутри критической секции (is_file_epoll(), hlist_del_rcu() через голову списка, spin_unlock). В этом окне конкурирующий __fput(), проходивший по быстрому пути eventpoll_release(), наблюдал временный NULL, пропускал eventpoll_release_file() и доходил до f_op->release / file_free(). В случае «epoll наблюдает за epoll» f_op->release — это ep_eventpoll_release() -> ep_clear_and_put() -> ep_free(), которая через kfree() освобождает наблюдаемый struct eventpoll. Его встроенная hlist_head-голова списка ->refs расположена ровно там, куда указывает epi->fllink.pprev, поэтому последующий "*pprev = next" из hlist_del_rcu() вписывает данные в освобождённую память kmalloc-192. Кроме того, struct file помечен как SLAB_TYPESAFE_BY_RCU, поэтому слот памяти, в котором размещён @file, мог быть переиспользован функцией alloc_empty_file() — с повторной инициализацией f_lock и f_ep — в то время как ep_remove() номинально всё ещё находится внутри этой блокировки. Итог — управляемый атакующим вызов kmem_cache_free() для не того slab-кэша. Закрепите @file с помощью epi_fget() в начале ep_remove() и ограничьте критическую секцию условием успешного закрепления. Пока закрепление удерживается, счётчик ссылок @file не может достичь нуля, что не даёт __fput() выполниться и, как следствие, сохраняет наблюдаемый struct eventpoll в живых на протяжении hlist_del_rcu() и использования f_lock, устраняя обе UAF. Если закрепить не удалось, счётчик ссылок @file уже достиг нуля, и его __fput() находится в процессе выполнения. Поскольку мы вышли досрочно, не очистив f_ep, этот путь идёт по медленному пути eventpoll_release() в eventpoll_release_file() и блокируется на ep->mtx до тех пор, пока ep_clear_and_put() на стороне ожидающего не отпустит эту блокировку. Вклад вышедшего epi в ep->refcount остаётся нетронутым, поэтому завершающий ep_refcount_dec_and_test() в ep_clear_and_put() не может освободить eventpoll раньше времени, пока с ним работает eventpoll_release_file(); осиротевший epi затем очищается там же. Успешное закрепление также доказывает отсутствие гонки с eventpoll_release_file() за этот epi, поэтому ставшая избыточной повторная проверка epi->dying под f_lock убирается. Дешёвый быстрый выход без блокировок через READ_ONCE(epi->dying) сохраняется.
Ответственное использование
Используйте информацию об уязвимостях только в тех системах, которыми вы владеете или имеете право тестировать. Kitploit ссылается на метаданные общедоступных исследований и не хранит код эксплойта или вредоносные полезные данные.