В ядре Linux устранена следующая уязвимость:
RDMA/rxe: исправление UAF ответчика на IB_QP_MAX_DEST_RD_ATOMIC Modify_qp.
rxe_qp_from_attr() обрабатывает IB_QP_MAX_DEST_RD_ATOMIC вне
Путь IB_QP_STATE, поэтому он не содержит state_lock и работает, пока ответчик
задача rxe_receiver() (recv_task на rxe_wq) активна. Параметр «modify_qp()»
только этот атрибут вызывает free_rd_atomic_resources(), затем
alloc_rd_atomic_resources(), меняя местами qp->resp.resources[] в то время как
rxe_prepare_res()/find_resource() пройти его; free_rd_atomic_resources()
также оставляет висящим кэшированный указатель qp->resp.res. Местный
непривилегированный пользователь может использовать free/realloc для использования после освобождения в
rxe_receiver() (локальный DoS).
Очистите Recv_task вокруг свопа с помощью rxe_disable_task()/rxe_enable_task(),
как это уже делает rxe_qp_reset() при разрыве этого массива, повторно включив
только после того, как alloc_rd_atomic_resources() завершится успешно, поэтому ответчик никогда
возобновляется с NULL qp->resp.resources на пути ENOMEM. Также ясно
qp->resp.res в free_rd_atomic_resources(), например rxe_resp.c
пути завершения. Воспроизводится под KASAN; slab-use-after-free в rxe_receiver() исчез.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: RDMA/rxe: Fix responder UAF on IB_QP_MAX_DEST_RD_ATOMIC modify_qp rxe_qp_from_attr() handles IB_QP_MAX_DEST_RD_ATOMIC outside the IB_QP_STATE path, so it holds no state_lock and runs while the responder task rxe_receiver() (recv_task on rxe_wq) is live. A modify_qp() setting only that attribute calls free_rd_atomic_resources() then alloc_rd_atomic_resources(), swapping qp->resp.resources[] while rxe_prepare_res()/find_resource() walk it; free_rd_atomic_resources() also leaves the cached pointer qp->resp.res dangling. A local unprivileged user can race the free/realloc into a use-after-free in rxe_receiver() (local DoS). Drain recv_task around the swap with rxe_disable_task()/rxe_enable_task(), as rxe_qp_reset() already does when tearing this array down, re-enabling only after alloc_rd_atomic_resources() succeeds so the responder never resumes against a NULL qp->resp.resources on the ENOMEM path. Also clear qp->resp.res in free_rd_atomic_resources(), like the rxe_resp.c completion paths. Reproduced under KASAN; the slab-use-after-free in rxe_receiver() is gone.