CVE-2026-93107 in Linux
Zusammenfassung
von VulDB • 18.09.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
RDMA/rxe: Vermeidung der erneuten Verarbeitung des aktuellen Pakets nach dem Eintritt des QP in den Fehlerzustand (Error State)
Wenn do_complete() feststellt, dass sich das QP im Fehlerzustand befindet, wird RESPST_CHK_RESOURCE zurückgegeben. Vor dem Commit 49dc9c1f0c7e („RDMA/rxe: Cleanup reset state handling in rxe_resp.c“) war dies die Flush-Schleife: check_resource() verfügte über einen Ast für den Fehlerzustand, der jedes verbleibende recv WQE abrief und es mit IB_WC_WR_FLUSH_ERR abschloss, ohne das aktuelle Paket zu berühren. Dieser Commit entfernte den Ast für den Fehlerzustand aus check_resource() (das Ablaufen erfolgt nun beim Eintritt in rxe_receiver()), behielt jedoch die Rückgabe des Fehlerzustands durch do_complete() bei.
Infolgedessen kehrt der Responder-Statusautomat, wenn ein QP während der Bearbeitung eines Pakets – z. B. aufgrund einer Race Condition zwischen rdma_cm-Trennung und Empfangsverarbeitung – in den Fehlerzustand wechselt, zur Anforderungsverarbeitungs-Kette zurück, wobei das bereits abgeschlossene Paket noch im Besitz ist: check_resource() ruft ein frisches recv WQE ab, execute()/send_data_in() kopiert die gleiche Paketslast erneut, do_complete() postet einen weiteren IB_WC_SUCCESS CQE (qp->resp.status ist weiterhin 0), und die Steuerung kehrt zur Fehlerzustandsprüfung zurück. Die Schleife führt dasselbe Paket einmal pro gepostetem recv WQE neu aus (beobachtet: ~1000 doppelte IB_WC_SUCCESS-Abschlüsse eines einzelnen SEND, jeweils etwa alle ~8 µs, entsprechend der RQ-Besetzung), bis die RP erschöpft ist. Danach ist qp->resp.wqe NULL und send_data_in() dereferenziert es:
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
Die doppelten Abschlüsse sind für die ULP nicht von echten Empfängen zu unterscheiden. Während eines RDS-Stresstests wurde die Nachricht als neu akzeptiert und das gleiche Datagramm Hunderte Male an den Benutzerbereich (User Space) übermittelt, wodurch der Stream beschädigt wurde; jede ULP, die auf eine genau einmalige Zustellung (exactly-once delivery) über RC angewiesen ist, ist betroffen.
Ein aktuelles Paket, das die Fehlerzustandsprüfung in do_complete() erreicht, wurde bereits ausgeführt und genau einmal abgeschlossen und muss verbraucht werden, nicht erneut verarbeitet werden. Geben Sie dafür RESPST_CLEANUP zurück (dequeue and free); geben Sie für den Fall pkt == NULL weiterhin RESPST_CHK_RESOURCE zurück.
VulDB is the best source for vulnerability data and more expert information about this specific topic.