Lanzamiento de Rust 1.98.0. Compromiso del paquete arrayref, que ha tenido 53 millones de descargas en 3 meses.

Se ha publicado la versión 1.98 del lenguaje de programación Rust, que fue creado por Mozilla y ahora se desarrolla bajo la tutela de la organización sin fines de lucro Rust Foundation. El lenguaje está enfocado en el trabajo seguro con memoria y proporciona herramientas para lograr un alto paralelismo en la ejecución de tareas, todo sin la necesidad de un recolector de basura y un tiempo de ejecución (runtime que se limita a la inicialización básica y el mantenimiento de la biblioteca estándar).

Los métodos de manejo de memoria en Rust están diseñados para eliminar errores al manipular punteros y protegerse de problemas que surgen del trabajo de bajo nivel con la memoria, como acceder a la memoria después de que se ha liberado, desreferenciar punteros nulos, desbordar búferes, etc. Para la distribución de bibliotecas, la construcción y la gestión de dependencias, se desarrolla el gestor de paquetes Cargo. Para el alojamiento de bibliotecas, se soporta el repositorio crates.io.

La seguridad en el manejo de la memoria se garantiza en Rust en tiempo de compilación a través de la verificación de referencias, el seguimiento de la propiedad de los objetos, la gestión de tiempos de vida de objetos (ámbitos) y la evaluación de la corrección del acceso a la memoria durante la ejecución del código. Rust también ofrece herramientas para protegerse contra desbordamientos enteros, requiere la inicialización obligatoria de los valores de las variables antes de su uso, maneja mejor los errores en la biblioteca estándar, aplica el concepto de inmutabilidad de referencias y variables por defecto, y ofrece una fuerte tipificación estática para minimizar errores lógicos.

Novedades principales:

  • Para los tipos de punto flotante f32 y f64 se implementan métodos algebraicos para suma, resta, multiplicación, división y cálculo de resto, que realizan optimizaciones similares a la opción «-ffast-math» en los compiladores C/C++. Tales métodos permiten cambiar el orden de las operaciones cuando es necesario para optimizaciones, como la vectorización de bucles. Por ejemplo, al calcular «a + b + c + d» utilizando la suma convencional, el compilador siempre realizará el cálculo en un solo orden «((a + b) + c) + d», mientras que utilizando el método algebraic_add puede reagrupar la expresión como «(a + b) + (c + d)» y realizar «(a + b)» y «(c + d)» en paralelo utilizando instrucciones SIMD. El costo de usar los métodos algebraicos es la indeterminación de los resultados, que pueden variar dentro de un margen de error.
  • Para todos los tipos primitivos enteros se ha implementado un método incorporado «format_into» para convertir números en cadenas, que puede utilizarse en lugar del paquete itoa. Se pasa como parámetro un búfer NumBuffer, cuyo tamaño está garantizado para ser suficiente para escribir cualquier valor del tipo utilizado en formato decimal. El resultado devuelto es una cadena formateada &str, cuya vida útil está vinculada al búfer.
  • La interacción entre el contenedor ManuallyDrop y el puntero inteligente Box ya no conduce a un comportamiento indefinido.
  • Se ha trasladado un nuevo lote de API a la categoría estable, incluyendo la estabilización de métodos e implementaciones de traits:
    • str::substr_range
    • [T]::subslice_range
    • core::fmt::NumBuffer
    • ::format_into
    • Send/Sync para std::process::CommandArgs
    • {fN}::algebraic_add
    • {fN}::algebraic_sub
    • {fN}::algebraic_mul
    • {fN}::algebraic_div
    • {fN}::algebraic_rem
    • NonZero::from_str_radix
    • String::from_utf16le
    • String::from_utf16le_lossy
    • String::from_utf16be
    • String::from_utf16be_lossy
    • [T]::strip_circumfix
    • str::strip_circumfix
    • Atomic::from_mut
    • Atomic::get_mut_slice
    • Atomic::from_mut_slice
    • std::range::legacy
  • Las plataformas de destino thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf y thumbv8r-none-eabihf han sido trasladadas al segundo nivel de soporte, que implica garantía de compilación, pero sin garantías en la ejecución de pruebas.
  • Se ha añadido soporte para las plataformas powerpc64-unknown-linux-gnuelfv2 y aarch64-unknown-linux-pauthtest, para las que se ofrece un tercer nivel de soporte. Este tercer nivel incluye soporte básico, pero sin pruebas automatizadas, publicación de compilaciones oficiales y verificación de la capacidad de compilación del código.

También se menciona la compromisión del popular paquete crate arrayref, que ha tenido más de 53 millones de descargas en los últimos 90 días y es utilizado como dependencia por 403 paquetes. Los atacantes publicaron en el repositorio crates.io nuevos paquetes proc-macro1, proc-macro-en, aovine, arone, aronenao y tinymember, que contienen código malicioso. Posteriormente, en el repositorio se publicaron nuevas versiones de los paquetes arrayref 0.3.10, internment 0.8.7 y append-only-vec 0.1.9, en las que se añadió el paquete malicioso proc-macro1 como dependencia. La versión maliciosa del paquete arrayref fue publicada el 20 de agosto a las 10:15 (MSK) y estuvo activa hasta las 11:41, después de lo cual fue eliminada por los administradores de crates.io.

No se ha podido contactar con el mantenedor de arrayref para aclarar la situación, pero se supone que sus credenciales fueron interceptadas por atacantes. El paquete proc-macro1 contenía un cambio malicioso en el script de compilación que descargaba un archivo ejecutable desde un externo. servidoresEl archivo descargado en sistemas Unix se guardaba como /tmp/rust-setup, y en Windows como %TEMP%\rust-setup.ps1 o %TEMP%\rust-setup-launch.vbs.

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster