← Últimos artículos
💻 computer science

RustGo: Fairly Directed Greybox Fuzzing for Enforcing Rust Memory Safety

RustGo es un nuevo fuzzer de caja gris dirigido que aprovecha el análisis estático específico de Rust para identificar automáticamente posibles objetivos de errores de memoria y podar rutas de ejecución irrelevantes, mejorando así significativamente la eficiencia del fuzzing y descubriendo vulnerabilidades desconocidas en código Rust inseguro en comparación con los enfoques existentes.

Autores originales: Dongyeon Yu (Korea University), Jiun Min (Korea University), Yewan Na (Ulsan National Institute of Science and Technology), Mijung Kim (Ulsan National Institute of Science and Technology), Taegyu Kim
Publicado 2026-08-07
📖 7 min de lectura🧠 Análisis profundo

Autores originales: Dongyeon Yu (Korea University), Jiun Min (Korea University), Yewan Na (Ulsan National Institute of Science and Technology), Mijung Kim (Ulsan National Institute of Science and Technology), Taegyu Kim (The Pennsylvania State University), Yuseok Jeon (Korea University)

Artículo original bajo licencia CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Esta es una explicación generada por IA del artículo a continuación. No ha sido escrita ni avalada por los autores. Para mayor precisión técnica, consulte el artículo original. Leer descargo de responsabilidad completo

Imagina que eres un detective intentando encontrar un fallo diminuto y único en una ciudad enorme y bulliciosa. En el mundo del software informático, este programa es una ciudad, y el fallo es un "error de memoria" (memory bug): un error donde el programa intenta tomar, usar o desechar datos que no debería, provocando que se bloquee o sea hackeado. Durante décadas, la forma más popular de encontrar estos errores ha sido el "fuzzing". Piensa en el fuzzing como lanzar millones de bolas de nieve aleatorias y caóticas contra las murallas de la ciudad para ver si alguna rompe una ventana. Normalmente, esto funciona bien para los lenguajes antiguos, pero hay un inconveniente: es increíblemente ineficiente. Podrías lanzar 99 bolas de nieve contra la puerta principal, robusta e inquebrantable, solo para encontrar la única ventana débil en un callejón trasero.

Entra Rust, un lenguaje de programación moderno que actúa como un guardia de seguridad súper estricto. Las reglas de Rust son tan buenas que el 90% de la ciudad que construye es prácticamente a prueba de balas; el guardia asegura que la mayoría de las "ventanas" (áreas de memoria) estén cerradas con llave por defecto. Sin embargo, para construir ciertas cosas complejas, Rust permite a los desarrolladores abrir una pequeña y especial puerta llamada "código inseguro" (unsafe code). Este es el único lugar donde las reglas estrictas se relajan, y es el único lugar donde un error de memoria puede esconderse. El problema es que las herramientas de "lanzamiento de bolas de nieve" existentes no saben esto. Siguen lanzando bolas de nieve al 90% de la ciudad que ya es segura, desperdiciando tiempo y energía, mientras pasan por alto los pocos puntos peligrosos detrás de la puerta especial. Este artículo presenta una nueva herramienta de detective llamada RustGo que cambia las reglas del juego al saber exactamente dónde lanzar las bolas de nieve.

El Detective Inteligente: RustGo

Los investigadores detrás de este artículo, un equipo de la Universidad de Corea y otras instituciones, se dieron cuenta de que lanzar bolas de nieve aleatoriamente a un programa de Rust es como intentar encontrar una aguja en un pajar quemando todo el pajar. Dado que Rust garantiza la seguridad de la mayor parte de su código, se preguntaron: ¿Por qué probar las partes seguras? Construyeron RustGo, un "fuzzer de caja gris dirigido" (directed greybox fuzzer) que actúa como un detective con un mapa y una lupa, en lugar de una persona con los ojos vendados lanzando piedras.

RustGo funciona en tres pasos ingeniosos para cazar errores de manera eficiente:

1. Encontrar los Objetivos Adecuados (El Mapa)
Primero, RustGo escanea el código para encontrar las zonas "inseguras" donde podrían esconderse los errores. Pero no solo adivina. Utiliza un tipo especial de análisis para observar cómo fluyen los datos a través del programa. Imagina que la ciudad tiene muchos callejones, pero algunos conducen a callejones sin salida o bucles que nunca ocurren en la vida real. RustGo los filtra. Identifica los puntos específicos donde un error de memoria podría activarse y luego fusiona los puntos similares. Si dos caminos diferentes en el código conducen exactamente al mismo resultado peligroso, RustGo los trata como uno solo, para no perder tiempo comprobando lo mismo dos veces. En sus pruebas, este paso les ayudó a reducir el número de objetivos que necesitaban comprobar en aproximadamente un 84%, centrándose solo en las áreas verdaderamente sospechosas.

