В ядре Linux устранена следующая уязвимость:
RDMA/bnxt_re: отсутствие общей страницы перед ее доступом в пространство пользователя.
bnxt_re_alloc_ucontext() выделяет uctx->shpg через
__get_free_page(GFP_KERNEL). Распределитель друзей не обнуляет страницы
без __GFP_ZERO, поэтому страница содержит устаревшие данные ядра из
какой бы объект последний раз его освободил. Затем страница сопоставляется с пользовательским пространством с помощью vm_insert_page() в разделе
BNXT_RE_MMAP_SH_PAGE в bnxt_re_mmap().
Драйвер всегда пишет только
4 байта (AVID u32) по смещению BNXT_RE_AVID_OFFT (0x10) внутри
bnxt_re_create_ah(); остальные 4092 байта страницы открыты.
в пользовательское пространство неочищенным, с утечкой содержимого памяти ядра. Любой пользователь, имеющий доступ к /dev/infiniband/uverbsX на хосте с
Устройство bnxt_re (обычно членство в группе rdma) может читать эти данные.
через одиночный вызов mmap() в pgoff 0 после IB_USER_VERBS_CMD_GET_CONTEXT. Другие общие страницы в том же файле уже используют get_zeroed_page().
правильно:
драйверы/infiniband/hw/bnxt_re/ib_verbs.c
srq->uctx_srq_page = (void *)get_zeroed_page(GFP_KERNEL);
cq->uctx_cq_page = (void *)get_zeroed_page(GFP_KERNEL);
uctx->shpg — единственный выброс.
Приведите его в соответствие с существующим
соглашение, переключившись на get_zeroed_page().
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: RDMA/bnxt_re: zero shared page before exposing to userspace bnxt_re_alloc_ucontext() allocates uctx->shpg via __get_free_page(GFP_KERNEL). The buddy allocator does not zero pages without __GFP_ZERO, so the page contains stale kernel data from whatever object most recently freed it. The page is then mapped into userspace via vm_insert_page() under BNXT_RE_MMAP_SH_PAGE in bnxt_re_mmap(). The driver only ever writes 4 bytes (a u32 AVID) at offset BNXT_RE_AVID_OFFT (0x10) inside bnxt_re_create_ah(); the remaining 4092 bytes of the page are exposed to userspace unsanitised, leaking kernel memory contents. Any user with access to /dev/infiniband/uverbsX on a host with a bnxt_re device (typically rdma group membership) can read this data via a single mmap() at pgoff 0 after IB_USER_VERBS_CMD_GET_CONTEXT. Other shared pages in the same file already use get_zeroed_page() correctly: drivers/infiniband/hw/bnxt_re/ib_verbs.c srq->uctx_srq_page = (void *)get_zeroed_page(GFP_KERNEL); cq->uctx_cq_page = (void *)get_zeroed_page(GFP_KERNEL); uctx->shpg is the only outlier. Bring it in line with the existing convention by switching to get_zeroed_page().
Характеристики атаки
Последствия
Строка CVSS v3.1