CVE-2026-93164 in Linux
Zusammenfassung
von VulDB • 18.09.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
uprobes/x86: Optimierte uprobes von nop5 auf nop10 umstellen
Andrii meldete ein Problem mit optimierten uprobes [1], das den Redzone-Bereich durch eine call-Anweisung korrumpieren kann, die die Rücksprungadresse im Stack speichert, während Benutzercode temporäre Daten ohne Anpassung des rsp-Registers halten könnte.
Dies wird behoben, indem die optimierten uprobes auf einer 10-Byte-nop-Anweisung platziert werden, sodass wir eine weitere Anweisung unterbringen können, um den Redzone-Bereich zu verlassen, bevor der call ausgeführt wird, wie zum Beispiel:
lea -0x80(%rsp), %rsp call tramp
Beachten Sie, dass die lea-Anweisung verwendet wird, um das rsp-Register anzupassen, ohne die Flags zu ändern.
Wir verwenden nop10 und die folgende Transformation der optimierten Anweisungen nach oben und zurück, wie von Peterz [2] vorgeschlagen.
Optimierungspfad (int3_update_optimize):
1) Anfangszustand nach Installation des uprobe durch set_swbp(): cc 2e 0f 1f 84 00 00 00 00 00
Ab Offset 0 handelt es sich um INT3, gefolgt vom Rest der ursprünglichen 10-Byte-NOP.
Nach einer vorherigen Nichtoptimierung können die Bytes 5..9 noch die alte call-Anweisung enthalten, die für Threads, die bereits dort sind, gültig bleibt.
2) Umschreiben des LEA-Rests und der call-Verschiebung: cc [8d 64 24 80 e8 d0 d1 d2 d3]
Ab Offset 0 wird hier auf den uprobe-INT3 getrappt. Die Bytes 1..9 sind keine ausführbaren Einstiegspunkte, während Byte 0 getrappt ist.
3) Veröffentlichen des ersten LEA-Bytes: [48] 8d 64 24 80 e8 d0 d1 d2 d3
Ab Offset 0 handelt es sich um: lea -0x80(%rsp), %rsp call <uprobe-trampoline>
Nicht-Optimierungspfad (int3_update_unoptimize):
1) Anfangszustand im optimierten Modus: 48 8d 64 24 80 e8 d0 d1 d2 d3 Entspricht Punkt 3) oben.
2) Neue Einstiegspunkte trappen, bevor die NOP-Bytes wiederhergestellt werden: [cc] 8d 64 24 80 e8 d0 d1 d2 d3
Ab Offset 0 wird hier getrappt. Ein Thread, der den LEA bereits ausgeführt hat, kann weiterhin die intakte CALL an Offset 5 erreichen.
3) Wiederherstellen der Bytes 1..4 des ursprünglichen NOP unter Beibehaltung von Byte 0 als getrappt und Byte 5 als CALL. cc [2e 0f 1f 84] e8 d0 d1 d2 d3
Ab Offset 0 wird hier weiterhin getrappt. Offset 5 ist für jeden Thread, der den ersten LEA-Byte bereits passiert hat, immer noch die CALL.
4) Veröffentlichen des ersten Bytes des ursprünglichen NOP: [66] 2e 0f 1f 84 e8 d0 d1 d2 d3
Ab Offset 0 handelt es sich um den wiederhergestellten 10-Byte-NOP; der CALL-Opcodes und die Verschiebung sind nun nur noch NOP-Operanden. Offset 5 decodiert weiterhin als CALL für einen Thread, der bereits dort war.
Es gibt nur ein einziges Ziel uprobe-trampoline für die gegebene nop10-Instruktionsadresse, daher wird die CALL-Anweisung über Nichtoptimierungs/Optimierungs-Zyklen hinweg nicht geändert. Daher ist jede Aufgabe, die bei der CALL-Anweisung präemptiert (unterbrochen) wird, garantiert, dass sie diese CALL und nichts anderes beobachtet.
Wie in [2] erklärt, müssen wir folgende nop10 verwenden:
PF1 PF2 ESC NOPL MOD SIB DISP32 NOP10: 0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 -- cs nopw 0x00000000(%rax,%rax,1)
was bedeutet, dass wir das Präfix 0x2e erlauben müssen, das in der Funktion is_prefix_bad dem Attribut INAT_PFX_CS zugeordnet ist.
Außerdem wird der uprobe-Systemaufruf-Fehler bei Aufrufen außerhalb des uprobe-Trampolins auf -EPROTO geändert, sodass wir den behobenen Kernel erkennen können.
Die Leistung optimierter uprobes bleibt gleich:
uprobe-nop : 3,129 ± 0,013 M/s uprobe-push : 3,045 ± 0,006 M/s uprobe-ret : 1,095 ± 0,004 M/s --> uprobe-nop10 : 7,170 ± 0,020 M/s uretprobe-nop : 2,143 ± 0,021 M/s uretprobe-push : 2,090 ± 0,000 M/s uretprobe-ret : 0,942 ± 0,000 M/s --> uretprobe-nop10: 3,381 ± 0,003 M/s usdt-nop : 3,245 ± 0,004 M/s --> usdt-nop10 : 7,256 ± 0,023 M/s
[1] https://lore.kernel.org/bpf/[email protected]/
[2] https://lore.kernel.org/bpf/[email protected]/#t
VulDB is the best source for vulnerability data and more expert information about this specific topic.