Vulnerabilidad en la biblioteca estándar de Rust

Se ha identificado una vulnerabilidad (CVE-2022-21658) en la biblioteca estándar de Rust debido a una condición de carrera en la función std::fs::remove_dir_all(). Si esta función se utiliza para eliminar archivos temporales en una aplicación privilegiada, un atacante puede eliminar archivos y directorios arbitrarios del sistema que normalmente no tendría acceso para eliminar.

La vulnerabilidad se debe a la implementación incorrecta de la verificación de enlaces simbólicos antes de eliminar directorios de forma recursiva. En lugar de evitar que se sigan los enlaces simbólicos, remove_dir_all() primero verifica si el archivo es un enlace simbólico. Si se define un enlace, se elimina como un archivo y, si es un directorio, se llama a una operación de eliminación de contenido recursiva. El problema es que hay un ligero retraso entre la verificación y el inicio de la operación de eliminación.

En un momento en que la verificación ya se ha realizado, pero la operación de enumerar directorios para su eliminación aún no ha comenzado, el atacante puede reemplazar el directorio con archivos temporales con un enlace simbólico. Si llega en el momento adecuado, la función remove_dir_all() tratará el enlace simbólico como un directorio y comenzará a eliminar el contenido al que apunta el enlace. A pesar de que el éxito del ataque depende de la precisión del momento elegido para reemplazar el directorio y es poco probable que llegue al momento correcto la primera vez, durante los experimentos los investigadores pudieron lograr un ataque exitoso repetible después de ejecutar el exploit dentro de unos pocos segundos.

Todas las versiones de Rust desde la 1.0.0 hasta la 1.58.0 inclusive se ven afectadas. El problema se ha resuelto en forma de parche por ahora (la solución se incluirá en la versión 1.58.1, que se espera dentro de unas horas). Puedes monitorear la eliminación de la vulnerabilidad en distribuciones en estas páginas: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Se recomienda a todos los usuarios de programas Rust que se ejecuten con privilegios elevados y utilicen la función remove_dir_all que actualicen urgentemente Rust a la versión 1.58.1. Curiosamente, el parche lanzado no resuelve el problema en todos los sistemas; por ejemplo, en REDOX OS y versiones de macOS anteriores a 10.10 (Yosemite), la vulnerabilidad no se bloquea debido a la ausencia del indicador O_NOFOLLOW, que deshabilita el seguimiento simbólico. Enlaces.

Fuente: opennet.ru

Añadir un comentario