FlawOpen

flawopen.com/Incidents/moveit-transfer-sql-injection-may-2023

● Progress Software · CVE-2023-34362 · May 2023 · CVSS 9.8 · Kritisch
Sicherheitsforschung · FlawOpen

MOVEit Transfer: SQL-Injection und massiver Datendiebstahl

CVE-2023-34362 war eine nicht authentifizierte SQL-Injection in MOVEit Transfer. Mandiant beobachtete Ausnutzung ab dem 27. Mai 2023, gefolgt von LEMURLOOT-Web-Shells und Datendiebstahl.[4], [3]

💡 Einfache Erklärung (ELI5)

Stellen Sie sich ein Formular mit dem Feld „Ordnernummer“ vor. Die Sachbearbeitung kopiert den Inhalt jedoch direkt in einen Befehl an das Ablagesystem. Kann das Feld den Befehl ändern, statt nur einen Ordner zu benennen, kann die Eingabe mehr auslösen als vorgesehen. SQL-Injection überschreitet dieselbe Grenze: Nicht vertrauenswürdige Eingaben werden als SQL-Syntax statt als Wert behandelt.[5]

Kernkonzepte & Begriffe

SQL-Injection (CWE-89)
Eine in eine Datenbankabfrage eingefügte Eingabe verändert, was die Abfrage tut, statt als Wert behandelt zu werden.[5]
Managed File Transfer (MFT)
Software, mit der Organisationen große oder sensible Dateien mit Partnern austauschen. Ein Server kann Daten vieler Organisationen enthalten.[3]
Web-Shell
Ein Skript, das ein Angreifer auf einem Webserver ablegt, um Zugang zu behalten. Mandiant bezeichnete die hier genutzte als LEMURLOOT.[3]
Parametrisierte Abfrage
Eine Abfrage, deren Werte getrennt vom Abfragetext gesendet werden, sodass die Datenbank Daten nie als SQL interpretiert.[5]
Betroffene und korrigierte Versionen
Progress nennt für die jeweiligen Zweige Versionen vor 2021.0.6, 2021.1.4, 2022.0.4, 2022.1.5 und 2023.0.1 als betroffen; diese Versionen enthalten den Fix. Prüfen Sie Ihren Zweig und den aktuellen Upgradepfad im Progress-Hinweis.[1]

Framework-Zuordnungen

Vorfall-Zeitstrahl

2023-05-27

Mandiant datiert die frühesten von ihr beobachteten Hinweise auf eine Ausnutzung von MOVEit Transfer auf den 27. Mai 2023.[3]

2023-05-31

Progress legt die Schwachstelle offen und rät Kunden, HTTP- und HTTPS-Verkehr bis zum Patch zu sperren.[1]

2023-06-02

Die CISA nimmt CVE-2023-34362 in ihren Katalog Known Exploited Vulnerabilities auf.[9]

2023-06-07

CISA und FBI veröffentlichen die gemeinsame Warnung AA23-158A und beschreiben die Kampagne als Aktivität der Ransomware-Gruppe CL0P. Mandiant aktualisiert später die Zuordnung und gliedert UNC4857 aufgrund von Überschneidungen in FIN11 ein.[2], [3]

Schritt-für-Schritt Angriffsablauf

Schritt 1

Eine Anfrage ohne Anmeldung

Mandiant beobachtete präparierte POST-Anfragen an guestaccess.aspx von MOVEit Transfer, bevor LEMURLOOT auftauchte; dafür war keine reguläre Benutzeranmeldung erforderlich.[3]

Schritt 2

Die Eingabe verändert die Abfrage

Die Anfrage erreichte eine anfällige SQL-Operation. CISA beschrieb die Schwachstelle als Zugriff auf die Datenbank ohne Authentifizierung, einschließlich Auslesen oder Ändern/Löschen je nach Datenbankmodul.[2], [5]

Schritt 3

Eine Web-Shell wird installiert

Nach der Ausnutzung beobachtete Mandiant die LEMURLOOT-Web-Shell. Sie konnte Dateien auflisten und abrufen sowie einen bestimmten Anwendungskonten-Eintrag bearbeiten; generische Administratorkontrolle belegen die Quellen nicht.[3]

Schritt 4

Dateien werden massenhaft gestohlen

Mandiant beobachtete umfangreichen Dateidiebstahl. CISA und FBI beschrieben die Kampagne insgesamt als Aktivität der Ransomware-Gruppe CL0P; Mandiants spätere Zuordnung verband die Aktivität mit FIN11.[2], [3]

Quellcode: Verwundbar vs. Sicher

Illustratives C#, kein MOVEit-Quellcode. Die gehärtete Methode wandelt die ID in den Typ um, den die Spalte tatsächlich speichert, lehnt alles andere ab und sendet sie dann als typisierten Parameter, sodass der Wert nie Teil des SQL-Texts wird. Jede der beiden Kontrollen verhindert diese Injection allein; zusammen weisen sie zusätzlich fehlerhafte IDs zurück, bevor die Abfrage ausgeführt wird.[5]

VERWUNDBARE IMPLEMENTIERUNG
using System.Data.SqlClient;

public static class FolderLookup
{
    public static SqlDataReader Find(SqlConnection conn, string folderId)
    {
        // Abfragetext und Anfragedaten werden verkettet, sodass die Datenbank
        // nicht erkennen kann, welcher Teil als Daten gedacht war.
        string sql = "SELECT id, name FROM folders WHERE id = '" + folderId + "'";
        var cmd = new SqlCommand(sql, conn);
        return cmd.ExecuteReader();
    }
}
GEHÄRTETER SICHERHEITS-PATCH
using System;
using System.Data;
using System.Data.SqlClient;

public static class FolderLookup
{
    public static SqlDataReader Find(SqlConnection conn, string folderId)
    {
        if (!long.TryParse(folderId, out long id) || id <= 0)
            throw new ArgumentException("folderId must be a positive integer");

        // Der Wert wird als typisierter Parameter getrennt vom Abfragetext übergeben.
        var cmd = new SqlCommand("SELECT id, name FROM folders WHERE id = @id", conn);
        cmd.Parameters.Add("@id", SqlDbType.BigInt).Value = id;
        return cmd.ExecuteReader();
    }
}

Checkliste für Engineering & Systemsicherheit

Quellen