Los actores de amenazas pueden explotar una vulnerabilidad de seguridad en la biblioteca estándar Rust para atacar sistemas Windows en ataques de inyección de comandos.
Rastreado como CVE-2024-24576, este fallo se debe a debilidades en la inyección de comandos y argumentos del sistema operativo que pueden permitir a los atacantes ejecutar comandos inesperados y potencialmente maliciosos en el sistema operativo.
GitHub ha clasificado esta vulnerabilidad como crítica con una puntuación CVSS base máxima de 10/10. Los atacantes no autenticados pueden explotarla de forma remota, en ataques de baja complejidad y sin interacción del usuario.
«El grupo de trabajo Rust Security Response ha sido informado de que la biblioteca estándar de Rust no escapa correctamente de los argumentos cuando se invocan archivos por lotes (con las extensiones bat y cmd) en Windows utilizando la API de comandos», dijo el grupo de trabajo Rust Security Response.
«Un atacante capaz de controlar los argumentos pasados al proceso creado podría ejecutar comandos de shell arbitrarios saltándose el escape. La gravedad de esta vulnerabilidad es crítica si se invocan archivos por lotes en Windows con argumentos no confiables. No afecta a otras plataformas o usos».
Todas las versiones de Rust anteriores a la 1.77.2 en Windows se ven afectadas si el código de un programa o una de sus dependencias invoca y ejecuta archivos por lotes con argumentos que no son de confianza.
El equipo de seguridad de Rust se enfrentó a un gran reto ante la complejidad de cmd.exe, ya que no fue capaz de encontrar una solución que escapara correctamente de los argumentos en todos los casos.
Como resultado, tuvo que mejorar la robustez del código de escape y modificar la API de comandos. Si la API de control no puede escapar de forma segura un argumento al lanzar el proceso, devuelve un error InvalidInput.
«Si implementas el escape tú mismo o sólo procesas entradas de confianza, también puedes utilizar el método CommandExt::raw_arg en Windows para eludir la lógica de escape de la biblioteca estándar», añadió el GT de respuesta de seguridad de Rust.
El ingeniero de Flatt Security Ryotak, que descubrió la vulnerabilidad y la bautizó como BatBadBut, afirma que el fallo también afecta a los siguientes lenguajes de programación, aunque no todos ellos han publicado parches:
- Erlang (actualización de la documentación)
- Go (documentación actualizada)
- Haskell (parche disponible)
- Java (no se corregirá)
- Node.js (estará disponible un parche)
- PHP (estará disponible un parche)
- Python (actualización de la documentación)
- Ruby (actualización de la documentación)
«Para evitar la ejecución inesperada de archivos por lotes, debería considerar mover los archivos por lotes a un directorio que no esté incluido en la variable de entorno PATH», aconseja Ryotak.
«En este caso, los archivos por lotes no se ejecutarán a menos que se especifique la ruta completa, lo que ayuda a evitar la ejecución inesperada de archivos por lotes».
En febrero, la Oficina del Director Cibernético Nacional (ONCD) de la Casa Blanca instó a las empresas tecnológicas a adoptar lenguajes de programación seguros en memoria, como Rust. El objetivo final es mejorar la seguridad del software reduciendo el número de vulnerabilidades de seguridad de memoria.
Actualización: se ha añadido información sobre otros lenguajes de programación vulnerables.