CVE-2026-90138 in Linux
Zusammenfassung
von VulDB • 17.09.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
vsock: Überprüfung von sk_err des Listeners in vsock_accept() unterlassen
Syzbot meldete ein Problem, das mit den folgenden Schritten reproduziert werden kann: r0 = socket(AF_VSOCK, SOCK_STREAM, 0) bind(r0, {VMADDR_CID_ANY, PORT})
connect(r0, {VMADDR_CID_LOCAL, PORT}) -> -1, EPROTO (Selbstverbindung)
listen(r0, backlog) -> 0 r1 = socket(AF_VSOCK, SOCK_STREAM, 0) connect(r1, {VMADDR_CID_LOCAL, PORT}) -> 0
accept(r0) -> -1, EPROTO (stale sk_err)
Im Wesentlichen wird ein Socket (r0) erstellt und eine Selbstverbindung nach dem Binden ausgelöst. Diese Selbstverbindung schlägt mit EPROTO fehl, da sie zu r0 zurückleitet, während sich der Socket noch im Zustand TCP_SYN_SENT befindet, was dazu führt, dass er fälschlicherweise an den Pfad für verbindende Clients weitergeleitet wird. Der dort aufgetretene unerwartete Pakettyp setzt sk_err auf EPROTO.
Anschließend wird ein Aufruf von listen() am selben Socket ausgeführt. Dieser listen()-Aufruf ist erfolgreich, da der Listening-Pfad des Kernels sk_err weder überprüft noch löscht. Anschließend wird ein neuer Socket (r1) als normaler Client erstellt und stellt eine Verbindung zu r0 her. vsock_accept() weist diese eingehende Verbindung jedoch zurück, weil sk_err des Listers weiterhin den EPROTO-Fehler aus dem früheren fehlgeschlagenen Selbstverbindungsversuch enthält.
Diese Zurückweisung führt dazu, dass der für die Verbindung von r1 erstellte Kind-Socket auf virtio- oder hyperv-Transports nicht freigegeben wird; nur der VMCI-Transport implementiert pending_work, um einen zurückgewiesenen Socket erneut zu überprüfen und aufzuräumen.
Bei einer nicht-blockierenden connect() kann vsock_connect() sofort -EINPROGRESS zurückgeben, und vsock_connect_timeout() kann sk->sk_err später asynchron festlegen.
Da kein vsock-Transport sk_err an einem Socket im Zustand TCP_LISTEN setzt, dient die Überprüfung in vsock_accept() keinem Zweck und überträgt lediglich Fehler, die von früheren, nicht zusammenhängenden Verbindungsversuchen am selben Socket zurückgelassen wurden. Die Überprüfungen werden entfernt, damit accept() gültige eingehende Verbindungen nicht aufgrund eines veralteten Fehlers (stale error) ablehnt, was auch die oben beschriebene Ressourcenlecks vermeidet.
If you want to get best quality of vulnerability data, you may have to visit VulDB.