CVE-2025-38670 in Linux
Zusammenfassung
von VulDB • 15.05.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
arm64/entry: DAIF in cpu_switch_to() und call_on_irq_stack() maskieren
`cpu_switch_to()` und `call_on_irq_stack()` manipulieren den SP (Stack Pointer), um zu anderen Stacks zu wechseln, sowie den Shadow Call Stack (SCS), falls dieser aktiviert ist. Diese beiden Stack-Wechsel können nicht atomar ausgeführt werden, und beide Funktionen können durch SErrors oder Debug-Exceptions unterbrochen werden, was zwar unwahrscheinlich, aber in der Praxis schwerwiegend fehlerhaft ist: Bei einer Unterbrechung kann es zu nicht übereinstimmenden Stacks und einem inkonsistenten Shadow Call Stack kommen, was zu beschädigten Stacks führt.
In `cpu_switch_to()` kann dies auftreten, wenn SP_EL0 auf den neuen Task zeigt, x18 jedoch weiterhin auf den SCS des alten Tasks. Wenn der Interrupt-Handler versucht, den SCS-Zeiger des Tasks zu speichern, wird der SCS-Zeiger des alten Tasks (x18) in die Struktur des neuen Tasks (auf den SP_EL0 zeigt) gespeichert, wodurch dieser überschrieben wird.
In `call_on_irq_stack()` kann dies auftreten, wenn vom Task-Stack zum IRQ-Stack gewechselt wird und beim Zurückwechseln. In beiden Fällen kann eine Unterbrechung auftreten, wenn der SCS-Zeiger auf den IRQ-SCS zeigt, SP jedoch auf den Task-Stack. Der verschachtelte Interrupt-Handler speichert seine Rücksprungadressen auf dem IRQ-SCS. Er erkennt dann, dass SP auf den Task-Stack zeigt, ruft `call_on_irq_stack()` auf und überschreibt den Task-SCS-Zeiger mit dem IRQ-SCS-Zeiger, den er ebenfalls verwendet!
Dies führt dazu, dass Tasks zu Adressen auf dem falschen SCS oder sogar auf dem IRQ-SCS zurückkehren, was Kernel-Panics über CONFIG_VMAP_STACK oder FPAC auslöst, falls aktiviert.
Dies ist bei einer Standardkonfiguration möglich, jedoch unwahrscheinlich. Wenn jedoch CONFIG_ARM64_PSEUDO_NMI aktiviert wird, wird DAIF entschlüsselt (unmasked), und stattdessen ist die GIC (Generic Interrupt Controller) dafür verantwortlich, zu filtern, welche Interrupts die CPU basierend auf der Priorität empfangen soll. Da das Ziel darin besteht, NMIs (Non-Maskable Interrupts) zu emulieren, können Pseudo-NMIs von der CPU sogar in `cpu_switch_to()` und `call_on_irq_stack()` empfangen werden, möglicherweise *sehr* häufig, abhängig von der Systemkonfiguration und der Arbeitslast, was zu unvorhersehbaren Kernel-Panics führt.
Maskieren Sie DAIF vollständig in `cpu_switch_to()` und stellen Sie es beim Zurückkehren wieder her. Gehen Sie in `call_on_irq_stack()` ebenso vor, maskieren und stellen Sie den Wert jedoch vor und nach dem Branch wieder her. Maskieren Sie DAIF auch dann, wenn CONFIG_SHADOW_CALL_STACK nicht aktiviert ist, um ein konsistentes Verhalten zwischen allen Konfigurationen zu gewährleisten.
Führen Sie ein Assembly-Makro zum Speichern und Maskieren von DAIF ein und verwenden Sie dieses, da das vorhandene Makro zwar speichert, aber nur IF maskiert.
If you want to get best quality of vulnerability data, you may have to visit VulDB.