FlawOpen

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

● Progress Software · CVE-2023-34362 · May 2023 · CVSS 9.8 · Critique
Recherche · FlawOpen

MOVEit Transfer : injection SQL et vol massif de données

CVE-2023-34362 était une injection SQL non authentifiée dans MOVEit Transfer. Mandiant a observé son exploitation à partir du 27 mai 2023, suivie de web shells LEMURLOOT et de vols de données.[4], [3]

💡 Explication en Langage Simple (ELI5)

Imaginez un formulaire avec un champ « numéro de dossier », mais l’employé le recopie directement dans une instruction envoyée au système de classement. Si ce champ peut modifier l’instruction au lieu de désigner un dossier, la personne qui remplit le formulaire peut faire exécuter davantage que prévu. L’injection SQL franchit la même frontière : une entrée non fiable est interprétée comme de la syntaxe SQL plutôt que comme une valeur.[5]

Concepts Clés et Termes

Injection SQL (CWE-89)
Une entrée concaténée dans une requête de base de données modifie ce que fait la requête au lieu d'être traitée comme une valeur.[5]
Transfert de fichiers géré (MFT)
Logiciel qu'utilisent les organisations pour échanger des fichiers volumineux ou sensibles avec des partenaires. Un seul serveur peut héberger les données de nombreuses organisations.[3]
Web shell
Un script qu'un attaquant dépose sur un serveur web pour garder un accès. Mandiant a nommé celui utilisé ici LEMURLOOT.[3]
Requête paramétrée
Une requête dont les valeurs sont envoyées séparément du texte, de sorte que la base n'interprète jamais des données comme du SQL.[5]
Versions concernées et corrigées
Progress indique comme concernées, dans leurs branches respectives, les versions antérieures à 2021.0.6, 2021.1.4, 2022.0.4, 2022.1.5 et 2023.0.1 ; ces versions intègrent le correctif. Vérifiez votre branche et le chemin de mise à niveau actuel dans l’avis de Progress.[1]

Correspondances de référentiels

Chronologie de l'Incident

2023-05-27

Mandiant date du 27 mai 2023 les premières traces d’exploitation de MOVEit Transfer qu’elle a observées.[3]

2023-05-31

Progress divulgue la vulnérabilité et demande à ses clients de couper le trafic HTTP et HTTPS en attendant le correctif.[1]

2023-06-02

La CISA ajoute CVE-2023-34362 à son catalogue Known Exploited Vulnerabilities.[9]

2023-06-07

La CISA et le FBI publient l’avis conjoint AA23-158A, qui décrit la campagne comme une activité du rançongiciel CL0P. Mandiant met ensuite à jour son attribution et rattache UNC4857 à FIN11 sur la base de recoupements.[2], [3]

Déroulement de l'Attaque Étape par Étape

Étape 1

Une requête non authentifiée

Mandiant a observé des requêtes POST forgées vers guestaccess.aspx de MOVEit Transfer avant l’apparition de LEMURLOOT ; l’activité ne nécessitait pas de connexion utilisateur normale.[3]

Étape 2

L’entrée modifie le sens de la requête

La requête atteignait une opération SQL vulnérable. La CISA décrit la faille comme permettant un accès sans authentification à la base, avec inférence ou modification/suppression selon le moteur utilisé.[2], [5]

Étape 3

Un web shell est installé

Après l’exploitation, Mandiant a observé le web shell LEMURLOOT. Il pouvait énumérer et récupérer des fichiers et manipuler un utilisateur donné de l’application ; les sources n’établissent pas un contrôle administrateur générique.[3]

Étape 4

Des fichiers sont volés en masse

Mandiant a observé des vols de fichiers à grande échelle. La CISA et le FBI décrivent la campagne globale comme une activité du rançongiciel CL0P ; l’attribution ultérieure de Mandiant la relie à FIN11.[2], [3]

Code Source : Vulnérable vs Sécurisé

C# illustratif, pas le code source de MOVEit. La méthode durcie convertit l’identifiant dans le type réellement stocké par la colonne et refuse tout le reste, puis l’envoie comme paramètre typé : la valeur ne fait jamais partie du texte SQL. Chacun de ces contrôles suffit à bloquer cette injection ; ensemble, ils rejettent aussi les identifiants mal formés avant l’exécution de la requête.[5]

IMPLÉMENTATION VULNÉRABLE
using System.Data.SqlClient;

public static class FolderLookup
{
    public static SqlDataReader Find(SqlConnection conn, string folderId)
    {
        // Le texte de la requête et les données de la demande sont concaténés ; la base de données
        // ne peut donc pas distinguer la partie que le développeur voulait traiter comme une donnée.
        string sql = "SELECT id, name FROM folders WHERE id = '" + folderId + "'";
        var cmd = new SqlCommand(sql, conn);
        return cmd.ExecuteReader();
    }
}
PATCH SÉCURISÉ ET ROBUSTE
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");

        // La valeur est transmise comme paramètre typé, séparément du texte de la requête.
        var cmd = new SqlCommand("SELECT id, name FROM folders WHERE id = @id", conn);
        cmd.Parameters.Add("@id", SqlDbType.BigInt).Value = id;
        return cmd.ExecuteReader();
    }
}

Liste de Contrôle de Sécurité pour l'Ingénierie

Sources