MySQL: LOAD DATA INFILE führt zu Dateizugriff, UDF zu Remote Code Execution

Table of Contents

MariaDB und MySQL sind weit verbreitete Datenbanksysteme, die in zahlreichen Anwendungen und Diensten verwendet werden. Trotz ihrer Beliebtheit sind sie nicht ohne Sicherheitsrisiken. Besonders kritisch sind die Funktionen LOAD DATA INFILE und die Möglichkeit, Server-Side Request Forgery (SSRF) sowie Remote Code Execution (RCE) durch User Defined Functions (UDF) durchzuführen. Dieser Bericht beleuchtet diese Schwachstellen und vergleicht die Sicherheit auf verschiedenen Betriebssystemen.

Sicherheitsrisiken durch „LOAD DATA INFILE“

1. Lesen und Schreiben von Dateien

Der Befehl LOAD DATA INFILE ermöglicht es, Daten aus Dateien zu lesen und in Datenbanktabellen zu laden. Diese Funktion kann jedoch missbraucht werden, um auf sensible Dateien zuzugreifen oder bösartige Inhalte zu schreiben, wenn die Konfiguration nicht sicher ist.

  • Lesen sensibler Dateien: Angreifer könnten den Befehl verwenden, um Dateien wie /etc/passwd zu lesen.
  • Schreiben bösartiger Inhalte: Angreifer könnten Dateien mit schädlichem Code auf dem Server ablegen.

2. Einschränkung durch secure_file_priv

Der Parameter secure_file_priv beschränkt den Zugriff auf das Dateisystem. Wenn dieser Parameter auf ein spezifisches Verzeichnis (z.B. /var/lib/mysql-files/) gesetzt ist, kann LOAD DATA INFILE nur auf Dateien in diesem Verzeichnis zugreifen. Wenn er auf "" gesetzt ist, sind keine Einschränkungen vorhanden.

  • Standardkonfiguration: Setzt secure_file_priv auf ein spezifisches Verzeichnis, was den Zugriff einschränkt.
  • Unsichere Konfiguration: Wenn secure_file_priv auf "" gesetzt ist, können Angreifer Dateien im gesamten Dateisystem lesen.

3. File Privilegien möglichst nicht vergeben

Das FILE-Privileg sollte nur vertrauenswürdigen Benutzern gewährt werden, die es unbedingt benötigen.

GRANT FILE on *.* to user@'localhost'

Ist in den meisten Fällen ein gefundenes Fressen für Angreifer. Dieses Privileg erlaubt es Angreifern LOAD DATA INFILE und SELECT INTO OUTFILE effektiv auf Betriebssystemebene auszuführen und Daten so Daten zu stehlen.

SSRF und RCE durch SQL-Injection und UDFs

1. SSRF via SQL-Funktionen

Die Funktion LOAD_FILE() kann genutzt werden, um Netzwerkaufrufe zu initiieren. Die Wirksamkeit dieser Technik hängt vom Betriebssystem und der Datenbankkonfiguration ab.

  • Windows: Ermöglicht Netzwerkaufrufe zu UNC-Pfaden, was zur Exfiltration von NTLMv2-Hashes führen kann.
  • Linux: Netzwerkaufrufe sind eingeschränkt und weniger effektiv als unter Windows.

2. Remote Code Execution (RCE) via UDFs

MySQL und MariaDB erlauben das Hinzufügen von User Defined Functions (UDFs) aus externen Bibliotheken. Wenn diese Bibliotheken zugänglich und in das System eingebunden sind, können sie zur Ausführung beliebigen Codes verwendet werden.

  • Voraussetzungen:
  • Schreibzugriff auf @@plugin_dir
  • file_priv auf Y gesetzt
  • secure_file_priv deaktiviert
  • Beispiel: Bibliotheken wie lib_mysqludf_sys können geladen werden, um HTTP-Anfragen auszuführen und SSRF zu ermöglichen.

