¿Qué es Fuzzing?

que es fuzzing

Introducción: ¿Qué es Fuzzing?

En 2014, los piratas informáticos chinos pirateado en los sistemas de salud comunitarios, una cadena de hospitales estadounidense con fines de lucro, y robó los datos de 4.5 millones de pacientes. Los piratas informáticos aprovecharon un error llamado Heartbleed que se descubrió en la biblioteca de criptografía OpenSSL algunos meses antes del ataque.

Heartbleed es un ejemplo de una clase de vectores de ataque que permite a los atacantes acceder a un objetivo mediante el envío de solicitudes mal formadas lo suficientemente válidas como para pasar las comprobaciones preliminares. Si bien los profesionales que trabajan en diferentes partes de una aplicación hacen todo lo posible para garantizar su seguridad, es imposible pensar en todos los casos de esquina que podrían romper una aplicación o hacerla vulnerable durante el desarrollo.

Aquí es donde entra en juego el 'fuzzing'.

¿Qué es un ataque de fuzzing?

Fuzzing, fuzz testing o ataque fuzzing, es una técnica de prueba de software automatizada que se utiliza para introducir datos aleatorios, inesperados o no válidos (llamados fuzz) en un programa. El programa se supervisa en busca de comportamientos inusuales o inesperados, como desbordamientos de búfer, bloqueos, fugas de memoria, bloqueos de subprocesos y violaciones de acceso de lectura/escritura. A continuación, se utiliza la herramienta de fuzzing o fuzzer para descubrir la causa del comportamiento inusual.

Fuzzing se basa en la suposición de que todos los sistemas contienen errores que esperan ser descubiertos y se les puede dar suficiente tiempo y recursos para hacerlo. La mayoría de los sistemas tienen muy buenos analizadores o validación de entrada que evitan ciberdelincuentes de explotar cualquier error hipotético en un programa. Sin embargo, como mencionamos anteriormente, cubrir todos los casos de esquina durante el desarrollo es difícil.

Los fuzzers se utilizan en programas que aceptan entradas estructuradas o tienen algún tipo de límite de confianza. Por ejemplo, un programa que acepta archivos PDF tendría alguna validación para garantizar que el archivo tenga una extensión .pdf y un analizador para procesar el archivo PDF.

Un fuzzer efectivo puede generar entradas lo suficientemente válidas para superar estos límites pero lo suficientemente inválidas como para causar un comportamiento inesperado más adelante en el programa. Esto es importante porque el simple hecho de poder superar las validaciones no significa mucho si no se causan más daños.

Los fuzzers descubren vectores de ataque muy similares a, e incluyen, inyección de SQL, secuencias de comandos entre sitios, desbordamiento de búfer y ataques de denegación de servicio. Todos estos ataques son el resultado de introducir datos inesperados, no válidos o aleatorios en un sistema. 

 

Tipos de fuzzers

Los fuzzers se pueden clasificar en función de algunas características:

  1. Objetivos de ataque
  2. Método de creación de fuzz
  3. Conciencia de la estructura de entrada
  4. Conocimiento de la estructura del programa.

1. Objetivos de ataque

Esta clasificación se basa en el tipo de plataforma que se utiliza para probar el fuzzer. Los fuzzers se usan comúnmente con protocolos de red y aplicaciones de software. Cada plataforma tiene un tipo particular de entrada que recibe y, por lo tanto, requiere diferentes tipos de fuzzers.

Por ejemplo, cuando se trata de aplicaciones, todos los intentos de fuzzing ocurren en los diversos canales de entrada de la aplicación, como la interfaz de usuario, el terminal de línea de comandos, las entradas de formularios/texto y las cargas de archivos. Entonces, todas las entradas generadas por el fuzzer deben coincidir con estos canales.

Los fuzzers que se ocupan de los protocolos de comunicación tienen que ocuparse de los paquetes. Los fuzzers que se dirigen a esta plataforma pueden generar paquetes falsificados o incluso actuar como servidores proxy para modificar los paquetes interceptados y reproducirlos.

2. Método de creación de fuzz

Los fuzzers también se pueden clasificar en función de cómo crean datos con los que realizar fuzzers. Históricamente, los fuzzers creaban fuzz generando datos aleatorios desde cero. Así lo hizo inicialmente el profesor Barton Miller, iniciador de esta técnica. Este tipo de fuzzer se llama fuzzer basado en generación.

