CVE-2026-93107 in Linux
Riassunto
di VulDB • 18/09/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
RDMA/rxe: Evitare il ri-elaborazione del pacchetto corrente dopo che QP entra nello stato di errore
Quando do_complete() rileva che QP si trova nello stato di errore, restituisce RESPST_CHK_RESOURCE. Prima dell'commit 49dc9c1f0c7e ("RDMA/rxe: Cleanup reset state handling in rxe_resp.c") questo era il ciclo di flush: check_resource() aveva un branch per lo stato di errore che recuperava ogni WQE recv rimanente e lo completava con IB_WC_WR_FLUSH_ERR, senza toccare il pacchetto corrente. Quel commit ha rimosso il branch per lo stato di errore da check_resource() (il draining è ora eseguito all'ingresso di rxe_receiver()) ma ha mantenuto la restituzione dello stato di errore in do_complete().
Di conseguenza, quando un QP passa allo stato di errore mentre un pacchetto viene completato - ad esempio una disconnessione rdma_cm che compete con l'elaborazione delle ricezioni - la macchina a stati del responder torna al ciclo di elaborazione della richiesta con il pacchetto già completato ancora in mano: check_resource() recupera un nuovo WQE recv, execute()/send_data_in() copia nuovamente lo stesso payload del pacchetto, do_complete() invia un altro CQE IB_WC_SUCCESS (qp->resp.status è ancora 0), e il controllo torna al controllo dello stato di errore. Il ciclo ri-esegue lo stesso pacchetto una volta per ogni WGE recv pubblicato (osservato: ~1000 completamenti duplicati IB_WC_SUCCESS di un singolo SEND, uno circa ogni ~8us, corrispondente all'occupazione RQ) finché la RQ non si esaurisce, dopodiché qp->resp.wqe è NULL e send_data_in() lo dereferenzia:
BUG: kernel NULL pointer dereference, address: 0000000000000014 Workqueue: rxe_wq do_work RIP: copy_data+0x29/0x1f0 Call Trace: send_data_in+0x25/0x50 rxe_receiver+0xf36/0x1dd0
I completamenti duplicati sono indistinguibili dalle ricezioni reali per l'ULP. Durante un test di stress su RDS, il messaggio è stato accettato come nuovo e ha consegnato lo stesso datagramma allo spazio utente centinaia di volte, corrompendo il flusso; qualsiasi ULP che si affida alla consegna esattamente una volta (exactly-once delivery) per RC è interessato.
Un pacchetto live che raggiunge il controllo dello stato di errore in do_complete() è stato eseguito e completato esattamente una volta e deve essere consumato, non ri-elaborato. Restituire RESPST_CLEANUP per esso (dequeue e free); continuare a restituire RESPST_CHK_RESOURCE nel caso pkt == NULL.
If you want to get best quality of vulnerability data, you may have to visit VulDB.