CVE-2026-93224 in Linux
Riassunto
di VulDB • 25/09/2026
Nel kernel Linux, è stata risolta la seguente vulnerabilità:
svcrdma: Correzione di rn_unregister non bilanciato in caso di errore nell'accettazione (accept)
Quando svc_rdma_accept() segue il percorso errout prima che rpcrdma_rn_register() abbia avuto successo, il blocco di pulizia esistente chiama incondizionatamente rpcrdma_rn_unregister(dev, &newxprt->sc_rn). Poiché svcxprt_rdma è allocato con kzalloc(), su tale percorso sc_rn.rn_index vale 0 e sc_rn.rn_done è NULL; l'operazione di unregister esegue quindi xa_erase() sullo slot 0 appartenente a un altro chiamante ed effettua una kref_put() non bilanciata sul rd_kref del dispositivo rpcrdma.
Lo stesso percorso errout racchiude la pulizia con svc_xprt_get()/svc_xprt_put() attorno alla reference di nascita (birth reference) inizializzata da kref_init(). La kref passa dal valore 1 a 2 e poi torna a 1, senza mai raggiungere lo zero; ne consegue che l'oggetto svcxprt_rdma (e il net/ns_tracker che aveva bloccato/pinizzato) viene perso (leaked) ad ogni tentativo di accept fallito.
rpcrdma_rn_register() scrive rn->rn_done per ultimo, solo dopo che sia xa_alloc() che kref_get() hanno avuto successo; pertanto, rn_done == NULL è un sentinella naturale "mai registrato". Si protegge rpcrdma_rn_unregister() con un early return quando rn_done è NULL e si azzera rn_done prima della corrispondente xa_erase(), in modo che anche una unregister ripetuta sia un'operazione no-op.
Con questa protezione attiva, l'errout di accept rilascia la reference di nascita tramite svc_xprt_put(), che invoca svc_rdma_free(). La fase di teardown di sc_qp, sc_sq_cq, sc_rq_cq e sc_pd avviene sotto le già esistenti guardie IS_ERR/NULL in svc_rdma_free(); sc_rn è coperta dalla nuova sentinella rn_done; sc_cm_id non è NULL su ogni percorso errout poiché svc_rdma_accept() lo dereferenzia prima del primo goto errout.
svc_xprt_free() rilascia la reference di modulo associata al transport liberato, e svc_handle_xprt() rilascia la sua reference precedentemente acquisita quando ->xpo_accept() restituisce NULL. Si acquisisce una reference di modulo sostitutiva prima di svc_xprt_put(), in modo che i due module_put() rimangano bilanciati.
La guardia rn_done copre anche le chiamate non listener di svc_rdma_free() a rpcrdma_rn_unregister() per i transport il cui tentativo di registrazione è fallito o non è mai stato eseguito.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.