Odebrany

CVE-2026-98216

opublikowano:
modyfikacja:
Ocena CVSS
n/a
Brak oceny

>_ Opis

Tłumaczenie automatyczne – może zawierać nieścisłości.

W jądrze Linuksa usunięto następującą lukę:

IB/hfi1: Napraw mmap zwrotu kredytu PIO_CRED

Sprawa PIO_CRED funkcji hfi1_file_mmap() musi udostępniać użytkownikowi przestrzeń pojedynczą
strona zwrotu kredytu, która zawiera wpis tego kontekstu. Ta strona to
druga lub trzecia strona alokacji zwrotu kredytu na węzeł po
sprzętowy indeks kontekstu wysyłania osiąga 64 lub 128, więc poniższa awaria jest taka
przerywany: gdy wpis ląduje na pierwszej stronie, przesunięcie wynosi zero
i wszystko działa.

Dwie rzeczy są nie tak.

Po pierwsze, cr_page_offset jest przesunięciem bajtu, ale .va jest strukturą
credit_return *, więc dodanie go jest arytmetyką wskaźnikową i skaluje przesunięcie
według sizeof(struct credit_return) == 64. memvirt następnie ląduje 256 KiB lub
512 KiB powyżej alokacji 10240 bajtów. Z tłumaczeniem IOMMU, to
adres należy do zakresu vmalloc, ale nie należy do obszaru vm_area, więc
dma_mmap_coherent() -> iommu_dma_mmap() nie znajduje żadnych stron, vmalloc_to_pfn()
zwraca page_to_pfn(NULL), a remap_pfn_range() instaluje ramkę powyżej
MAXPHYADDR. Pierwszy użytkownik przeczytał następnie:

psm2_ep_open_pr: Uszkodzona tabela stron pod adresem 7a14d007e000
PGD 800000013886a067 P4D 800000013886a067 PUD 13886b067 PMD 13886c067
PTE 800049168e911235
Ups: Zła tabela stron: 000d [#1] SMP PTI

Po drugie, wciąż błędne po poprawieniu arytmetyki,
dma_mmap_coherent() opisuje cały spójny bufor i wybiera
stronę w nim za pomocą vma->vm_pgoff. Przesunięcie cpu_addr nie ma żadnego efektu:
dla alokacji vmap iommu_dma_mmap() używa cpu_addr tylko do zlokalizowania
vm_area, a następnie mapuje strony[vm_pgoff], które właśnie wykonała funkcja hfi1_file_mmap()
ustawiona na 0. Dlatego przestrzeń użytkownika zawsze otrzymuje pierwszy zwrot środków
stronie, każdy odczyt kredytu dotyczy niewłaściwego kontekstu i powoduje opóźnienia PIO
na zawsze.

Użyj interfejsu API DMA zgodnie z przeznaczeniem: przekaż podstawę alokacji wraz z jego
pełnej długości i wybierz stronę z vm_pgoff. Osobna długość to
potrzebne, ponieważ memlen musi na bieżąco opisywać VMA dla istniejącego rozmiaru
sprawdź. Ścieżka dma-direct również pozostaje poprawna, ponieważ dma_direct_mmap()
dodaje ten sam vm_pgoff do podstawowego pfn.

Testowane na Dell T7610 (Xeon E5-2650 v2, Intel IOMMU w trybie DMA-FQ)
przeciwko urządzeniu równorzędnemu Threadripper PRO 3995WX, oba Omni-Path 100. Wcześniej
zmień psm2_ep_open() Omija jądro; tylko z arytmetyką
poprawione psm2_ep_open() kończy się sukcesem, ale każdy transfer korzystający z wysyłania PIO
zawiesza się, PSM2_SDMA=2 (wysyłanie PIO wyłączone) kończy się normalnie podczas
PSM2_SDMA=0 (wyślij tylko PIO) zawiesza się za każdym razem. Dzięki tej zmianie wyślij PIO,
send DMA i domyślny tryb mieszany działają.

>_ Referencje

Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.

This product uses the NVD API but is not endorsed or certified by the NVD.

Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.

CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.

NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org