Labs November 4, 2020

OpenMediaVault-Sicherheitslücke bei Remotecodeausführung (RCE)

Anastasios Stasinopoulous

Abstrakt

In diesem Artikel konzentrieren wir uns auf die Identifizierung und Ausnutzung von CVE-2020-26124 [1], einer Schwachstelle für Remotecodeausführung (RCE), die OpenMediaVault [2] in bestimmten Versionen vor 4.1.36 und 5.x vor 5.5.12 betrifft.

Einführung

OpenMediaVault ist eine freie Linux-Distribution, die für Network-Attached Storage (NAS) entwickelt wurde und Dienste wie SSH, (S)FTP, SMB/CIFS, DAAP-Medienserver, RSync, BitTorrent-Client und vieles mehr bietet. OpenMediaVault basiert auf dem Debian-Betriebssystem und ist unter der GNU General Public License v3 lizenziert. Der leitende Entwickler des Projekts ist Volker Theile, der das Projekt Ende 2009 ins Leben gerufen hat.

Details zur Schwachstelle

Unsere Forschung begann am 26.09.2020, als wir zunächst die (bis dahin neueste) Version 5.5.11-1 von OpenMediaVault, die über SourceForge [3] frei heruntergeladen werden kann, auf einer virtuellen Maschine in unserem Labor installierten. Nach der erfolgreichen Installation und Einrichtung von OpenMediaVault meldeten wir uns bei der webbasierten Bereitstellungs-GUI mit den standardmäßigen administrativen Anmeldedaten an (d. h. Benutzername: „admin“ und Passwort: „openmediavault“).

Abbildung 1: Webbasierte OpenMediaVault-GUI für die Bereitstellung.

Nach einer langen Reise und mehreren Tests der Funktionen von OpenMediaVault wurde festgestellt, dass die Version 5.5.11-1 anfällig für post-authentifizierte PHP-Code-Injection-Angriffe ist, die den POST-Parameter „shortfield“ der Seite „rpc.php“ betreffen. Code-Injection-Schwachstellen entstehen im Allgemeinen, wenn eine Anwendung vom Benutzer bereitgestellte Daten in eine Zeichenkette einfügt, die von einem Code-Interpreter dynamisch ausgewertet wird.

Daher kann ein potenzieller Angreifer diese Schwachstelle ausnutzen und beliebigen PHP-Code einspeisen, der serverseitig ausgeführt wird, was zu einer möglichen Übernahme des zugrunde liegenden Betriebssystems führt. Wie in der folgenden Demonstration zu sehen ist, kann durch die Verkettung der Funktion „exec()“ – einer eingebauten Funktion von PHP, die zur Ausführung eines externen Programms verwendet wird – eine Befehlsausführung auf Betriebssystemebene erreicht werden:

Abbildung 2: Allgemeine PHP-Code-Verkettung und Ausführung externer Betriebssystembefehle über die PHP-Funktion „exec()“.

Aufgrund der Tatsache, dass(a) die identifizierte Sicherheitslücke „blind“ war (d. h. es nicht möglich war, die Ausgabe der ausgeführten Befehle über die PHP-Funktion „exec()“ abzurufen), (b) die Verwendung der PHP-Funktion „sleep()“ und/oder des Betriebssystembefehls nicht effektiv war (die Anwendung hängt immer nach der Ausführung) und (c) zeitbasierte Angriffe wie die Ausnutzung der PHP-Funktion „usleep()“ zeitaufwändig sind, haben wir beschlossen, eine Out-Of-Band (OOB)-Technik zu verwenden, um die Befehlsausgabe abzurufen und Daten als Konzeptnachweis zu exfiltrieren.

Typischerweise basieren die OOB-Techniken auf der Auslösung einer ausgehenden TCP/UDP/ICMP-Anfrage, über die der Angreifer Daten exfiltriert. Nach dem vorgenannten Ansatz wurde die folgende Nutzlast erstellt und verwendet:

Abbildung 3: Ein Beispiel für die verwendete Out-Of-Band-Nutzlast zur Datenexfiltration.

Der Payload enthält die Ausgabe des „id“-Befehls und kodiert sie im base64-Format (ohne Zeilenumbruch – mit „base64 -w 0“, das für die Übertragung in der URL geeignet ist). Schließlich wird die generierte base64-Zeichenkette mit dem Befehl „wget“ über eine GET-HTTP-Anfrage an den Angreifer gesendet.

Abbildung 4: Out-Of-Band-Datenexfiltration in Aktion.

Außerdem wurde festgestellt, dass der Anwendungsprozess mit Root-Rechten läuft und über Nginx bedient wird. Das vorgenannte konzeptionelle Problem verstärkt die Auswirkungen einer erfolgreichen Ausnutzung einer Sicherheitslücke im Kontext der Anwendung, da jede nicht autorisierte Aktion mit „Root“-Rechten ausgeführt wird.

In einem letzten Schritt gelang es uns, eine umgekehrte TCP-Verbindung herzustellen, indem wir die Code-Injection-Schwachstelle ausnutzten, die, wie bereits erwähnt, die Ausführung beliebiger Befehle auf dem zugrunde liegenden Betriebssystem mit „root“-Rechten ermöglicht.

Abbildung 5: Empfangene Reverse-TCP-Verbindung mit „root“-Rechten.

Das Metasploit-Framework-Modul.

Dennoch haben wir als Proof-of-Concept (POC) dieser Forschung ein Metasploit-Modul für CVE-2020-26124 entwickelt und eingereicht [4], das die identifizierte Remote-Code-Execution (RCE)-Schwachstelle von OpenMediaVault, Versionen vor 4.1.36 und 5.x vor 5.5.12 ausnutzt.

Abbildung 6: Das Metasploit-Modul in Aktion.

Empfehlungen

Da Benutzereingaben grundsätzlich als nicht vertrauenswürdig angesehen werden sollten, wird dringend empfohlen, dass Anwendungen es vermeiden sollten, benutzerkontrollierbare Daten in dynamisch ausgewerteten Code einzubauen. Der Validierungsalgorithmus sollte nur Zeichen zulassen, die in einer Whitelist enthalten sind, die ausdrücklich durch die geschäftlichen Anforderungen der Anwendung definiert ist. Darüber hinaus sollten nur alphanumerische Zeichenfolgen akzeptiert werden, so dass Eingaben, die andere Symbole enthalten, proaktiv in eine schwarze Liste aufgenommen werden, die nach der anfänglichen Überprüfung der weißen Liste zur Validierung herangezogen wird.

Außerdem wird dringend empfohlen, für Anwendungen, die mit übermäßigen Privilegien ausgeführt werden, ein spezielles funktionales Konto zu verwenden, das dem Prinzip der geringsten Privilegien folgt.

Zeitplan für die Offenlegung von Informationen

  • 2020-09-26 – Kontakt zum Anbieter.
  • 26.09.2020 – Vom Hersteller geprüfte Sicherheitsanfälligkeit.
  • 2020-09-26 – Hersteller-Patch veröffentlicht [5].
  • 2020-09-28 – MITRE Assigned CVE.

Referenzen

  1. https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-26124
  2. https://www.openmediavault.org/
  3. https://sourceforge.net/projects/openmediavault/files/5.5.11/
  4. https://github.com/rapid7/metasploit-framework/pull/14241
  5. https://github.com/openmediavault/openmediavault/commit/ebb51bbf5a39f4955eab0073bf87f2a31926d85d