2. Cortar los Callejones sin Salida (La Lupa)
Una vez que RustGo sabe dónde mirar, debe ignorar el resto de la ciudad. En las herramientas de fuzzing antiguas, el "mapo" de la ciudad a menudo incluía la biblioteca estándar (las herramientas preconstruidas que usa Rust), que es enorme y está llena de rutas que parecen alcanzables pero que en realidad no lo son. Esto confundía a las herramientas, haciendo que exploraran áreas inútiles. RustGo introdujo un nuevo truco llamado "poda de rutas específica del objetivo" (target-specific path pruning). Es como tener una valla mágica que hace desaparecer instantáneamente cualquier camino que no conduzca al objetivo específico que estás investigando en ese momento. Si el detective está buscando un error en la panadería, la valla bloquea los caminos hacia la biblioteca o el parque, incluso si esos caminos técnicamente existen en la ciudad. Esto permitió a RustGo cortar el 78.49% de las rutas irrelevantes que otras herramientas perderían tiempo explorando.

3. Jugar Limpio (La Estrategia Round-Robin)
Aquí llega el giro final y crucial. Cuando un detective tiene múltiples sospechosos (objetivos) que revisar, las herramientas antiguas a menudo se obsesionan con el más fácil de alcanzar, ignorando los más difíciles. RustGo utiliza un sistema de "conmutación dinámica justa" (dynamic fair toggling). Imagina a un árbitro que cambia la atención del detective entre los sospechosos en una rotación perfecta. Si el detective pasa demasiado tiempo con el Sospechoso A, el árbitro inmediatamente lo cambia al Sospechoso B, asegurando que cada sospechoso reciba una cantidad justa de atención. RustGo hace esto asignando a cada objetivo su propia "cola" de bolas de nieve y su propio "tarjetero de puntuación" para rastrear el progreso. Esto asegura que ningún punto peligroso quede sin probar solo por ser ligeramente más difícil de alcanzar.

Los Resultados: Más Rápido y Más Inteligente

El equipo probó RustGo en 13 aplicaciones de Rust del mundo real, que van desde servidores web hasta herramientas de procesamiento de datos. Compararon RustGo con las mejores herramientas existentes, incluyendo la famosa AFL++ y varios fuzzers "dirigidos" especializados. Los resultados fueron impactantes.

Debido a que RustGo dejó de perder el tiempo en el 90% de código seguro y se centró puramente en el 10% peligroso, encontró vulnerabilidades de 2.09 a 5.08 veces más rápido que las otras herramientas. En algunos casos, como en la aplicación gimli, fue más de 10 veces más rápido. Para poner esto en perspectiva, si una herramienta antigua tardara 10 horas en encontrar un error, RustGo lo encontró en menos de una hora.

Pero la velocidad no es la única victoria. El equipo utilizó RustGo para cazar errores en el mundo real, no solo en su laboratorio de pruebas. Descubrieron 13 errores de memoria previamente desconocidos en software del mundo real. De estos, 10 fueron confirmados por los desarrolladores del software, y 8 ya han sido corregidos. Aún más impresionante, 6 de estos errores recibieron IDs de seguridad oficiales (RUSTSEC), y uno recibió un ID CVE, que es el estándar global para rastrear fallos de seguridad graves. Esto demuestra que RustGo no es solo una idea teórica; es una herramienta práctica que ya está haciendo el software más seguro.

Por Qué Esto Importa

Este artículo no solo sugiere que RustGo es una buena idea; lo mide, lo demuestra y muestra cómo encuentra errores reales que otros pasaron por alto. Argumenta explícitamente en contra de la vieja forma de pensar: que debemos probar cada línea de código para estar seguros. En su lugar, muestra que, al comprender las reglas únicas de Rust, podemos ser más inteligentes, más rápidos y más efectivos.

Los investigadores también abordaron una preocupación común: "¿Qué pasa si nos perdemos un error al ignorar las partes seguras?". Explican que las reglas de seguridad de Rust son tan estrictas que los errores de memoria espacial (como acceder a la dirección de memoria incorrecta) simplemente no pueden ocurrir en las partes seguras del código. Por lo tanto, ignorarlas no crea un punto ciego; simplemente elimina el ruido. Para los errores temporales (usar la memoria después de haber sido liberada), RustGo es cuidadoso para asegurar que no poda accidentalmente un camino que podría conducir a un error, utilizando un enfoque "conservador" que mantiene la red de seguridad lo suficientemente amplia como para atraparlo todo.

Al final, RustGo es un testimonio del poder de la especialización. Así como un maestro chef no usa un martillo para romper una nuez, un fuzzer moderno no debería usar un instrumento romo en un lenguaje tan sofisticado como Rust. Al adaptar el enfoque a las fortalezas y debilidades únicas del lenguaje, los autores han creado una herramienta que no solo es más rápida, sino también más justa, asegurando que cada peligro potencial en el código reciba la atención que merece.

¿Ahogado en artículos de tu campo?

Recibe resúmenes diarios de los artículos más novedosos que coincidan con tus palabras clave de investigación — con resúmenes técnicos, en tu idioma.

Probar Digest →