Vergleich der Sicherheit nach Betriebssystem

Windows

  • SSRF-Anfälligkeit: Höher, da Netzwerkaufrufe zu UNC-Pfaden möglich sind, was zur Exfiltration von NTLMv2-Hashes führen kann.
  • RCE-Anfälligkeit: Hoch, wenn UDFs eingebunden und entsprechende Rechte vorhanden sind.

Linux

  • SSRF-Anfälligkeit: Geringer als bei Windows, da Netzwerkaufrufe eingeschränkter sind.
  • RCE-Anfälligkeit: Ähnlich wie bei Windows, abhängig von der Konfiguration und den Rechten.

Sicherheitsmaßnahmen

1. Konfiguration von secure_file_priv

  • Setzen Sie secure_file_priv auf ein spezifisches und sicheres Verzeichnis.
  • Vermeiden Sie die Einstellung "", um den unbeschränkten Dateizugriff zu verhindern.

2. Beschränkung von UDFs

  • Deaktivieren Sie unnötige User Defiend Functions (UDFs) und stellen Sie sicher, dass nur vertrauenswürdige Bibliotheken verwendet werden.
  • Überwachen Sie den Zugriff auf @@plugin_dir und beschränken Sie Schreibrechte.

3. Einschränkung von Dateizugriffen

  • Beschränken Sie den Zugriff auf LOAD DATA INFILE auf vertrauenswürdige Benutzer.
  • Implementieren Sie strenge Dateiberechtigungen und überwachen Sie den Zugriff auf sensitive Verzeichnisse.

Fazit

MariaDB und MySQL bieten leistungsfähige Funktionen, die bei unsachgemäßer Konfiguration erhebliche Sicherheitsrisiken mit sich bringen können. Die Kombination aus LOAD DATA INFILE-Befehl und die Möglichkeit durch UDFs Remote Code zu laden sind eine gefundene Einladung für Hacker. Windows-Systeme sind besonders anfällig für SSRF-Angriffe, während sowohl Windows- als auch Linux-Systeme durch RCE gefährdet sind, abhängig von der spezifischen Konfiguration und den Benutzerrechten. Durch geeignete Sicherheitsmaßnahmen und eine sorgfältige Konfiguration können diese Risiken jedoch erheblich reduziert werden.

Related Posts

PostgreSQL: COPY-Befehl erlaubt System-Shell Zugriff

PostgreSQL hat sich als robustes und flexibles Datenbanksystem etabliert. Dennoch gibt es bestimmte Funktionen, die von Angreifern ausgenutzt werden können, wenn sie nicht ordnungsgemäß gesichert sind. Eine solche Funktion ist der COPY-Befehl, der sich als Achillesferse von PostgreSQL herausgestellt hat. Nachfolgend wird erläutert, warum dieser Befehl bei Hackern beliebt ist und wie er ausgenutzt werden kann.

Read More

Trojaner nutzt GoTo Meeting als Rust Shellcode Loader

Laut einer Malware Studie von GData wird die Anwendung GoTo Meeting ausgenutzt, um Malware auf Windows zu installieren. Threat Actors nutzten dabei GoTo Meeting zur Verbreitung des Remcos RAT (Remote Access Trojan). Angreifer verwenden dabei Dateien, wie Software-Setup-Dateien und Steuerformulare, oft mit Dateinamen in russischer und englischer Sprache, um Opfer anzulocken. Der Bericht zeigt folgende Infektionskette auf:

Read More

Command injection im Network Monitoring Tool Cacti möglich

Das Github Security Advisory GHSA-cr28-x256-xf5m beschreibt eine kritische Command Injection Schwachstelle im beliebten Open Source Network Monitoring Tool Cacti. Diese Schwachstelle CVE-2024-29895 betrifft die Version 1.3.x DEV, während die gepatchte Version ebenfalls 1.3.x DEV ist.

Read More