BPF-Code kann lokale Privilegienerweiterung ermöglichen (CVE-2021-29154)
Eine weitere Schwachstelle, die auf das BPF-Subsystem abzielt, wurde in den letzten Tagen öffentlich bekannt gemacht (CVE-2021-29154). Sie ermöglicht es Benutzern auf einem System mit einer nicht standardmäßigen Konfiguration des BPF-Subsystems, speziell gestalteten Code als BPF-Filter auszuführen und beliebigen ausführbaren Code im Kernelkontext auszuführen.
Nach Angaben der Hersteller sind alle Distributionen mit Kerneln bis zur Version 5.11.12 betroffen. Die Anbieter von Distributionen beginnen damit, Patches über ihre Update-Mechanismen bereitzustellen, und auch KernelCare arbeitet an Patches für seinen rebootlosen Patching-Prozess, um dieses Problem zu beheben.
Aufgrund der Natur der BPF-Funktionalität, die es dem Benutzercode ermöglicht, mit der Verarbeitung von Netzwerkpaketen innerhalb des Kernels zu interagieren, besteht bei jeder Schwäche in der Implementierung ein sehr großes Angriffspotenzial. Diese spezielle Funktionalität wurde vor kurzem durch den specter mitigation code bug, der hier diskutiert wird.
Um verwundbar zu sein, müsste ein System so konfiguriert sein, dass es die JIT-Kompilierung von BPF zulässt (z. B. durch die Einstellung "net.core.bpf_jit_enable = 1"). Dies ist häufig in Situationen der Fall, in denen reguläre Benutzer Arbeiten im Zusammenhang mit der Manipulation von Sockets durchführen oder in Seccomp-Umgebungen (Secure Computing Mode), in denen die Berechtigungen detaillierter als normal erteilt werden.
Der eigentliche anfällige Code befindet sich in arch/x86/net/bpf_jit_comp.c und arch/x86/net/bpf_jit_comp32.c im Kernel-Quellcodebaum. Der Fehler entsteht durch die Art und Weise, wie die Verzweigungsverschiebung bei der Kompilierung des Anwendercodes erfolgt, indem während der Optimierung falsche Annahmen bezüglich der Adresse des Codes getroffen werden.
Eine korrekte Ausnutzung dieser Schwachstelle könnte sogar zum Ausbruch von Containern oder Chroots führen, da der Kernel von diesen gemeinsam genutzt wird und die Ausführung von Code im Kernelkontext es ermöglicht, die Grenzen der Containerisierung zu umgehen.
Als Notlösung können Sie BPF JIT schnell deaktivieren, indem Sie das Programm ausführen:
# echo 0 > /proc/sys/net/core/bpf_jit_enable |
die solange bestehen bleibt, bis sie rückgängig gemacht oder das System neu gestartet wird. Eine dauerhaftere Beseitigung kann erreicht werden, indem Sie das entsprechende Dienstprogramm syscfg Ihrer Distribution verwenden, um "net.core.bpf_jit_enable=0" beim Booten zu setzen. Natürlich löst diese Art von Lösung das Problem, indem sie die Funktionalität deaktiviert, was an sich schon selbstzerstörerisch ist. Wenn Sie Ihr System tatsächlich für die Verwendung von BPF JIT konfiguriert hatten, musste diese Einstellung in Ihrem Anwendungsfall höchstwahrscheinlich explizit aktiviert werden, und Sie sollten sich stattdessen auf ein korrektes Kernel-Patching verlassen, entweder durch die Patches Ihres Distributionsanbieters oder durch den rebootlosen Prozess von KernelCare.