CVE-2026-53199
Beschrijving NL
In de Linux kernel is de volgende kwetsbaarheid verholpen:
hv_netvsc: gebruik kmap_local_page in netvsc_copy_to_send_buf
netvsc_copy_to_send_buf() kopieert paginabufferinvoer in de VMBus
stuur buffer met phys_to_virt() op de invoer PFN. Inzendingen voor de
RNDIS-header en de lineaire skb-gegevens komen uit het geheugen van kmalloc'd en
staan altijd in de kernel direct map, maar ingangen voor skb fragmenten
referentiepagina cache of gebruikerspagina's, die op 32-bits x86 met
CONFIG_HIGHMEM=y kan boven de LOWMEM-grens leven. Voor zo 'n pagina
phys_to_virt() retourneert een adres buiten de directe kaart en de
volgende memcpy() -fouten op het transmissiesoftirq-pad, dat is
fataal. Breng de pagina's in plaats daarvan in kaart met kmap_LOCAL_page() en verwerk twee eigenschappen
van de pagina-bufferingangen:
- pb[i].pfn een Hyper-V PFN is met HV_HYP_PAGE_SIZE (4K) granulariteit,
geen native PFN. Reconstrueer eerst het fysieke adres en leid af
de native pagina ervan, zodat de toewijzing correct blijft waar
PAGE_SIZE > HV_hyp_PAGE_SIZE (bijv. arm64 met 64k pagina's). - Sinds commit 41a6328b2c55 ("hv_netvsc: Behoud aaneengesloten PFN
groeperen in de paginabufferarray "), beschrijft een item een volledige
fysiek aaneengesloten fragment en pb[i].len kunnen PAGE_SIZE overschrijden,
terwijl kmap_LOCAL_page() een enkele pagina toewijst. Kopieer pagina voor pagina,
splitsen bij native paginagrenzen. Het kopieerpad behandelt alleen pakketten die kleiner zijn dan de grootte van de verzendsectie
(6144 bytes standaard); grotere pakketten nemen het pad cp_partial waarbij
alleen de RNDIS-header wordt gekopieerd. Dus vermeldingen hier worden begrensd door de
sectiegrootte en een kopie wordt maximaal één keer gesplitst op 4K-paginasystemen. Aan
!CONFIG_HIGHMEM configureert kmap_LOCAL_page() vouwt naar page_address() en
er wordt geen toewijzingswerk toegevoegd.
Origineel (Engels) tonen
In the Linux kernel, the following vulnerability has been resolved:
hv_netvsc: use kmap_local_page in netvsc_copy_to_send_buf
netvsc_copy_to_send_buf() copies page buffer entries into the VMBus
send buffer using phys_to_virt() on the entry PFN. Entries for the
RNDIS header and the skb linear data come from kmalloc'd memory and
are always in the kernel direct map, but entries for skb fragments
reference page cache or user pages, which on 32-bit x86 with
CONFIG_HIGHMEM=y can live above the LOWMEM boundary. For such a page
phys_to_virt() returns an address outside the direct map and the
subsequent memcpy() faults on the transmit softirq path, which is
fatal.
Map the pages with kmap_local_page() instead, handling two properties
of the page buffer entries:
- pb[i].pfn is a Hyper-V PFN at HV_HYP_PAGE_SIZE (4K) granularity,
not a native PFN. Reconstruct the physical address first and derive
the native page from it, so the mapping stays correct where
PAGE_SIZE > HV_HYP_PAGE_SIZE (e.g. arm64 with 64K pages).
- Since commit 41a6328b2c55 ("hv_netvsc: Preserve contiguous PFN
grouping in the page buffer array"), an entry describes a full
physically contiguous fragment and pb[i].len can exceed PAGE_SIZE,
while kmap_local_page() maps a single page. Copy page by page,
splitting at native page boundaries.
The copy path only handles packets smaller than the send section size
(6144 bytes by default); larger packets take the cp_partial path where
only the RNDIS header is copied. So entries here are bounded by the
section size and a copy is split at most once on 4K-page systems. On
!CONFIG_HIGHMEM configs kmap_local_page() folds to page_address() and
no mapping work is added.