Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

Vulnerabilidad en Rust (CVE-2024-24576)

Gravedad CVSS v3.1:
CRÍTICA
Tipo:
CWE-78 Neutralización incorrecta de elementos especiales usados en un comando de sistema operativo (Inyección de comando de sistema operativo)
Fecha de publicación:
09/04/2024
Última modificación:
05/01/2026

Descripción

Rust es un lenguaje de programación. Se notificó al Grupo de Trabajo de Respuesta de Seguridad de Rust que la librería estándar de Rust anterior a la versión 1.77.2 no escapaba correctamente a los argumentos al invocar archivos por lotes (con las extensiones `bat` y `cmd`) en Windows usando el `Comando`. Un atacante capaz de controlar los argumentos pasados al proceso generado podría ejecutar comandos de shell arbitrarios evitando el escape. La gravedad de esta vulnerabilidad es crítica para quienes invocan archivos por lotes en Windows con argumentos que no son de confianza. Ninguna otra plataforma o uso se ve afectado. Las API `Command::arg` y `Command::args` establecen en su documentación que los argumentos se pasarán al proceso generado tal cual, independientemente del contenido de los argumentos, y no serán evaluados por un shell. Esto significa que debería ser seguro pasar entradas que no sean de confianza como argumento. En Windows, la implementación de esto es más compleja que en otras plataformas, porque la API de Windows solo proporciona una única cadena que contiene todos los argumentos del proceso generado, y depende del proceso generado dividirlos. La mayoría de los programas utilizan el argv estándar en tiempo de ejecución de C, que en la práctica da como resultado una forma mayoritariamente consistente de dividir los argumentos. Sin embargo, una excepción es `cmd.exe` (utilizado, entre otras cosas, para ejecutar archivos por lotes), que tiene su propia lógica de división de argumentos. Eso obliga a la librería estándar a implementar un escape personalizado para los argumentos pasados a archivos por lotes. Desafortunadamente, se informó que nuestra lógica de escape no era lo suficientemente exhaustiva y era posible pasar argumentos maliciosos que darían como resultado una ejecución arbitraria del shell. Debido a la complejidad de `cmd.exe`, no identificamos una solución que escapara correctamente de los argumentos en todos los casos. Para mantener nuestras garantías de API, mejoramos la solidez del código de escape y cambiamos la API `Command` para que devuelva un error [`InvalidInput`][4] cuando no puede escapar de forma segura de un argumento. Este error se emitirá al generar el proceso. La solución está incluida en Rust 1.77.2. Tenga en cuenta que la nueva lógica de escape para archivos por lotes es conservadora y podría rechazar argumentos válidos. Aquellos que implementan el escape ellos mismos o solo manejan entradas confiables en Windows también pueden usar el método `CommandExt::raw_arg` para evitar la lógica de escape de la librería estándar.

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:fedoraproject:fedora:38:*:*:*:*:*:*:*
cpe:2.3:o:fedoraproject:fedora:39:*:*:*:*:*:*:*
cpe:2.3:o:fedoraproject:fedora:40:*:*:*:*:*:*:*
cpe:2.3:a:rust-lang:rust:*:*:*:*:*:*:*:* 1.77.2 (excluyendo)
cpe:2.3:o:microsoft:windows:-:*:*:*:*:*:*:*


Referencias a soluciones, herramientas e información