Sicherheitsanfälligkeit im Linux-Kernel, die das Netzwerkprotokoll CAN BCM betrifft.

Im Linux-Kernel wurde eine Schwachstelle (CVE-2021-3609) entdeckt, die es einem lokalen Benutzer ermöglicht, seine Privilegien im System zu erhöhen. Das Problem wird durch einen Race-Condition in der Implementierung des CAN BCM-Protokolls verursacht und tritt in den Kernel-Versionen von 2.6.25 bis 5.13-rc6 auf. In den Distributionen bleibt das Problem bisher ungelöst (RHEL, Fedora, Debian, Ubuntu, SUSE, Arch).

Der Entdecker der Schwachstelle konnte einen Exploit vorbereiten, um Root-Rechte auf Systemen mit Linux-Kernels 5.4 und neuer zu erlangen, wobei auch die erfolgreiche Durchführung eines Angriffs in Ubuntu 20.04.02 LTS gezeigt wurde. Es besteht nicht ausgeschlossen, dass der Exploit auch für die Arbeit mit älteren Kernen überarbeitet wird (im Kernel 5.4 wurde der Code für CAN BCM (net/can/bcm.c) von hrtimer_tasklet auf HRTIMER_MODE_SOFT umgestellt).

Das CAN BCM-Protokoll ermöglicht es, einen eigenen Nachrichten-Handler zu registrieren, der über den CAN-Bus (Controller Area Network) Nachrichten empfängt, und an einen bestimmten Netzwerk-Socket anzuhängen. Bei Eingang einer Nachricht wird die Funktion bcm_rx_handler() aufgerufen. Der Angreifer kann den Race-Condition nutzen und den Netzwerk-Socket gleichzeitig mit der Ausführung von bcm_rx_handler() schließen. Beim Schließen des Sockets wird die Funktion bcm_release() aufgerufen, in der der Speicher, der für die Strukturen bcm_op und bcm_sock reserviert wurde, freigegeben wird, obwohl diese weiterhin im laufenden Handler bcm_rx_handler() verwendet werden. Dies führt zu einem Zugriff auf einen bereits freigegebenen Speicherblock (Use-After-Free).

Der Angriff besteht darin, zwei CAN BCM-Sockets zu öffnen und sie an das Interface vcan zu binden. Im ersten Socket wird sendmsg() mit dem RX_SETUP-Flag aufgerufen, um den Handler für eingehende CAN-Nachrichten zu konfigurieren, während im zweiten Socket ein sendmsg()-Aufruf gemacht wird, 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 die Ausführung von bcm_release() und die Freigabe der Strukturen bcm_op und bcm_sock auslöst, obwohl die Arbeit von bcm_rx_handler() noch nicht abgeschlossen ist.

Durch Manipulationen mit dem Inhalt von bcm_sock kann ein Angreifer den Zeiger auf die Funktion sk->sk_data_ready(sk) überschreiben, die Ausführung umleiten und durch Techniken der Rücksprungprogrammierung (ROP — Return-Oriented Programming) den Parameter modprobe_path umschreiben, um seinen Code mit Root-Rechten auszuführen. Bei der Verwendung der ROP-Technik versucht der Angreifer nicht, seinen eigenen Code im Speicher abzulegen, sondern nutzt bereits vorhandene Teile von Maschinenanweisungen in geladenen Bibliotheken, die mit einer Rücksprunganweisung enden (in der Regel sind dies Ende-Anweisungen von Bibliotheksfunktionen). Die Funktionsweise des Exploits besteht darin, eine Kette von Aufrufen solcher Blöcke („Gadgets“) zu erstellen, um die gewünschte Funktionalität zu erhalten.

Sicherheitsanfälligkeit im Linux-Kernel, die das Netzwerkprotokoll CAN BCM betrifft.

Für den Angriff ist der Zugriff zur Erstellung von CAN-Sockets und eine konfigurierte Netzwerkschnittstelle vcan erforderlich. Die für den Angriff erforderlichen 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. Beispielsweise sind Benutzer-Namensräume standardmäßig in Ubuntu und Fedora aktiviert, aber nicht in Debian und RHEL.

Quelle: opennet.ru

60GB SSD 8Gb DDR4