Security Advisory

ruby-mysql / Metasploit Arbitrary File Read

Durch Ausnutzung einer Design-Schwachselle im MySQL-Protokoll können Angreifer beliebige Dateien aus einem ruby-mysql Client oder der Metasploit-Installation auslesen.

Advisory ID: MLSA-2021-001
CVE: CVE-2021-3779
CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N
Kritikalität: medium
Betroffene Versionen: alle Versionen
Behoben in: ≥ 2.10.0
Gefunden von: Hans-Martin Münch

Produktbeschreibung (englisch)

ruby-mysql is a MySQL client library. It is written entirely in Ruby. Therefore libmysqlclient is not required and no compilation is required during installation.

Details

MySQL bietet einen LOAD DATA LOCAL-Befehl. Aufgrund einer Schwachstelle im Protokoll-Design ist es möglich, dass ein MySQL-Dienst den Client dazu bewegt, eine beliebige Datei an den Server zu senden, selbst wenn der Client gar keinen LOAD DATA LOCAL-Befehl gesendet/verwendet hat.

Aus der offiziellen MySQL Dokumentation (englisch):

Because LOAD DATA LOCAL is an SQL statement, parsing occurs on the server side, and transfer of the file from the client host to the server host is initiated by the MySQL server, which tells the client the file named in the statement. In theory, a patched server could tell the client program to transfer a file of the server’s choosing rather than the file named in the statement. Such a server could access any file on the client host to which the client user has read access. (A patched server could in fact reply with a file-transfer request to any statement, not just LOAD DATA LOCAL, so a more fundamental issue is that clients should not connect to untrusted servers.)

Um dies zu verhindern, haben die meisten MySQL-Client-Implementierungen, insbesondere wenn sie auf libmysql basieren, dieses Feature standardmäßig deaktiviert. Diese Änderung wurde jedoch nie innerhalb von ruby-mysql implementiert (das in nur Ruby geschrieben ist).

ruby-mysql wird im Exploitation Framework Metasploit verwendet, um die Erstellung von Modulen zu ermöglichen, die mit MySQL-Datenbankdiensten interagieren. Daher sind die meisten MySQL-Module des Frameworks von dieser Schwachstelle betroffen. Ein bösartiger MySQL-Server kann dies ausnutzen, um sensible Dateien von den Metasploit-Hosts auszulesen, beispielsweise den privaten SSH-Schlüssel des Benutzers oder die Metasploit-Konfigurationsdatei.

Auf GitHub finden sich mehrere Implementierungen für einen solchen manipulierten MySQL-Dienst.

Coordinated Disclosure Zeitverlauf (englisch)

Hinweis: Die Koordinnation der Schwachstelle gegenüber dem ruby-gem-Maintainer wurde von Rapid7 übernommen.

  • 02/09/2021 Issue reported to Rapid7’s security contact as a Metasploit issue, #9286.
  • 07/09/2021 Rapid7 validated the issue, reserved CVE-2021-3779, and contacted the vulnerable gem maintainer, Tomita Masahiro.
  • 08/09/2021: Metasploit Framework temporary remediation committed.
  • 08/09/2021: Notified CERT/CC and RubyGems for disclosure coordination, as the gem appeared to be abandoned by the maintainer given no updates in several years.
  • 09/09/2021: Notified JPCERT/CC through VINCE on CERT/CC’s advice, as VU#541053.
  • 10/09/2021: JPCERT/CC acknowledged the issue and attempted to contact the gem maintainer.
  • 18/10/2021, 2021: Maintainer responded to JPCERT/CC, acknowledging the issue.
  • 22/10/2021, 2021: Fixed version 2.10.0 released, Rapid7 notified Hans-Martin of the fix.
  • 16/02/2022: CERT/CC asks for an update on the issue, Rapid7 communicates the fix to CERT/CC and JPCERT/CC.
  • 06/06/2022: CERT/CC asks for an update, Rapid7 commits to sharing disclosure documentation.
  • 14/06/2022: Rapid7 shares disclosure details with CERT/CC and Hans-Martin, and asks JPCERT/CC to communicate this document to Tomita.
  • 28/06/2022: Rapid7 blog.