Con abatimiento, con el crecimiento de la tecnología, hay un margen de maniobra más innumerable para la delincuencia digital en todo el mundo. Muchas investigaciones han enfrentado dificultades en las pruebas de seguridad. Se encontraron numerosos métodos para encontrar vulnerabilidades en el sistema, pero no pudieron funcionar de manera eficiente.
Para proteger tu trabajo de estos errores dañinos, es vital tener un software de seguridad del sistema. Las pruebas de fuzz son el software de más alto nivel que se puede obtener para identificar errores maliciosos.
En este artículo tienes todo lo que debes saber todo sobre Fuzz Testin, qué es, cómo realizarla, ventajas y las herramientas de fuzzing.
Indice
¿Qué es Fuzz Testing?
Fuzz testing es un sistema automático de prueba de software que se esfuerza por detectar errores de implementación mediante el llenado extraño de datos y cifras vacíos e inesperados en una aplicación informática para detectar fallas de codificación y lagunas de protección. Este método se utiliza tanto para los piratas informáticos que investigan la susceptibilidad a la explotación como para los defensores que buscan detectarlos y corregirlos.
La prueba de fuzz significa ingresar grandes volúmenes de datos casuales, denominados fuzz, en el sistema. Si se detecta susceptibilidad, se utiliza una herramienta del sistema llamada herramienta Fuzzing para reconocer las posibles razones. Fuzzing expone errores graves que se pasan por alto cuando se formula el software. Las herramientas fuzzing funcionan a fondo para identificar la susceptibilidad que puede ser maltratada por inyección SQL, denegación de servicio (DOS) y secuencias de comandos entre sitios. Los piratas informáticos los utilizan para destruir el sistema de seguridad y extraer los datos del sistema objetivo.
Fuzz testing, o fuzzing, es una técnica de prueba de seguridad de aplicaciones dinámicas para pruebas negativas. Fuzzing tiene como objetivo detectar vulnerabilidades conocidas, desconocidas y de día cero. Se puede utilizar una herramienta de fuzz para crear un caso de prueba y enviar entradas aleatorias o con formato incorrecto a los objetivos de fuzz. Su objetivo es desencadenar malos comportamientos, como bloqueos, bucles infinitos y / o pérdidas de memoria. Estos comportamientos anómalos suelen ser un signo de una vulnerabilidad subyacente. Las pruebas de fuzz deberían ser parte de cada SDLC. Examina el comportamiento en tiempo de ejecución del código. Proporciona más cobertura de código que SAST o SCA.
¿Por qué hacer Fuzz Testing?
Es importante hacer Fuzz Testing poque:
- Las pruebas de fuzz ayudan a identificar los múltiples defectos o fallas de seguridad graves.
- Comprueba la susceptibilidad del software.
- Ofrece resultados eficientes cuando se utiliza con Black Box Testing, Beta Testing y otras técnicas de depuración y métodos de prueba rentables.
- Es una de las técnicas de prueba de caja negra. Es el método más utilizado por los piratas informáticos para detectar la susceptibilidad del sistema.
Una revisión de las inversiones en seguridad de software revela que la mayor parte del gasto se destina a soluciones de prueba de aplicaciones, como análisis estático, análisis de composición de software y escáneres. Sin embargo, estos enfoques de prueba convencionales prueban patrones de ataque conocidos o comunes, y solo se dirigen a CVE o CWE. Pero, ¿qué pasa con las vulnerabilidades desconocidas? Los piratas informáticos malintencionados a menudo explotan.
Fuzzing es una herramienta probada que maximiza la detección de defectos con la menor cantidad de tiempo y recursos. Como resultado, no solo compra tiempo y dinero a las organizaciones, sino que también libera recursos técnicos escasos de tareas manuales y mundanas y les permite enfocarse en iniciativas estratégicas que requieren verdadera experiencia.
¿Cómo realizar la prueba de Fuzz?
Los pasos para realizar esta prueba son los siguientes:
- El primer paso es reconocer el sistema al que se dirige.
- En el segundo paso, identifica todas las posibles entradas.
- Luego extrae los datos difusos.
- Después de extraer los datos difusos, ejecuta la prueba utilizando datos difusos.
- Luego observa el comportamiento del sistema.
- Registra todos los defectos resultantes.
Ejemplos
Estos son algunos ejemplos de Fuzz Testing:
Fuzzing basado en mutaciones
Altera las muestras de datos actuales para crear nuevos datos de prueba. Es un método simple, que comienza con muestras precisas de reglas y sigue destruyendo cada byte o archivo.
Fuzzing basado en generaciones
Define nuevos datos basados en la información del modelo. Comienza a formar la entrada desde cero según la especificación.
Fuzzing basado en protocolos
Tiene un conocimiento completo del formato de reglas que se va a probar. La comprensión depende de la especificación. Incluye escribir una matriz de la especificación en la herramienta, luego usar el método de extracción de prueba basado en modelo, revisar la especificación y agregar variación en el contenido de la información, el orden, etc. También se le llama prueba de sintaxis, prueba gramatical, prueba de robustez , etc. Puede extraer muestras de prueba de las actuales, o pueden utilizar hechos válidos o inválidos.
Tipos de errores detectados
Los tipos de errores detectados en una prueba de Fuzz son:
- Fallos de declaraciones y fugas de memoria. Este método se utiliza para aplicaciones extensas en las que los errores dañan la seguridad de la memoria, lo cual es una susceptibilidad de dificultad.
- Entrada inválida. Extrae una entrada de datos no válida que se utiliza para probar las rutinas de manejo de errores y también es necesaria para el software que no regula su entrada de datos.
- Errores de precisión. Identifica algunos tipos de errores de precisión, por ejemplo, base de datos contaminada y resultados de búsqueda incorrectos.
¿Quién usa el Fuzzing?
Algunas de las organizaciones más grandes y respetadas del mundo están implementando fuzzing como parte de sus operaciones de control de calidad y ciberseguridad:
- Google usa fuzzing para verificar y proteger millones de líneas de código en Chrome. En 2019, Google descubrió más de 20.000 vulnerabilidades en Chrome a través de pruebas internas de fuzz.
- Microsoft utiliza el fuzzing como una de las etapas de su ciclo de vida de desarrollo de software para encontrar vulnerabilidades y mejorar la estabilidad de sus productos.
- El Departamento de Defensa de EE. UU. (DoD) emitió un Diseño de referencia de DevSecOps y una Guía de seguridad de aplicaciones que requieren pruebas de fuzz como parte estándar de los procesos de desarrollo de software.
Estas y muchas otras organizaciones están adoptando el fuzzing en sus procesos de desarrollo estándar por varias razones:
- Fuzzing no solo identifica el problema, también muestra la causa del problema y cómo un atacante puede interactuar con él en un ataque de la vida real.
- Fuzzing demuestra que existe una vulnerabilidad, identificando problemas sin tener que examinar falsos positivos.
- La prueba está completamente automatizada y puede ejecutarse de forma independiente durante días o incluso semanas, identificando cada vez más vulnerabilidades en un sistema bajo prueba.
- Es muy útil para los desarrolladores. El papel de los desarrolladores es desarrollar y mejorar las características del producto. Mientras que las herramientas de seguridad tradicionales solo señalan fallas, los fuzzers muestran el resultado de la falla y demuestran el impacto de su solución.
Tipos
Las herramientas de fuzzing se pueden agrupar en cuatro tipos básicos.
Fuzzing basada en la gramática frente a la mutilación difusa
Los fuzzers basados en grammer o mutaciones se definen por la forma en que manejan la generación de casos de prueba. Algunos fuzzers combinan ambos enfoques.
Los fuzzers basados en gramática generan nuevos casos de prueba a partir de un modelo proporcionado. El probador define una «gramática», especificando el formato de las entradas aceptadas por la aplicación, y puede definir qué partes de la entrada deben ser borradas. El fuzzer utiliza este modelo para generar una gran cantidad de entradas, que son similares a las entradas legítimas, pero violan algunas de las restricciones de la aplicación.
Los fuzzers de mutación mutan aleatoriamente un objeto de entrada de semilla proporcionado. No están limitados por un modelo específico y se «vuelven locos» al generar una gran cantidad de entradas inusuales. Esto puede ser muy exitoso para identificar nuevos errores o rutas de ejecución que pueden no haber sido especificadas por el usuario en un fuzzer basado en gramática.
Fuzzing de caja negra frente a caja blanca
Los fuzzers también se pueden agrupar en enfoques de caja negra o caja blanca.
Los fuzzers de caja negra no tienen acceso a los artefactos del programa y los investigadores de ciberseguridad los utilizan con mayor frecuencia en busca de vulnerabilidades en productos comerciales. La fuzzing de caja negra muta aleatoriamente las entradas del programa y observa cómo reacciona el programa. Puede ser muy eficaz para encontrar nuevos errores y problemas de seguridad.
Los fuzzers de caja blanca, por definición, requieren acceso al código fuente del programa. Son comúnmente utilizados por equipos rojos que trabajan para organizaciones responsables de sistemas o por grupos de prueba de software.
El fuzzing de caja blanca implica barrer el programa e identificar ramas condicionales y restricciones en las entradas. El fuzzer luego viola sistemáticamente cada una de las restricciones y evalúa la respuesta.
Este es un proceso muy completo que, en teoría, puede acceder a todas las posibles rutas de ejecución del programa. Por lo general, puede descubrir más errores que un enfoque de caja negra, pero carece de que no prueba el software desde una perspectiva externa del atacante.
¿Cómo funciona?
Como establecimos anteriormente, el software fuzzing es una gran herramienta capaz de encontrar vulnerabilidades de día cero, pero ¿cómo funciona un fuzzer?
1. Generación de casos de prueba
Primero, se generan los casos de prueba. Cada caso de prueba de seguridad puede generarse como un conjunto de datos aleatorio o semi-aleatorio y luego enviarse como entrada a la aplicación.
El conjunto de datos puede generarse de conformidad con los requisitos de formato de la entrada del sistema o como un fragmento de datos completamente mal formado que el sistema no estaba destinado a comprender o procesar.
¿Qué crees que le sucedería a una aplicación si se enviaran números negativos, caracteres nulos o incluso caracteres especiales a algunos campos de entrada? ¿Sabes cómo se comportaría tu aplicación?
2. Interfaz con el objetivo para entregar la entrada
Durante la prueba de fuzz, un fuzzer puede interactuar con una aplicación, un protocolo o un formato de archivo. Mientras hace eso, un fuzzer envía casos de prueba al objetivo a través de la red o mediante un argumento de línea de comandos de una aplicación en ejecución.
Los casos de uso imaginativos pueden revelar formas de exponer un fragmento de código relevante con los datos específicos correctos.
3. Monitorización del sistema para detectar fallas
El éxito de una prueba de fuzz se mide por la capacidad de confirmar el impacto que tiene un fuzzer en la aplicación de destino.
Herramientas
A continuación se muestran algunas de las principales herramientas de prueba de fuzz de código abierto:
Radames
Radames es un Fuzzer de propósito general para pruebas de robustez. Se utiliza para probar qué tan bien una aplicación soporta entradas mal formadas y potencialmente maliciosas. Puede leer archivos de muestra de entradas de datos válidas y generar salidas interesantes diferentes usándolas. Radames ya ha encontrado varios errores en los principales programas y aplicaciones. Es fácil de configurar, se puede programar y configurar.
Radames es más un Fuzzer de “caja negra” ya que no requiere información sobre el programa o el formato de los datos. Sin embargo, puedes emparejarlo opcionalmente con el análisis de cobertura para realizar pruebas y mejorar la calidad del conjunto de muestras. Los evaluadores pueden comenzar con pruebas sencillas y perfeccionar gradualmente la técnica según sea necesario.
Honggfuzz
Honggfuzz es un Fuzzer multiproceso. Esto elimina el requisito de ejecutar varias copias del fuzzer, ya que Honggfuzz puede usar potencialmente toda su potencia informática disponible con una sola instancia en ejecución. El corpus de archivos se comparte automáticamente y se mejora entre todos los procesos difusos.
Es increíblemente rápido y tiene un sólido historial de descubrimiento de errores de seguridad. Honggfuzz descubrió la única vulnerabilidad crítica (hasta la fecha) en OpenSSL.
American Fuzzy Lop
American Fuzzy Lop (AFL) es un Fuzzer de fuerza bruta gratuito junto con un algoritmo genético guiado por instrumentación sólido pero sencillo. AFL utiliza una forma modificada de cobertura de bordes para captar sin problemas modificaciones sutiles a escala local en el flujo de control del programa.
AFL se prueba minuciosamente para ofrecer un rendimiento listo para usar muy superior en comparación con las herramientas de fuzzing ciego o de solo cobertura.
LibFuzzer
LibFuzzer es un motor de fuzzing evolutivo, guiado por cobertura y en proceso. Está vinculado con la biblioteca bajo prueba y proporciona entradas difusas a la biblioteca utilizando un punto de entrada difuso específico. El fuzzer puede entonces rastrear qué áreas de código se alcanzan y crear mutaciones en el corpus de datos de entrada para maximizar la cobertura del código.
Sulley
Sulley es un motor Fuzzing y un marco de prueba Fuzz que consta de varios componentes extensibles. Se sabe que Sulley ha superado las capacidades de la mayoría de las tecnologías de fuzzing publicadas anteriormente, incluso en el dominio público y comercial. El objetivo del marco de Sulley es simplificar la representación de datos, la transmisión de datos y la instrumentación.
OSS-Fuzz
La herramienta OSS-Fuzz fue diseñada principalmente para trabajar con software de código abierto para hacerlos más seguros y estables. OSS-Fuzz admite programas de código abierto escritos en C, C ++, Go, Rust, Python y Java / JCM. También puede funcionar con otros idiomas admitidos por LLVM (https://llvm.org/). OSS-Fuzz admite compilaciones fuzzing x86_64 e i386.
APIFuzzer
APIFuzzer no requiere codificación. Lee la descripción de tu API y puede pasar a los campos difusos para probar si tu aplicación puede soportar los parámetros difusos. APIFuzzer admite la eliminación difusa del cuerpo de la solicitud, el parámetro de ruta, la cadena de consulta y el encabezado de la solicitud.
Jazzer
Jazzer, desarrollado por Code Intelligence, es un fuzzer en proceso guiado por cobertura para la plataforma JVM. Se basa en libFuzzer y extiende muchas de sus funcionalidades de mutación impulsadas por instrumentación a la JVM.
El código de bytes de JVM se ejecuta dentro del proceso de fuzzer, lo que garantiza una velocidad de ejecución rápida y una Fuzzing perfecta de las bibliotecas nativas. Jazzer es compatible con Linux x64 y, de forma experimental, es compatible con macOS 10.15.