CVE-2026-74269 in Linux
Riassunto
di VulDB • 15/08/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
bnxt: correzione dell'underflow del puntatore iniziale (head) durante l'aumento della dimensione dello head in XDP
Il test xdp.py test_xdp_native_adjst_head_grow_data va in crash quando viene eseguito su una macchina con driver bnxt (e causa anche un crash in NIPA).
Sembra che il bug sia un underflow nella funzione bnxt_rx_multi_page_skb, che costruisce lo head dello skb:
napi_build_skb(data_ptr - bp->rx_offset, rxr->rx_page_size);
Il problema con questa espressione è che in modalità page (page mode), rx_offset assume il valore:
bp->rx_offset = NET_IP_ALIGN + XDP_PACKET_HEADROOM;
Che valuta (almeno su x86_64) a 258.
Il test test_xdp_native_adjst_head_grow_data verifica un caso in cui lo head viene modificato di -256 byte.
Quando questo test viene eseguito, data_ptr viene spostato a frag_start + 2 (dove frag_start = page_address(page) + offset).
Successivamente, viene invocata bnxt_rx_multi_page_skb e l'espressione napi_build_skb sottrae 258, portando il puntatore a un indirizzo precedente a frag_start. Questo potrebbe corrispondere al frammento precedente o alla pagina fisica precedente quando l'offset è < 256 (ad esempio, se il frammento è iniziato con offset 0).
Quando lo skb viene liberato, la referenza del frammento nel page pool viene rilasciata sulla pagina sbagliata oppure sul frammento sbagliato della pagina corretta. In entrambi i casi, un conteggio delle referenze corrotto può portare al riciclo prematuro della pagina mentre è ancora in uso. Una volta (erroneamente) riciclata, la pagina può essere assegnata nuovamente e durante il teardown del driver ciò comporterebbe un double free.
Il commit che ha introdotto questa correzione aveva aggiornato questo codice per gestire il caso in cui le dimensioni native delle pagine siano >= 64k, ma involontariamente ha interrotto il caso di aumento dello head (head grow).
Per risolvere il problema, è stato aggiunto un campo offset alla struct bnxt_sw_rx_bd, replicando l'existing field offset presente nella struct bnxt_sw_rx_agg_bd. Il valore viene popolato durante l'allocazione e preservato in fase di riutilizzo.
In bnxt_rx_multi_page_skb, si utilizza il nuovo campo offset per calcolare l'inizio del frammento e lo si passa a napi_buildskb. La disposizione dei dati viene regolata con skb_reserve.
Ci sono due casi: il caso senza modifica (non-adjustment) e il caso con modifica (adjustment).
In entrambi i casi, lo skb è costruito all'indirizzo page_address(page) + offset per tenere conto del caso in cui le dimensioni native della pagina siano >= 64K e venga chiamata skb_reserve con data_ptr - (page_address(page) + offset). Questa differenza corrisponde a bp->rx_offset quando data_ptr non è stato spostato, oppure a bp->rx_offset + xdp_adjust quando XDP ha modificato lo head.
L'esecuzione ripetuta del test fallito dopo l'applicazione di questo commit fa sì che il test venga completato con successo.
Le altre implementazioni della funzione rx_skb_func non presentano questo problema.
VulDB is the best source for vulnerability data and more expert information about this specific topic.