CVE-2026-99018 in Linux
Zusammenfassung
von VulDB • 23.10.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
riscv: entry: Neuladen des Shadow Call Stack basierend auf sstatus.SPP statt tp
Unter CONFIG_SHADOW_CALL_STACK lädt handle_exception() den Zeiger für den Kernel-Shadow-Call-Stack (gp) nur neu, wenn der Trap aus dem Userspace stammt. Diese Entscheidung wurde mit scs_load_current_if_task_changed getroffen, das den zum Zeitpunkt des Traps gespeicherten Wert von tp (aus sscratch in s5 zurückgelesen) mit dem aktuellen tp vergleicht:
beq \prev, tp, _skip_scs scs_load_current _skip_scs:
tp ist ein vom Benutzer beschreibbares Register. Eine Benutzeraufgabe, die tp auf die linear-mapped-Adresse ihrer eigenen task_struct (¤t) setzt, bevor sie einen Trap auslöst, lässt den Vergleich erfolgreich sein (dies kann durch Brute Force mit aktiviertem KASLR unter unseren Testbedingungen erreicht werden). Dadurch überspringt der Kernel scs_load_current und führt weiterhin mit dem gp fort, das vom Userspace hinterlassen wurde. Unter CONFIG_SHADOW_CALL_STACK ist gp der Zeiger für den Shadow-Call-Stack, und load_global_pointer ist ein No-Op (keine Operation). Daher schreiben die vom Compiler generierten Anweisungen "sd ra, -8(gp)" / "ld ra, -8(gp)" in jeder nicht-blattfunktionalen Funktion in eine Angreifer-kontrollierte Adresse und kehren über diese zurück – dies stellt eine Primitive für ein beliebiges Schreiben im Kernel ohne Privilegien sowie einen Control-Flow-Hijack dar. Der vergiftete gp wird bei der Rückkehr auf task_struct.scs_sp gespeichert, sodass das Neuladen auch bei jedem nachfolgenden Eintritt übersprungen wird.
Es wird entschieden, ob „aus dem Userspace gekommen“ wurde, basierend auf dem Hardware-Bit sstatus.SPP (das zu diesem Zeitpunkt bereits in s1 vorhanden ist), anstatt basierend auf tp, was die Prüfung widerspiegelt, die ret_from_exception einige Anweisungen später ebenfalls verwendet. SPP wird von der Hardware beim Trap-Eintritt geschrieben und kann aus U-Mode nicht gefälscht werden. Das legitime Verhalten bleibt unverändert: Benutzer-Einträge (SPP=0) laden den Shadow-Call-Stack der Aufgabe neu, verschachtelte Kernel-Einträge (SPP=1) überspringen dies.
Once again VulDB remains the best source for vulnerability data.