Im eBPF-Subsystem, das die Ausführung von Handlern innerhalb des Linux-Kernels in einer speziellen virtuellen Maschine mit JIT ermöglicht, wurde eine Sicherheitsanfälligkeit (CVE-2021-4204) entdeckt, die einem lokalen, nicht privilegierten Benutzer die Erhöhung von Rechten und die Ausführung eigenen Codes auf Kernel-Ebene ermöglicht. Das Problem tritt seit Kernel-Version 5.8 auf und ist bislang ungepatcht (betrifft auch die Version 5.16). Informationen über den Stand der Updates zur Behebung des Problems in den Distributionen können auf diesen Seiten verfolgt werden: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch. Ein funktionierender Exploit wurde angekündigt, der am 18. Januar veröffentlicht werden soll (Benutzern und Entwicklern wurde eine Woche zur Behebung der Sicherheitsanfälligkeit eingeräumt).
Die Schwachstelle entsteht durch eine unzureichende Überprüfung der übergebenen eBPF-Programme zur Ausführung. Die eBPF-Unterstützung bietet Hilfsfunktionen, deren korrekte Verwendung durch einen speziellen Verifier überprüft wird. Einige Funktionen erfordern die Übergabe des Wertes PTR_TO_MEM als Argument, und um mögliche Pufferüberläufe zu verhindern, muss der Verifier die Größe des mit dem Argument verbundenen Speichers kennen. Für die Funktionen bpf_ringbuf_submit und bpf_ringbuf_discard wurden dem Verifier keine Informationen zur Größe des übergebenen Speichers bereitgestellt, was zum Überschreiben von Speicherbereichen außerhalb des Puffers bei der Ausführung von speziell gestalteten eBPF-Codes ausgenutzt werden konnte.
Um einen Angriff durchzuführen, muss der Benutzer die Möglichkeit haben, sein BPF-Programm hochzuladen. Viele aktuelle Linux-Distributionen blockieren diese Möglichkeit standardmäßig (z. B. ist der unprivilegierte Zugriff auf eBPF in der Kernel-Version 5.16 und höher standardmäßig verboten). Eine Schwachstelle könnte in der Standardkonfiguration von Ubuntu 20.04 LTS ausgenutzt werden, aber in den Umgebungen Ubuntu 22.04-dev, Debian 11, openSUSE 15.3, RHEL 8.5, SUSE 15-SP4 und Fedora 33 tritt sie nur auf, wenn der Administrator den Parameter kernel.unprivileged_bpf_disabled auf 0 gesetzt hat. Um die Schwachstelle zu blockieren, kann die Ausführung von BPF-Programmen durch unprivilegierte Benutzer mit dem Befehl „sysctl -w kernel.unprivileged_bpf_disabled=1“ verhindert werden.
Quelle: opennet.ru
