flawopen.com/Incidents/moveit-transfer-sql-injection-may-2023
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]
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
- Référence CWE pour la faiblesse décrite dans ce guide : CWE-89
- CISA KEV — ajouté le 2023-06-02 — CVE-2023-34362
Chronologie de l'Incident
Mandiant date du 27 mai 2023 les premières traces d’exploitation de MOVEit Transfer qu’elle a observées.[3]
Progress divulgue la vulnérabilité et demande à ses clients de couper le trafic HTTP et HTTPS en attendant le correctif.[1]
La CISA ajoute CVE-2023-34362 à son catalogue Known Exploited Vulnerabilities.[9]
Déroulement de l'Attaque Étape par Étape
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]
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]
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]
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();
}
}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
- ✓Paramétrez chaque valeur SQL et faites échouer la CI si une entrée non fiable est concaténée dans une API de commande SQL ; MITRE
CWE-89cite les requêtes paramétrées comme mesure de prévention.[5] - ✓Conseil FlawOpen : après une faille d’injection, recherchez la même frontière dangereuse entre données et SQL dans tous les chemins de construction des requêtes. Traitez les CVE ultérieures comme distinctes, sauf si leurs avis établissent une cause racine commune.
- ✓Appliquez les correctifs recommandés par Progress à chaque instance MOVEit Transfer déployée ; inventorie-les et consignez la version corrigée avant de rétablir l’exposition normale.[1]
- ✓En cas d’exploitation suspectée, examinez l’hôte avant sa remise en service : recherchez LEMURLOOT et les comptes concernés, puis renouvelez les identifiants ou secrets potentiellement exposés.[3]
- ✓Conseil FlawOpen : demandez aux prestataires de transfert quels systèmes détenaient vos données et utilisez cet inventaire pour cadrer les notifications et la réponse à l’incident.
- ✓Conseil FlawOpen : définissez la conservation selon la sensibilité des données et les besoins contractuels, puis vérifiez leur suppression ; cela limite l’exposition sans supposer l’historique de conservation des victimes MOVEit.
Sources
- Progress — vulnérabilité critique dans MOVEit Transfer (31 mai 2023)
- CISA et FBI — avis AA23-158A : le gang de rançongiciel CL0P exploite CVE-2023-34362
- Mandiant — une vulnérabilité zero-day de MOVEit Transfer exploitée pour voler des données
- CVE-2023-34362 — fiche CVE
- MITRE CWE-89
- Injection SQL — référence complète de la classe en 11 langages
- Les procédures stockées empêchent-elles l'injection SQL ?
- CVE-2025-1094 : quand la fonction d'échappement était elle-même la vulnérabilité
- Catalogue KEV de la CISA — CVE-2023-34362