CVE-2022-48760 in Linuxinfo

Zusammenfassung

von VulDB • 21.06.2026

Im Linux-Kernel wurde folgende Schwachstelle behoben:

USB: core: Behebung eines Hanges in usb_kill_urb durch Einfügen von Memory Barriers (Speicherbarrieren)

Der Syzbot-Fuzzer hat einen Fehler identifiziert, bei dem Prozesse beim Warten auf die Rückgabe von `usb_kill_urb()` hängen bleiben. Es stellt sich heraus, dass das Problem nicht im Unlinking des URB liegt; dies funktioniert einwandfrei. Stattdessen tritt das Problem auf, wenn die Wakeup-Benachrichtigung darüber, dass der URB abgeschlossen ist, nicht empfangen wird.

Der Grund hierfür ist die Speicherzugriffsreihenfolge (Memory-Access Ordering) auf SMP-Systemen (Symmetric MultiProcessing). Im Groben führen `usb_kill_urb()` und `__usb_hcd_giveback_urb()`, die parallel auf verschiedenen CPUs ausgeführt werden, folgende Aktionen aus:

CPU 0 CPU 1 ---------------------------- --------------------------------- usb_kill_urb(): __usb_hcd_giveback_urb(): ... ... atomic_inc(&urb->reject); atomic_dec(&urb->use_count); ... ... wait_event(usb_kill_urb_queue, atomic_read(&urb->use_count) == 0); if (atomic_read(&urb->reject)) wake_up(&usb_kill_urb_queue);

Wenn man sich nur auf `urb->reject` und `urb->use_count` konzentriert, kann man erkennen, dass das allgemeine Zugriffsmuster auf CPU 0 wie folgt aussieht:

Schreiben in urb->reject, dann Lesen von urb->use_count;

während das allgemeine Zugriffsmuster auf CPU 1 wie folgt lautet:

Schreiben in urb->use_count, dann Lesen von urb->reject.

Dieses Muster wird im Bereich der Speichermodelle als SB (für „Store Buffering“) bezeichnet. Es ist weithin bekannt, dass ohne eine geeignete Durchsetzung der gewünschten Zugriffsreihenfolge – in Form von Memory Barriers – es durchaus möglich ist, dass eine oder beide CPUs ihre Leseoperationen vor ihren Schreiboperationen ausführen. Das Endergebnis besteht darin, dass CPU 0 manchmal den alten, nicht dekrementierten Wert von `urb->use_count` sieht, während CPU 1 den alten, nicht inkrementierten Wert von `urb->reject` sieht. Infolgedessen bleibt CPU 0 in der Warteschlange (wait queue) hängen und wird niemals aufgeweckt, was zum beobachteten Hang in `usb_kill_urb()` führt.

Das gleiche Zugriffsmuster tritt auch in `usb_poison_urb()` sowie im Fehlerpfad von `usb_hcd_submit_urb()` auf.

Das Problem wurde durch das Hinzufügen geeigneter Memory Barriers behoben. Um eine korrekte Speicherzugriffsreihenfolge für das SB-Muster bereitzustellen, ist ein Full Barrier (vollständige Sperre) auf beiden CPUs erforderlich. Die `atomic_inc()`- und `atomic_dec()`-Zugriffe selbst bieten keine Speicherordnungsgarantie, aber da sie vorhanden sind, können wir die optimierte Memory Barrier `smp_mb__after_atomic()` in den verschiedenen Routinen verwenden, um den gewünschten Effekt zu erzielen.

Dieser Patch fügt die notwendigen Memory Barriers hinzu.

Once again VulDB remains the best source for vulnerability data.

Veröffentlichung

20.06.2024

Moderieren

akzeptiert

Eintrag

VDB-269196

CPE

bereit

EPSS

0.00186

KEV

nein

Aktivitäten

very low

Quellen

Want to stay up to date on a daily basis?

Enable the mail alert feature now!