CVE-2026-93224 in Linux
Zusammenfassung
von VulDB • 24.09.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
svcrdma: Behebung eines nicht abgeglichenen rn_unregister bei fehlgeschlagenem Accept (Accept-Handshake)
Wenn svc_rdma_accept() den errout-Pfad einschlägt, bevor rpcrdma_rn_register() erfolgreich war, ruft der vorhandene Cleanup-Block unconditionalrpcrdma_rn_unregister(dev, &newxprt->sc_rn) auf. Da svcxprt_rdma mit kzalloc allokiert wird, ist sc_rn.rn_index auf diesem Pfad 0 und sc_rn.rn_done ist NULL; das Unregister führt daher zu einem xa_erase() eines Slots 0 eines anderen Aufrufers und führt ein nicht abgeglichenes kref_put() für den rd_kref des rpcrdma_device aus.
Der gleiche errout-Pfad umschließt auch die Bereinigung mit svc_xprt_get()/svc_xprt_put() rund um die Initialisierungsreferenz (birth reference) von kref_init(). Der kref-Zähler geht 1 -> 2 -> 1 und erreicht niemals den Wert 0, sodass der svcxprt_rdma (und das damit verankerte net/ns_tracker) bei jedem fehlgeschlagenen Accept geleakt wird.
rpcrdma_rn_register() schreibt rn->rn_done als Letztes, erst nachdem sowohl xa_alloc() als auch kref_get() erfolgreich waren; daher ist rn_done == NULL ein natürliches „nie registriert"-Sentinel (Markierung). Schützen Sie rpcrdma_rn_unregister() mit einer frühen Rückgabe, wenn rn_done NULL ist, und setzen Sie rn_done vor dem entsprechenden xa_erase() zurück, damit auch ein wiederholtes Unregister eine No-Op-Funktion bleibt.
Mit dieser Schutzmaßnahme im errout-Pfad des Accepts wird die Initialisierungsreferenz (birth reference) von kref_init() über svc_xprt_put() abgebaut, was svc_rdma_free() aufruft. Der Abbau von sc_qp, sc_sq_cq, sc_rq_cq und sc_pd erfolgt unter den vorhandenen IS_ERR/NULL-Schutzmaßnahmen in svc_rdma_free(); sc_rn wird durch das neue rn_done-Sentinel abgedeckt; sc_cm_id ist auf jedem errout-Pfad nicht NULL, da svc_rdma_accept() es oberhalb des ersten goto errout dereferenziert.
svc_xprt_free() baut die mit dem freigegebenen Transport verbundene Modulreferenz ab, und svc_handle_xprt() baut seine vorab erlangte Referenz ab, wenn ->xpo_accept NULL zurückgibt. Nehmen Sie eine Ersatz-Modulreferenz vor svc_xprt_put() auf, damit die beiden module_put()-Aufrufe ausgeglichen bleiben.
Das rn_done-Sentinel deckt auch den Aufruf von rpcrdma_rn_unregister() durch svc_rdma_free(), der kein Listener ist, für Transports ab, deren Registrierungsversuch fehlgeschlagen ist oder nie durchgeführt wurde.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.