flawopen.com/Incidents/moveit-transfer-sql-injection-may-2023
MOVEit Transfer: SQL injection y robo masivo de datos
CVE-2023-34362 era una inyección SQL sin autenticación en MOVEit Transfer. Mandiant observó explotación desde el 27 de mayo de 2023, seguida de web shells LEMURLOOT y robo de datos.[4], [3]
Imagina un formulario con un campo «número de carpeta», pero el empleado copia ese campo directamente en una instrucción para el sistema de archivo. Si el campo puede cambiar la instrucción en vez de indicar una carpeta, quien lo rellena puede hacer que el sistema vaya más allá de lo previsto. La inyección SQL cruza ese mismo límite: una entrada no confiable se interpreta como sintaxis SQL, no como un valor.[5]
Conceptos Clave y Términos
Inyección SQL (CWE-89)- Una entrada concatenada en una consulta a la base de datos cambia lo que hace la consulta, en vez de tratarse como un valor.[5]
Transferencia gestionada de ficheros (MFT)- Software que las organizaciones usan para intercambiar ficheros grandes o sensibles con socios. Un solo servidor puede guardar datos de muchas organizaciones.[3]
Web shell- Un script que el atacante coloca en un servidor web para mantener el acceso. Mandiant denominó LEMURLOOT al usado aquí.[3]
Consulta parametrizada- Una consulta cuyos valores se envían por separado del texto, de modo que la base de datos nunca interpreta los datos como SQL.[5]
Versiones afectadas y corregidas- Progress indica como afectadas, en sus respectivas ramas, las versiones anteriores a 2021.0.6, 2021.1.4, 2022.0.4, 2022.1.5 y 2023.0.1; esas versiones indicadas incluyen la corrección. Confirma tu rama y la ruta de actualización vigente en el aviso de Progress.[1]
Mapeos de marcos
- Referencia CWE para la debilidad descrita en esta guía: CWE-89
- CISA KEV — añadido el 2023-06-02 — CVE-2023-34362
Cronología del Incidente
Mandiant sitúa el 27 de mayo de 2023 la primera evidencia de explotación de MOVEit Transfer que observó.[3]
Progress revela la vulnerabilidad y pide a los clientes que corten el tráfico HTTP y HTTPS hasta aplicar el parche.[1]
CISA añade CVE-2023-34362 a su catálogo Known Exploited Vulnerabilities.[9]
Flujo de Ataque Paso a Paso
Una petición sin autenticar
Mandiant observó peticiones POST manipuladas a guestaccess.aspx de MOVEit Transfer antes de que apareciera LEMURLOOT; la actividad no requería un inicio de sesión normal.[3]
Se instala un web shell
Tras la explotación, Mandiant observó el web shell LEMURLOOT. Podía enumerar y recuperar archivos y manipular un usuario concreto de la aplicación; las fuentes no demuestran un control administrativo genérico.[3]
Código Fuente: Vulnerable vs. Seguro
C# ilustrativo, no es código fuente de MOVEit. El método reforzado convierte el identificador al tipo que realmente guarda la columna y rechaza cualquier otra cosa; después lo envía como parámetro tipado, de modo que el valor nunca forma parte del texto SQL. Cualquiera de los dos controles basta para frenar esta inyección; juntos, además, rechazan identificadores mal formados antes de ejecutar la consulta.[5]
using System.Data.SqlClient;
public static class FolderLookup
{
public static SqlDataReader Find(SqlConnection conn, string folderId)
{
// El texto de la consulta y los datos de la solicitud se concatenan, por lo que la base de datos
// no puede distinguir qué parte quería tratar como dato el desarrollador.
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");
// El valor se envía como parámetro tipado, separado del texto de la consulta.
var cmd = new SqlCommand("SELECT id, name FROM folders WHERE id = @id", conn);
cmd.Parameters.Add("@id", SqlDbType.BigInt).Value = id;
return cmd.ExecuteReader();
}
}Lista de Verificación de Seguridad para Ingeniería
- ✓Parametriza cada valor SQL y haz que CI falle si se concatenan datos no confiables en APIs de comandos SQL; MITRE
CWE-89identifica las consultas parametrizadas como medida preventiva.[5] - ✓Orientación de FlawOpen: al encontrar una inyección, busca el mismo límite inseguro entre datos y SQL en todas las rutas que construyen consultas. Trata las CVE posteriores como fallos distintos salvo que sus avisos demuestren una causa raíz común.
- ✓Aplica la recomendación de parche del proveedor Progress a todas las instancias de MOVEit Transfer; inventaría cada instancia y registra la versión corregida antes de restablecer la exposición habitual.[1]
- ✓Si sospechas una explotación, investiga el host antes de devolverlo al servicio: busca LEMURLOOT y cuentas afectadas y luego cambia las credenciales o secretos que pudieran haberse expuesto.[3]
- ✓Orientación de FlawOpen: pregunta a los proveedores de transferencia qué sistemas almacenaron tus datos y usa ese inventario para delimitar las notificaciones y la respuesta al incidente.
- ✓Orientación de FlawOpen: define la retención según la sensibilidad de los datos y la necesidad contractual, y verifica su eliminación; así limitas la exposición sin suponer cuánto tiempo conservaron datos las víctimas de MOVEit.
Fuentes
- Progress — vulnerabilidad crítica en MOVEit Transfer (31 de mayo de 2023)
- CISA y FBI — aviso AA23-158A: la banda de ransomware CL0P explota CVE-2023-34362
- Mandiant — vulnerabilidad zero-day en MOVEit Transfer explotada para robar datos
- CVE-2023-34362 — registro CVE
- MITRE CWE-89
- Inyección SQL — referencia completa de la clase en 11 lenguajes
- ¿Los procedimientos almacenados evitan la inyección SQL?
- CVE-2025-1094: cuando la propia función de escape era la vulnerabilidad
- Catálogo KEV de CISA — CVE-2023-34362