Im Linux-Kernel wurde eine Schwachstelle (CVE-2021-3609) entdeckt, die es einem lokalen Benutzer ermöglicht, seine Systemrechte zu erhöhen. Das Problem wird durch einen Zeitkonflikt in der Implementierung des CAN BCM-Protokolls verursacht und tritt in den Linux-Kernel-Versionen von 2.6.25 bis 5.13-rc6 auf. In den Distributionen bleibt das Problem bisher unbehebt (RHEL, Fedora, Debian, Ubuntu, SUSE, Arch).
Der Entdecker der Schwachstelle konnte einen Exploit erstellen, um Root-Rechte auf Systemen mit Linux-Kernen 5.4 und neuer zu erlangen. Es wurde auch gezeigt, dass ein erfolgreicher Angriff auf Ubuntu 20.04.02 LTS möglich ist. Es besteht die Möglichkeit, den Exploit auch für ältere Kernel neu zu entwickeln (im Kernel 5.4 wurde der CAN BCM-Code (net/can/bcm.c) von hrtimer_tasklet auf HRTIMER_MODE_SOFT umgestellt).
Das CAN BCM-Protokoll ermöglicht es, einen eigenen Nachrichtenverarbeiter zu registrieren, der über den CAN-Bus (Controller Area Network) eingehende Nachrichten empfängt und an einen bestimmten Netzwerk-Socket zu binden. Sobald eine eingehende Nachricht eintrifft, wird die Funktion bcm_rx_handler() aufgerufen. Ein Angreifer kann einen Zustand von Rennen ausnutzen, um den Netzwerk-Socket gleichzeitig mit der Ausführung von bcm_rx_handler() zu schließen. Beim Schließen des Sockets wird die Funktion bcm_release() aufgerufen, die den für die Strukturen bcm_op und bcm_sock reservierten Speicher freigibt, der weiterhin im laufenden Handler bcm_rx_handler() verwendet wird. Dies führt zu einer Situation, in der auf einen bereits freigegebenen Speicherbereich zugegriffen wird (use-after-free).
Der Angriff besteht darin, zwei CAN BCM-Sockets zu öffnen und sie mit dem vcan-Interface zu verbinden. Im ersten Socket wird sendmsg() mit dem RX_SETUP-Flag aufgerufen, um den Handler für eingehende CAN-Nachrichten einzurichten. Im zweiten Socket erfolgt der Aufruf von sendmsg(), um eine Nachricht an den ersten Socket zu senden. Nach dem Eintreffen der Nachricht wird bcm_rx_handler() aufgerufen, und der Angreifer wählt den richtigen Moment, um den ersten Socket zu schließen, was zur Ausführung von bcm_release() und zur Freigabe der Strukturen bcm_op und bcm_sock führt, während die Arbeit von bcm_rx_handler() noch nicht abgeschlossen ist.
Durch Manipulation des Inhalts von bcm_sock kann ein Angreifer den Zeiger auf die Funktion sk->sk_data_ready(sk) neu definieren, die Ausführung umleiten und mithilfe von Techniken der Rücksprungorientierten Programmierung (ROP — Return-Oriented Programming) das Überschreiben des Parameters modprobe_path organisieren, um seinen Code mit Root-Rechten auszuführen. Bei der Verwendung der ROP-Technik versucht der Angreifer nicht, seinen eigenen Code im Speicher zu platzieren, sondern operiert mit bereits vorhandenen Maschinencodesegmenten in den geladenen Bibliotheken, die mit einer Rücksprunginstruktion enden (typischerweise die Enden von Bibliotheksfunktionen). Die Funktion des Exploits besteht darin, eine Kette solcher Blockaufrufe („Gadgets“) zu erstellen, um die gewünschte Funktionalität zu erhalten.

Für einen Angriff ist der Zugriff auf die Erstellung von CAN-Sockets sowie eine konfigurierte Netzwerkdatenverbindung vcan erforderlich. Die für einen Angriff notwendigen Berechtigungen können von einem nicht privilegierten Benutzer in Containern erlangt werden, die in Systemen mit aktivierter Unterstützung für Benutzer-Namensräume (user namespaces) erstellt werden. Zum Beispiel sind Benutzer-Namensräume standardmäßig in Ubuntu und Fedora aktiviert, jedoch nicht in Debian und RHEL.
Quelle: opennet.ru
