¿Qué es la vulnerabilidad CVE-2023-36049?
CVE-2023-36049 es una falla en los componentes System.Net.WebRequest y System.Net.FtpWebRequest del framework .NET.
En concreto, es una vulnerabilidad de inyección de comandos FTP. Si una aplicación acepta un URI proporcionado por el usuario y lo usa para conectarse a un servidor FTP, el framework .NET no validaba correctamente la entrada en busca de caracteres especiales, específicamente retorno de carro (CR) y salto de línea (LF).
Al inyectar estos caracteres, un atacante puede agregar comandos FTP completamente nuevos a la sesión, ejecutando acciones que el desarrollador de la aplicación nunca pretendió, como eliminar archivos o subir malware.
¿Cuándo se descubrió?
La vulnerabilidad se divulgó públicamente y Microsoft la parchó el 14 de noviembre de 2023 (Patch Tuesday). Fue reportada por Piotr Bazydło de la Zero Day Initiative (ZDI) de Trend Micro.
Productos y versiones afectados
Esta vulnerabilidad es generalizada y afecta a casi todas las versiones compatibles de .NET al momento de la divulgación.
Producto | Versiones afectadas | Versiones corregidas / enlaces de parches |
.NET Framework | 3.5, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1 | |
.NET Core / .NET | .NET 6.0, 7.0, 8.0 (RC2) | |
Visual Studio | 2022 (v17.2, 17.4, 17.6, 17.7) | Visual Studio 2022 v17.8+ |
Descripción técnica de CVE-2023-36049
La vulnerabilidad existe en el método FormatFtpCommand dentro de System.Net.FtpControlStream. Este método se encarga de formatear los comandos enviados a un servidor FTP.
En una transacción FTP estándar, los comandos terminan con una secuencia CRLF (\r\n). La vulnerabilidad surge porque el componente .NET afectado no verificaba si los parámetros que recibía ya contenían caracteres CRLF.
Un atacante puede explotar esto proporcionando un URI malicioso. Por ejemplo, si una app se conecta a ftp://server.com/path/file, un atacante podría ingresar:
ftp://server.com/path/file%0d%0aDELE%20important.config
Cuando la aplicación procesa esto, el %0d%0a se decodifica como un CRLF, dividiendo en la práctica el comando único en dos:
El comando original (inofensivo).
Un nuevo comando malicioso (DELE important.config) que el servidor FTP ejecuta de inmediato.
Tácticas, técnicas y procedimientos (TTPs)
Los atacantes que explotan CVE-2023-36049 generalmente siguen este patrón:
Reconocimiento: Identificar aplicaciones web o servicios que aceptan entradas del usuario (como una URL) y realizan operaciones FTP en el backend (por ejemplo, funciones de "importar desde URL").
Explotación: Enviar un URI manipulado que contenga caracteres CRLF codificados en URL (%0d%0a) seguidos de comandos FTP maliciosos.
Escalada de privilegios / impacto:
Escritura arbitraria de archivos: Inyectar comandos STOR para subir web shells o binarios maliciosos al servidor FTP.
Eliminación arbitraria de archivos: Inyectar comandos DELE para eliminar archivos de configuración o archivos de registro críticos.
Cambios de permisos: Inyectar comandos CHMOD o similares para debilitar los permisos de archivos.
Indicadores de compromiso
Detectar esta actividad requiere revisar tanto los registros de la aplicación como el tráfico de red:
Firmas de red: Los sistemas de detección de intrusiones (IDS) pueden marcar paquetes FTP que contienen varios comandos en una sola secuencia, o comandos inesperados como DELE o STOR provenientes de una aplicación que solo debería leer archivos (RETR).
Registros de la aplicación: Busca registros de error en System.Net que indiquen "Protocol Violation" o "CRLF found in header" si los intentos de inyección fallan o se detectan parcialmente.
Registros del servidor FTP: Secuencias inusuales de comandos provenientes de la dirección IP del servidor de tu aplicación .NET.
Pruebas de concepto y exploits conocidos
La Zero Day Initiative (ZDI) publicó análisis técnicos y exploits de prueba de concepto (PoC) poco después del parche.
Estos PoC demuestran cómo usar la clase System.Net.WebRequest para eliminar archivos en un servidor FTP objetivo sin autenticación (si la app se conecta de forma anónima) o usando las credenciales almacenadas de la app. Aunque actualmente no figura en el catálogo de vulnerabilidades explotadas conocidas (KEV) de CISA, la disponibilidad de PoC la convierte en un objetivo viable para los atacantes.
¿Cómo detectar la vulnerabilidad CVE-2023-36049?
Escaneo de vulnerabilidades: Usa herramientas como Tenable Nessus (Plugin ID 185887) o Microsoft Defender para identificar runtimes e instalaciones de .NET Framework que no hayan recibido la actualización de noviembre de 2023.
Revisión de código: Revisa tu propio código base en busca del uso de WebRequest.Create o FtpWebRequest donde el URI se construya usando entrada del usuario no validada.
Impacto y riesgo de la vulnerabilidad CVE-2023-36049
El impacto se califica de alto a crítico (CVSS 8.8 - 9.8).
Si un atacante explota esto con éxito, puede manipular archivos en el servidor FTP del backend con los mismos privilegios que la aplicación. Esto podría derivar en:
Ejecución remota de código (RCE): Si el atacante sube un script malicioso (por ejemplo, .aspx, .php) a un directorio accesible mediante el servidor web.
Pérdida de datos: Eliminación de datos empresariales críticos.
Interrupción del servicio: Corrupción de archivos de configuración de la aplicación.
Estrategias de mitigación y remediación
No existe una solución alternativa; aplicar el parche es obligatorio.
Aplicar actualizaciones de seguridad: Instala de inmediato el paquete de seguridad y calidad de Microsoft .NET Framework de noviembre de 2023. Esta actualización modifica System.Net para sanitizar correctamente la entrada y rechazar caracteres CRLF en los parámetros FTP.
Sanitizar la entrada: Como medida de defensa en profundidad, los desarrolladores deben validar todos los URI proporcionados por el usuario para asegurarse de que cumplan con los formatos esperados y no contengan caracteres de control como \r o \n antes de pasarlos a las clases de red de .NET.
Privilegio mínimo: Asegúrate de que las credenciales que usa tu aplicación para conectarse a servidores FTP tengan los permisos mínimos necesarios (por ejemplo, acceso de solo lectura si la app solo necesita descargar archivos).