Sin embargo, aunque teóricamente se podrían generar datos que traspasarían un límite de confianza, llevaría mucho tiempo y recursos hacerlo. Por lo tanto, este método generalmente se usa para sistemas con estructuras de entrada simples.

Una solución a este problema es mutar los datos que se sabe que son válidos para generar datos lo suficientemente válidos para pasar un límite de confianza, pero lo suficientemente inválidos como para causar problemas. Un buen ejemplo de esto es un Fuzzer de DNS que toma un nombre de dominio y luego genera una gran lista de nombres de dominio para detectar dominios potencialmente maliciosos dirigidos al propietario del dominio especificado.

Este enfoque es más inteligente que el anterior y reduce significativamente las posibles permutaciones. Los fuzzers que usan este método se llaman fuzzers basados ​​en mutaciones

Hay un tercer método más reciente que hace uso de algoritmos genéticos para converger en los datos fuzz óptimos necesarios para erradicar las vulnerabilidades. Funciona refinando continuamente sus datos fuzz, teniendo en cuenta el rendimiento de cada dato de prueba cuando se introduce en un programa. 

Los conjuntos de datos con peor rendimiento se eliminan del grupo de datos, mientras que los mejores se mutan y/o combinan. La nueva generación de datos se usa luego para realizar pruebas de fuzz nuevamente. Estos fuzzers se conocen como fuzzers evolutivos basados ​​en mutaciones.

3. Conocimiento de la estructura de entrada

Esta clasificación se basa en si un fuzzer conoce y utiliza activamente la estructura de entrada de un programa para generar datos fuzz. A fuzzer tonto (un fuzzer que desconoce la estructura de entrada de un programa) genera fuzz de forma mayoritariamente aleatoria. Esto podría incluir fuzzers basados ​​tanto en la generación como en la mutación. 


Si se proporciona un fuzzer con el modelo de entrada de un programa, el fuzzer puede intentar generar o mutar datos para que coincidan con el modelo de entrada proporcionado. Este enfoque reduce aún más la cantidad de recursos gastados en la generación de datos no válidos. Tal fuzzer se llama fuzzer inteligente.

4. Conocimiento de la estructura del programa

Los fuzzers también se pueden clasificar en función de si conocen el funcionamiento interno del programa que están fuzzeando y usan ese conocimiento para ayudar a generar datos fuzzers. Cuando se utilizan fuzzers para probar un programa sin comprender su estructura interna, se denomina prueba de caja negra. 

Los datos de fuzz generados durante las pruebas de caja negra suelen ser aleatorios, a menos que el fuzzer sea un fuzzer evolutivo basado en mutaciones, donde 'aprende' al monitorear el efecto de su fuzzing y usar ese información para refinar su conjunto de datos fuzz.

Las pruebas de caja blanca, por otro lado, utilizan un modelo de la estructura interna del programa para generar datos fuzz. Este enfoque permite que un fuzzer llegue a ubicaciones críticas en un programa y lo pruebe. 

Herramientas populares de fuzzing

Hay muchos fuzzing por ahí utilizado por los probadores de pluma. Algunos de los más populares son:

Limitaciones de Fuzzing

Si bien Fuzzing es una técnica de prueba de penetración realmente útil, no está exenta de fallas. Algunos de estos son:

  • Tarda bastante en ejecutarse.
  • Los bloqueos y otros comportamientos inesperados que se encuentran durante las pruebas de caja negra de un programa pueden ser difíciles, si no imposibles, de analizar o depurar.
  • La creación de plantillas de mutación para fuzzers inteligentes basados ​​en mutaciones puede llevar mucho tiempo. A veces, puede que ni siquiera sea posible debido a que el modelo de entrada es propietario o desconocido.

 

Sin embargo, es una herramienta bastante útil y necesaria para cualquiera que quiera descubrir los errores antes que los malos.

Conclusión

Fuzzing es una poderosa técnica de prueba de penetración que se puede usar para descubrir vulnerabilidades en el software. Hay muchos tipos diferentes de fuzzers, y constantemente se desarrollan nuevos fuzzers. Si bien el fuzzing es una herramienta increíblemente útil, tiene sus limitaciones. Por ejemplo, los fuzzers solo pueden encontrar ciertas vulnerabilidades y pueden consumir muchos recursos. Sin embargo, si quieres probar esta increíble técnica por ti mismo, tenemos una DNS Fuzzer API gratuito que puede usar en nuestra plataforma. 

¿Entonces, qué esperas? 

¡Empieza a fuzzear hoy!