¿Rust es realmente seguro?
¿C++ de verdad no es tan seguro?
Vi una presentación en YouTube sobre un tema interesante y quise compartirla.
Si tradujéramos el título, sonaría más o menos como: “decir que hay que usar un lenguaje con seguridad de memoria no es un problema tan simple”.
El ponente expresa sus ideas desde una postura relativamente justa, sin inclinarse demasiado hacia un solo lado.
- Rust evita la ejecución de código sin seguridad de memoria mediante
panic, pero el “Rust inseguro” puede eludir estas protecciones. - Sin embargo,
unsafe Rustrequiere un opt-in explícito, por lo que destaca más que el C/C++ inseguro. Esa parte se puede revisar con mayor atención. - Aproximadamente el 30% de los crates de Rust usan código inseguro, y en sistemas embebidos se usa el doble.
- Los sanitizers (herramientas de análisis dinámico) pueden detectar errores de memoria tanto en código Rust como en C/C++.
- El 70% de los desarrolladores de Rust llama código inseguro a través de FFI (interfaz de funciones externas) hacia bibliotecas C/C++.
- Muchas bibliotecas importantes que también se usan en proyectos Rust están escritas en C/C++ (SQLite, bibliotecas OPCUA).
- Los sanitizers pueden analizar tanto código Rust como C/C++ en la capa de LLVM IR cuando se dispone del código fuente.
- Miri es una herramienta complementaria para detectar comportamiento indefinido de Rust en la representación intermedia.
- Ventajas de Miri: proporciona errores claros y verifica todo el comportamiento indefinido al mismo tiempo. Limitaciones: no puede interpretar código C/C++.
- Aproximadamente el 20% de las funciones de la biblioteca estándar de Rust usan código inseguro.
- La infraestructura crítica necesita no solo código con seguridad de memoria, sino también código correcto para evitar daños materiales o amenazas a la vida.
- Incluso los programas Rust seguros pueden fallar o ser vulnerables a ataques de denegación de servicio.
- Las pruebas basadas en propiedades pueden ayudar generando entradas aleatorias para encontrar casos límite, pero tienen dificultades con errores imposibles.
- Kani es un model checker que usa matemáticas para verificar la corrección de un programa dentro de ciertas restricciones.
- Ventajas de Kani: evalúa matemáticamente todas las entradas dentro de las restricciones. Limitaciones: hay que desenrollar los bucles y no soporta concurrencia ni FFI de C/C++.
- Conclusión sobre Rust: Rust es seguro, pero no tanto como uno podría pensar.
- Bjarne Stroustrup distingue entre C y C++, y menciona que C++ fue diseñado para lograr código más seguro.
- Las C++ Core Guidelines ofrecen perfiles de seguridad de tipos, seguridad de límites y seguridad de vida útil para acercarse a las garantías de Rust.
- El mayor problema de C++ es que, por defecto, es demasiado fácil escribir código inseguro. No es que los desarrolladores no se esfuercen.
Aún no hay comentarios.