Fuzzers de Mutación

  • Posted on: 9 January 2019
  • By: ReYDeS

Los fuzzers basados en mutación, también denominados como fuzzers “tontos”, son la variante más simple y cercana hacia la idea original de aleatorizar los datos de entrada. Este nombre proviene de cambiar (mutar) los datos de entrada, usualmente hecho de una manera aleatoria. Los datos mutados son luego utilizados como entrada para el software en evaluación, con el propósito de intentar o generar una caída en el software.

Los fuzzers de mutación usualmente tienen dos parámetros los cuales pueden se ajustados:

Segmentos de mutación. Estas son partes o secciones de los datos a modificar durante el Fuzzing. Puede ser la modificación completa de datos, en el cual todas las partes del archivo son tratados igualmente, y podrían ser modificados durante las pruebas. No todos los segmentos de datos son igualmente importantes, por lo cual es una buen idea saltar el Fuzzing en ciertas partes del archivo. Los formatos de archivos usualmente tienen valores mágicos los cuales distinguen el tipo de archivo. Estos valores mágicos pueden tener varios bytes de longitud y estar localizados al inicio del archivo. El Fuzzing y modificar aleatoriamente estas partes podría únicamente resultar en archivos corruptos, los cuales no podrían ser abiertos o procesados por el software. En estos casos puede ser una buena idea saltar los valores mágicos (u otras partes del archivo los cuales permanecerán inmutables) para reducir el número de casos de pruebas irrelevantes. Esto mejorará en gran medida el número de pruebas válidas e incrementará la velocidad del Fuzzing.

Existen dos tipos comunes de configuraciones para segmentos de mutación:

Completo. Todos los datos son mutados, y ninguna parte del archivo se trata especialmente.

Pros: Este tipo de cobertura asegura la mayoría de vulnerabilidades se abarcan y prueban.
Contras: La cantidad de combinaciones a probar es enorme y da como resultado tiempos de ejecución prolongados. Esto también puede resultar en muchos casos de prueba sean ignorados por el software, por las malformaciones factibles de surgir como resultados de modificar partes especiales o segmentos de datos.

Segmentado.En este caso no todos los segmentos de datos son tratados igual, y algunas partes deberán ser manejados por reglas especiales.

Pros: El proceso de Fuzing puede ser dirigido para especialmente evaluar partes interesantes del objetivo. En este caso la parte “interesante” es subjetiva, y usualmente proviene de un presentimiento o adivinación adecuada.
Contras: La cobertura del Fuzzing es limitada y depende de correctamente identificar las partes interesantes del formato de datos.

Algoritmos de Mutación. Comúnmente, existen tres diferentes maneras de mutar o modificar datos mientras se hace Fuzzing, cada uno diferente en términos de velocidad y lo abarcado:

Aleatorización: Es la manera más fácil y probablemente más común de realizar Fuzzing. Los datos son modificados mediante el reemplazo de porciones con patrones generados aleatoriamente desde un alfabeto predefinido (por ejemplo, caracteres imprimibles). En este caso la mutación está únicamente restringida por el alfabeto generador, y el tamaño deseado de los nuevos datos. Este tipo de mutación es más completo porque tiene el potencial de abarcar todas las posibles combinaciones y encontrar todas las fallas. El problema es la explosión combinatoria previene de probar todas las posibles combinaciones en una cantidad de tiempo razonable, por lo cual esta perspectiva es oportunista y puede tomar mucho tiempo. Es usualmente una buena idea combinar pruebas aleatorias con una perspectiva basada en conjuntos, así la mayoría de tipos más comunes para activar una vulnerabilidad serán realizados antes de iniciar las pruebas aleatorias más extensas.

Tiempo de implementación: Rápido (Rápido / Medio / Lento)
Cobertura de la prueba: Completo (Completo / Parcial / Mínimo)
Tiempo de ejecución: Lento (Veloz / Medio / Lento)

Basado en conjuntos. Este tipo de mutación intenta resolver el problema de un extremadamente gran número de combinaciones en las pruebas de aleatorización, lo cual posee un serio problema en la velocidad de las pruebas. El completo rango de posibles mutaciones presentes en una mutación aleatoria es reducido hacia un conjunto pequeño, el cual usualmente es seleccionado manualmente. Este conjunto representativo se selecciona de tal manera tenga propiedades para activar o probar tipos comunes de vulnerabilidades.

Tiempo de implementación: Medio (Rápido / Medio / Lento)
Cobertura de la prueba: Mínimo / Parcial (Completo / Parcial / Mínimo)
Tiempo de ejecución: Veloz (Veloz / Medio / Lento)

Basado en reglas. Este tipo de mutación es una compensación entre una búsqueda aleatoria completa y un conjunto mínimo seleccionado manualmente. En este caso un conjunto de reglas se escriben para generar patrones y rangos de números a utilizar para las pruebas. Esta perspectiva usualmente extiende el conjunto creado escribiendo reglas más generales, las cuales también podrían explorar patrones similares a aquellos determinados como “interesantes” por la perspectiva basada en conjuntos.

Tiempo de implementación: Medio (Rápido / Medio / Lento)
Cobertura de la prueba: Parcial (Completo / Parcial / Mínimo)
Tiempo de ejecución: Medio (Veloz / Medio / Lento)

Fuentes:

https://en.wikipedia.org/wiki/Fuzzing
https://www.securityevaluators.com/wp-content/uploads/2018/04/analysisfu...
http://community.peachfuzzer.com/GenerationMutationFuzzing.html

Sobre el Autor


Alonso Eduardo Caballero Quezada - ReYDeS
Instructor y Consultor en Hacking Ético, Forense Digital & GNU/Linux
Correo Electrónico: ReYDeS@gmail.com
Twitter: @Alonso_ReYDeS
LinkedIn: pe.linkedin.com/in/alonsocaballeroquezada
Facebook: https://www.facebook.com/alonsoreydes
Youtube: http://www.youtube.com/c/AlonsoCaballero
Resumen de mi CV: http://www.reydes.com/d/?q=node/1