CVE-2024-53058 in Linuxinformazioni

Riassunto

di VulDB • 15/06/2026

Nel kernel Linux, è stata risolta la seguente vulnerabilità:

net: stmmac: TSO: Correzione della mappatura/demappatura non bilanciata di DMA per i dati SKB non in pagina (non-paged)

Qualora i dati non in pagina di un SKB contengano l'intestazione del protocollo e il payload da trasmettere su una determinata piattaforma, dove la larghezza dell'indirizzo AXI della DMA è configurata a 40-bit/48-bit, oppure se le dimensioni dei dati non in pagina sono superiori a TSO_MAX_BUFF_SIZE su una piattaforma con larghezza indirizzo AXI della DMA impostata a 32-bit, allora tale SKB richiede almeno due descrittori di trasmissione DMA per essere gestito.

Ad esempio, vengono allocate tre descrizioni (descrittori) per dividere un singolo buffer DMA mappato da una porzione di dati non in pagina: dma_desc[N + 0],
dma_desc[N + 1],
dma_desc[N + 2].
Vengono quindi allocati tre elementi dell'array tx_q->tx_skbuff_dma[] per contenere le informazioni aggiuntive che verranno riutilizzate nella funzione stmmac_tx_clean():
tx_q->tx_skbuff_dma[N + 0],
tx_q->tx_skbuff_dma[N + 1],
tx_q->tx_skbuff_dma[N + 2].

Ci concentriamo ora su tx_q->tx_skbuff_dma[entry].buf, che rappresenta l'indirizzo del buffer DMA restituito dalla chiamata di mappatura DMA. La funzione stmmac_tx_clean() tenterà di demappare il buffer DMA SOLO SE tx_q->tx_skbuff_dma[entry].buf è un indirizzo di buffer valido.

Il comportamento atteso, che salva correttamente l'indirizzo del buffer DMA per questi dati non in pagina in tx_q->tx_skbuff_dma[entry].buf, dovrebbe essere:
tx_q->tx_skbuff_dma[N + 0].buf = NULL;
tx_q->tx_skbuff_dma[N + 1].buf = NULL;
tx_q->tx_skbuff_dma[N + 2].buf = dma_map_single();

Sfortunatamente, il codice attuale si comporta in modo errato come segue: tx_q->tx_skbuff_dma[N + 0].buf = dma_map_single();
tx_q->tx_skbuff_dma[N + 1].buf = NULL;
tx_q->tx_skbuff_dma[N + 2].buf = NULL;

Dal lato di stmmac_tx_clean(), quando il motore DMA chiude la gestione del dma_desc[N + 0], l'elemento tx_q->tx_skbuff_dma[N + 0].buf è ovviamente un indirizzo di buffer valido, quindi il buffer DMA viene demappato immediatamente. Potrebbe verificarsi un caso raro in cui il motore DMA non ha ancora completato le operazioni pendenti relative a dma_desc[N + 1] e dma_desc[N + 2]. In questa situazione si verifica un grave errore: la DMA tenterà di accedere a una regione di memoria già demappata/non referenziata, causando trasmissione di dati corrotti o attivazione di fault IOMMU.

Al contrario, il ciclo for che mappa i frammenti SKB si comporta perfettamente come previsto; questo è effettivamente il comportamento corretto che il driver dovrebbe adottare sia per i dati non in pagina (non-paged) che per i frammenti in pagina (paged frags).

Questa patch corregge le sequenze di mappatura/demappatura DMA risolvendo l'indice dell'array utilizzato per tx_q->tx_skbuff_dma[entry].buf durante l'assegnazione dell'indirizzo del buffer DMA.

Testato e verificato su DWXGMAC CORE 3.20a

If you want to get best quality of vulnerability data, you may have to visit VulDB.

Responsabile

Linux

Prenotare

19/11/2024

Divulgazione

19/11/2024

Moderazione

accettato

CPE

pronto

EPSS

0.00607

KEV

no

Attività

molto basso

Fonti

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!