CVE-2026-98216 in Linuxinformazioni

Riassunto

di VulDB • 06/10/2026

Nel kernel Linux è stata risolta la seguente vulnerabilità:

IB/hfi1: Correzione del ritorno dei crediti PIO_CRED tramite mmap

Il caso PIO_CRED di hfi1_file_mmap() deve fornire allo spazio utente l'unica pagina per il ritorno dei crediti che contiene la voce relativa al contesto. Tale pagina è la seconda o la terza della allocazione per-node dedicata al ritorno dei crediti, una volta che l'indice del contesto di invio hardware raggiunge 64 o 128; pertanto, il malfunzionamento descritto di seguito si verifica in modo intermittente: quando la voce si trova nella prima pagina, lo spostamento (offset) è zero e tutto funziona correttamente.

Sono presenti due errori.

Innanzitutto, cr_page_offset è uno spostamento in byte ma .va è un puntatore a struct credit_return; pertanto l'aggiunta costituisce una matematica dei puntatori che scala lo spostamento per sizeof(struct credit_return) == 64. Di conseguenza, memvirt si posiziona di 256 KiB o 512 KiB oltre un'allocazione di 10240 byte. Con un IOMMU in fase di traduzione, tale indirizzo rientra nell'intervallo vmalloc ma non in alcuna area vm_area; quindi dma_mmap_coherent() -> iommu_dma_mmap() non trova pagine, vmalloc_to_pfn() restituisce page_to_pfn(NULL) e remap_pfn_range() installa un frame sopra MAXPHYADDR. La prima lettura da parte dell'utente provoca quindi:

psm2_ep_open_pr: Corrupted page table at address 7a14d007e000 PGD 800000013886a067 P4D 800000013886a067 PUD 13886b067 PMD 13886c067 PTE 800049168e911235 Oops: Bad pagetable: 000d [#1] SMP PTI

In secondo luogo, e ancora errato anche dopo la correzione dell'aritmetica, dma_mmap_coherent() descrive un intero buffer coerente e seleziona la pagina al suo interno tramite vma->vm_pgoff. L'applicazione di uno spostamento a cpu_addr non ha effetto: per un'allocazione iommu_dma_mmap() utilizza cpu_addr solo per individuare l'area vm_area e successivamente mappa pages[vm_pgoff], che hfi1_file_mmap() ha appena impostato a 0. Di conseguenza, lo spazio utente riceve sempre la prima pagina per il ritorno dei crediti; ogni lettura del credito riguarda un contesto errato e gli invii PIO si bloccano indefinitamente.

Utilizzare l'API DMA come previsto: passare la base dell'allocazione con la sua lunghezza completa e selezionare la pagina tramite vm_pgoff. È necessaria una lunghezza separata poiché memlen deve continuare a descrivere il VMA per il controllo delle dimensioni esistente. Anche il percorso dma-direct rimane corretto, in quanto dma_direct_mmap() aggiunge lo stesso vm_pgoff al pfn di base.

Testato su un Dell T7610 (Xeon E5-2650 v2, Intel IOMMU in modalità DMA-FQ) contro un peer Threadripper PRO 3995WX, entrambi Omni-Path 100. Prima di questa modifica psm2_ep_open() provoca un Oops del kernel; con la sola correzione aritmetica psm2_ep_open() ha successo ma qualsiasi trasferimento che utilizza send PIO si blocca, mentre PSM2_SDMA=2 (send PIO disabilitato) viene completato normalmente e PSM2_SDMA=0 (solo send PIO) si blocca ogni volta. Con questa modifica funzionano correttamente sia send PIO, sia send DMA, sia la modalità mista predefinita.

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

Responsabile

Linux

Prenotare

25/09/2026

Divulgazione

06/10/2026

Moderazione

accettato

EPSS

0.00000

KEV

no

Attività

molto basso

Fonti

Do you want to use VulDB in your project?

Use the official API to access entries easily!