stringtranslate.com

Fuzzing

En programación y desarrollo de software , la fuzzing o prueba de fuzz es una técnica de prueba de software automatizada que implica proporcionar datos no válidos, inesperados o aleatorios como entradas a un programa de computadora . Luego, el programa se monitorea para detectar excepciones como fallas , aserciones de código incorporadas fallidas o posibles pérdidas de memoria . Normalmente, los fuzzers se utilizan para probar programas que reciben entradas estructuradas. Esta estructura se especifica, por ejemplo, en un formato de archivo o protocolo y distingue las entradas válidas de las no válidas. Un fuzzer efectivo genera entradas semi-válidas que son "lo suficientemente válidas" en el sentido de que el analizador no las rechaza directamente, pero crean comportamientos inesperados más profundamente en el programa y son "lo suficientemente inválidas" como para exponer casos extremos que no se han tratado adecuadamente. con.

A efectos de seguridad, la entrada que cruza un límite de confianza suele ser la más útil. [1] Por ejemplo, es más importante difuminar el código que maneja la carga de un archivo por parte de cualquier usuario que difuminar el código que analiza un archivo de configuración al que solo puede acceder un usuario privilegiado.

Historia

El término "fuzz" se origina en un proyecto de clase de otoño de 1988 [2] en la clase de posgrado de Sistemas Operativos Avanzados (CS736), impartida por el Prof. Barton Miller en la Universidad de Wisconsin , cuyos resultados se publicaron posteriormente en 1990. [3] [ 4] Para realizar una prueba difusa de una utilidad UNIX destinada a generar automáticamente parámetros de entrada aleatorios y de línea de comandos para la utilidad. El proyecto fue diseñado para probar la confiabilidad de los programas de línea de comandos de UNIX ejecutando una gran cantidad de entradas aleatorias en rápida sucesión hasta que fallaron. El equipo de Miller pudo bloquear entre el 25 y el 33 por ciento de las utilidades que probaron. Luego depuraron cada uno de los fallos para determinar la causa y categorizaron cada fallo detectado. Para permitir que otros investigadores realicen experimentos similares con otro software, el código fuente de las herramientas, los procedimientos de prueba y los datos sin procesar de los resultados se pusieron a disposición del público. [5] Esta temprana confusión se llamaría ahora confusión de caja negra, generacional, no estructurada (tonta o "clásica").

Según el profesor Barton Miller, "en el proceso de redacción de la descripción del proyecto, necesitaba darle un nombre a este tipo de prueba. Quería un nombre que evocara la sensación de datos aleatorios y no estructurados. Después de probar varias ideas, se decidió por el término fuzz". [4]

Una contribución clave de estos primeros trabajos fue un oráculo simple (casi simplista). Un programa falló su prueba si fallaba o se bloqueaba bajo la entrada aleatoria y se consideraba que había pasado en caso contrario. Si bien construir oráculos de prueba puede ser un desafío, el oráculo para estas primeras pruebas difusas fue simple y de aplicación universal.

En abril de 2012, Google anunció ClusterFuzz, una infraestructura de fuzzing basada en la nube para componentes críticos de seguridad del navegador web Chromium . [6] Los investigadores de seguridad pueden cargar sus propios fuzzers y recolectar recompensas por errores si ClusterFuzz encuentra un fallo con el fuzzer cargado.

En septiembre de 2014, Shellshock [7] fue revelado como una familia de errores de seguridad en el shell UNIX Bash ampliamente utilizado ; la mayoría de las vulnerabilidades de Shellshock se encontraron utilizando el fuzzer AFL . [8] (Muchos servicios conectados a Internet, como algunas implementaciones de servidores web, utilizan Bash para procesar ciertas solicitudes, lo que permite a un atacante hacer que versiones vulnerables de Bash ejecuten comandos arbitrarios . Esto puede permitir que un atacante obtenga acceso no autorizado a una computadora. sistema [9] )

En abril de 2015, Hanno Böck mostró cómo el fuzzer AFL pudo haber encontrado la vulnerabilidad Heartbleed de 2014. [10] [11] (La vulnerabilidad Heartbleed se reveló en abril de 2014. Es una vulnerabilidad grave que permite a los adversarios descifrar comunicaciones cifradas . La vulnerabilidad se introdujo accidentalmente en OpenSSL , que implementa TLS y es utilizada por la mayoría de los servidores en Internet. Shodan informó que 238.000 máquinas aún eran vulnerables en abril de 2016; [12] 200.000 en enero de 2017. [13] )

En agosto de 2016, la Agencia de Proyectos de Investigación Avanzada de Defensa (DARPA) celebró la final del primer Cyber ​​Grand Challenge , una competición totalmente automatizada de capturar la bandera que duró 11 horas. [14] El objetivo era desarrollar sistemas de defensa automáticos que puedan descubrir, explotar y corregir fallas de software en tiempo real . El fuzzing se utilizó como una estrategia ofensiva eficaz para descubrir fallas en el software de los oponentes. Mostró un enorme potencial en la automatización de la detección de vulnerabilidades. El ganador fue un sistema llamado "Mayhem" [15] desarrollado por el equipo ForAllSecure liderado por David Brumley .

En septiembre de 2016, Microsoft anunció el Proyecto Springfield, un servicio de pruebas fuzz basado en la nube para encontrar errores críticos de seguridad en el software. [dieciséis]

En diciembre de 2016, Google anunció OSS-Fuzz, que permite la fuzzización continua de varios proyectos de código abierto críticos para la seguridad. [17]

En Black Hat 2018, Christopher Domas demostró el uso de fuzzing para exponer la existencia de un núcleo RISC oculto en un procesador. [18] Este núcleo pudo eludir los controles de seguridad existentes para ejecutar comandos del Anillo 0 desde el Anillo 3.

En septiembre de 2020, Microsoft lanzó OneFuzz , una plataforma de fuzzing como servicio autohospedada que automatiza la detección de errores de software . [19] Es compatible con Windows y Linux. [20] Ha sido archivado tres años después, el 1 de noviembre de 2023. [21]

Pruebas aleatorias tempranas

Los programas de prueba con entradas aleatorias se remontan a la década de 1950, cuando los datos todavía se almacenaban en tarjetas perforadas . [22] Los programadores usarían tarjetas perforadas extraídas de la basura o barajas de números aleatorios como entrada para los programas de computadora. Si una ejecución revelaba un comportamiento no deseado, se había detectado un error .

La ejecución de entradas aleatorias también se denomina prueba aleatoria o prueba de mono .

En 1981, Durán y Ntafos investigaron formalmente la efectividad de probar un programa con entradas aleatorias. [23] [24] Si bien las pruebas aleatorias habían sido ampliamente percibidas como el peor medio para probar un programa, los autores pudieron demostrar que son una alternativa rentable a técnicas de prueba más sistemáticas.

En 1983, Steve Capps de Apple desarrolló "The Monkey", [25] una herramienta que generaba entradas aleatorias para aplicaciones clásicas de Mac OS , como MacPaint . [26] El "mono" figurativo se refiere al teorema del mono infinito que establece que un mono que presiona teclas al azar en el teclado de una máquina de escribir durante un período de tiempo infinito eventualmente escribirá las obras completas de Shakespeare. En el caso de las pruebas, el mono escribiría la secuencia particular de entradas que desencadenarían un bloqueo.

En 1991, se lanzó la herramienta crashme, cuyo objetivo era probar la solidez de Unix y sistemas operativos similares mediante la ejecución aleatoria de llamadas al sistema con parámetros elegidos al azar. [27]

Tipos

Un fuzzer se puede clasificar de varias maneras: [28] [1]

  1. Un fuzzer puede estar basado en generación o en mutación dependiendo de si las entradas se generan desde cero o modificando las entradas existentes.
  2. Un fuzzer puede ser tonto (no estructurado) o inteligente (estructurado) dependiendo de si conoce la estructura de entrada.
  3. Un fuzzer puede ser de caja blanca, gris o negra, dependiendo de si conoce la estructura del programa.

Reutilización de semillas de insumos existentes

Un fuzzer basado en mutaciones aprovecha un corpus existente de entradas de semillas durante el fuzzing. Genera entradas modificando (o más bien mutando ) las semillas proporcionadas. [29] Por ejemplo, al aplicar fuzzer a la biblioteca de imágenes libpng , el usuario proporcionaría un conjunto de archivos de imágenes PNG válidos como semillas, mientras que un fuzzer basado en mutaciones modificaría estas semillas para producir variantes semiválidas de cada semilla. El corpus de archivos semilla puede contener miles de entradas potencialmente similares. La selección de semillas automatizada (o reducción del conjunto de pruebas) permite a los usuarios elegir las mejores semillas para maximizar la cantidad total de errores encontrados durante una campaña fuzz. [30]

Un fuzzer basado en generación genera entradas desde cero. Por ejemplo, un fuzzer basado en generación inteligente [31] toma el modelo de entrada proporcionado por el usuario para generar nuevas entradas. A diferencia de los fuzzers basados ​​en mutaciones, un fuzzer basado en generaciones no depende de la existencia o calidad de un corpus de insumos de semillas.

Algunos fuzzers tienen la capacidad de hacer ambas cosas: generar insumos desde cero y generar insumos mediante mutación de semillas existentes. [32]

Consciente de la estructura de entrada

Normalmente, los fuzzers se utilizan para generar entradas para programas que toman entradas estructuradas, como un archivo , una secuencia de eventos de teclado o mouse , o una secuencia de mensajes . Esta estructura distingue la entrada válida que el programa acepta y procesa de la entrada no válida que el programa rechaza rápidamente. Lo que constituye una entrada válida puede especificarse explícitamente en un modelo de entrada. Ejemplos de modelos de entrada son gramáticas formales , formatos de archivo , modelos GUI y protocolos de red . Incluso los elementos que normalmente no se consideran entradas pueden verse afectados, como el contenido de las bases de datos , la memoria compartida , las variables de entorno o el entrelazado preciso de subprocesos . Un fuzzer efectivo genera entradas semiválidas que son "lo suficientemente válidas" para que no sean rechazadas directamente por el analizador y "lo suficientemente inválidas" para que puedan enfatizar casos extremos y ejercer comportamientos interesantes en el programa.

Un fuzzer inteligente (basado en modelos, [32] basado en gramática, [31] [33] o basado en protocolos [34] ) aprovecha el modelo de entrada para generar una mayor proporción de entradas válidas. Por ejemplo, si la entrada se puede modelar como un árbol de sintaxis abstracta , entonces un fuzzer inteligente basado en mutaciones [33] emplearía transformaciones aleatorias para mover subárboles completos de un nodo a otro. Si la entrada puede modelarse mediante una gramática formal , un fuzzer inteligente basado en generación [31] instanciaría las reglas de producción para generar entradas que sean válidas con respecto a la gramática. Sin embargo, generalmente el modelo de entrada debe proporcionarse explícitamente, lo cual es difícil de hacer cuando el modelo es propietario, desconocido o muy complejo. Si se dispone de un gran corpus de entradas válidas e inválidas, una técnica de inducción gramatical , como el algoritmo L* de Angluin , podría generar un modelo de entrada. [35] [36]

Un fuzzer tonto [37] [38] no requiere el modelo de entrada y, por tanto, puede emplearse para fuzzer una variedad más amplia de programas. Por ejemplo, AFL es un tonto fuzzer basado en mutaciones que modifica un archivo semilla volteando bits aleatorios , sustituyendo bytes aleatorios con valores "interesantes" y moviendo o eliminando bloques de datos. Sin embargo, un fuzzer tonto podría generar una menor proporción de entradas válidas y estresar el código del analizador en lugar de los componentes principales de un programa. La desventaja de los fuzzers tontos se puede ilustrar mediante la construcción de una suma de verificación válida para una verificación de redundancia cíclica (CRC). Un CRC es un código de detección de errores que garantiza que la integridad de los datos contenidos en el archivo de entrada se preserve durante la transmisión . Se calcula una suma de comprobación sobre los datos de entrada y se registra en el archivo. Cuando el programa procesa el archivo recibido y la suma de verificación registrada no coincide con la suma de verificación recalculada, el archivo se rechaza como no válido. Ahora bien, es poco probable que un fuzzer que desconoce el CRC genere la suma de comprobación correcta. Sin embargo, hay intentos de identificar y recalcular una posible suma de verificación en la entrada mutada, una vez que un tonto fuzzer basado en mutaciones ha modificado los datos protegidos. [39]

Consciente de la estructura del programa.

Normalmente, un fuzzer se considera más eficaz si logra un mayor grado de cobertura de código . La razón es que, si un fuzzer no ejercita ciertos elementos estructurales en el programa, tampoco podrá revelar errores que se esconden en estos elementos. Algunos elementos del programa se consideran más críticos que otros. Por ejemplo, un operador de división puede provocar un error de división por cero o una llamada al sistema puede bloquear el programa.

Un fuzzer de caja negra [37] [33] trata el programa como una caja negra y desconoce la estructura interna del programa. Por ejemplo, una herramienta de prueba aleatoria que genera entradas al azar se considera un fuzzer de caja negra. Por lo tanto, un fuzzer de caja negra puede ejecutar varios cientos de entradas por segundo, puede paralelizarse fácilmente y puede escalarse a programas de tamaño arbitrario. Sin embargo, los fuzzers de caja negra sólo pueden rayar la superficie y exponer errores "superficiales". Por lo tanto, hay intentos de desarrollar fuzzers de caja negra que puedan aprender incrementalmente sobre la estructura interna (y el comportamiento) de un programa durante la fuzzing observando la salida del programa dada una entrada. Por ejemplo, LearnLib emplea aprendizaje activo para generar un autómata que representa el comportamiento de una aplicación web.

Un fuzzer de caja blanca [38] [32] aprovecha el análisis de programas para aumentar sistemáticamente la cobertura del código o para llegar a ciertas ubicaciones críticas del programa. Por ejemplo, SAGE [40] aprovecha la ejecución simbólica para explorar sistemáticamente diferentes rutas en el programa (una técnica conocida como ejecución concólica ). Si la especificación del programa está disponible, un fuzzer de caja blanca podría aprovechar técnicas de pruebas basadas en modelos para generar entradas y comparar las salidas del programa con la especificación del programa. Un fuzzer de caja blanca puede ser muy eficaz para exponer errores que se esconden en lo más profundo del programa. Sin embargo, el tiempo empleado para el análisis (del programa o de su especificación) puede resultar prohibitivo. Si el fuzzer de caja blanca tarda demasiado en generar una entrada, un fuzzer de caja negra será más eficiente. [41] Por lo tanto, hay intentos de combinar la eficiencia de los fuzzers de caja negra y la efectividad de los fuzzers de caja blanca. [42]

Un fuzzer de caja gris aprovecha la instrumentación en lugar del análisis del programa para recopilar información sobre el programa. Por ejemplo, AFL y libFuzzer utilizan instrumentación liviana para rastrear transiciones de bloques básicas ejercidas por una entrada. Esto conduce a una sobrecarga de rendimiento razonable, pero informa al fuzzer sobre el aumento en la cobertura del código durante la fuzzing, lo que hace que los fuzzers de caja gris sean herramientas de detección de vulnerabilidades extremadamente eficientes. [43]

Usos

El fuzzing se utiliza principalmente como técnica automatizada para exponer vulnerabilidades en programas críticos para la seguridad que podrían explotarse con intenciones maliciosas. [6] [16] [17] De manera más general, la fuzzing se utiliza para demostrar la presencia de errores en lugar de su ausencia. Ejecutar una campaña de fuzzing durante varias semanas sin encontrar un error no demuestra que el programa sea correcto. [44] Después de todo, el programa aún puede fallar por una entrada que aún no se ha ejecutado; ejecutar un programa para todos los insumos es prohibitivamente costoso. Si el objetivo es demostrar que un programa es correcto para todas las entradas, debe existir una especificación formal y se deben utilizar técnicas de métodos formales .

Exponiendo errores

Para exponer errores, un fuzzer debe poder distinguir el comportamiento esperado (normal) del inesperado (con errores) del programa. Sin embargo, una máquina no siempre puede distinguir un error de una característica. En las pruebas de software automatizadas , esto también se denomina problema del oráculo de prueba . [45] [46]

Normalmente, un fuzzer distingue entre entradas que fallan y que no fallan en ausencia de especificaciones y para utilizar una medida simple y objetiva. Los fallos se pueden identificar fácilmente y pueden indicar vulnerabilidades potenciales (por ejemplo, denegación de servicio o ejecución de código arbitrario ). Sin embargo, la ausencia de un bloqueo no indica la ausencia de una vulnerabilidad. Por ejemplo, un programa escrito en C puede fallar o no cuando una entrada provoca un desbordamiento del búfer . Más bien, el comportamiento del programa no está definido .

Para hacer que un fuzzer sea más sensible a fallas distintas a las fallas, se pueden usar desinfectantes para inyectar aserciones que bloqueen el programa cuando se detecta una falla. [47] [48] Existen diferentes desinfectantes para diferentes tipos de errores:

La fuzzing también se puede utilizar para detectar errores "diferenciales" si hay una implementación de referencia disponible. Para las pruebas de regresión automatizadas , [49] las entradas generadas se ejecutan en dos versiones del mismo programa. Para pruebas diferenciales automatizadas , [50] las entradas generadas se ejecutan en dos implementaciones del mismo programa (por ejemplo, lighttpd y httpd son implementaciones de un servidor web). Si las dos variantes producen resultados diferentes para la misma entrada, entonces una puede tener errores y debería examinarse más de cerca.

Validación de informes de análisis estáticos

El análisis estático de programas analiza un programa sin ejecutarlo realmente. Esto podría dar lugar a falsos positivos en los que la herramienta informa problemas con el programa que en realidad no existen. Se puede utilizar la fuzzing en combinación con el análisis dinámico del programa para intentar generar una entrada que realmente sea testigo del problema informado. [51]

Seguridad del navegador

Los navegadores web modernos se someten a una extensa confusión. El equipo de seguridad de Chrome con 15.000 núcleos modifica continuamente el código Chromium de Google Chrome . [52] Para Microsoft Edge e Internet Explorer , Microsoft realizó pruebas difusas con 670 años-máquina durante el desarrollo del producto, generando más de 400 mil millones de manipulaciones DOM a partir de mil millones de archivos HTML. [53] [52]

Cadena de herramientas

Un fuzzer produce una gran cantidad de entradas en un tiempo relativamente corto. Por ejemplo, en 2016, el proyecto OSS-fuzz de Google produjo alrededor de 4 billones de entradas por semana. [17] Por lo tanto, muchos fuzzers proporcionan una cadena de herramientas que automatiza tareas que de otro modo serían manuales y tediosas y que siguen a la generación automatizada de entradas que inducen fallas.

Clasificación de errores automatizada

La clasificación automatizada de errores se utiliza para agrupar una gran cantidad de entradas que provocan fallas por causa raíz y para priorizar cada error individual por gravedad. Un fuzzer produce una gran cantidad de entradas, y muchas de las que provocan fallas pueden exponer efectivamente el mismo error de software . Sólo algunos de estos errores son críticos para la seguridad y deben corregirse con mayor prioridad. Por ejemplo, el Centro de Coordinación CERT proporciona herramientas de clasificación de Linux que agrupan las entradas que fallan según el seguimiento de la pila producido y enumeran cada grupo según su probabilidad de ser explotables . [54] El Centro de Investigación de Seguridad de Microsoft (MSEC) desarrolló la herramienta explotable que primero crea un hash para una entrada que falla para determinar su singularidad y luego asigna una calificación de explotabilidad: [55]

Los errores clasificados y no informados anteriormente pueden informarse automáticamente a un sistema de seguimiento de errores . Por ejemplo, OSS-Fuzz ejecuta campañas de fuzzing a gran escala y de larga duración para varios proyectos de software críticos para la seguridad donde cada error distinto y no reportado previamente se informa directamente a un rastreador de errores. [17] El rastreador de errores OSS-Fuzz informa automáticamente al mantenedor del software vulnerable y verifica en intervalos regulares si el error se ha solucionado en la revisión más reciente utilizando la entrada minimizada que induce fallas cargada.

Minimización de entrada automatizada

La minimización de entradas automatizada (o reducción de casos de prueba) es una técnica de depuración automatizada para aislar esa parte de la entrada que induce la falla y que en realidad está provocando la falla. [56] [57] Si la entrada que induce el error es grande y en su mayoría está mal formada, puede resultar difícil para un desarrollador comprender qué está causando exactamente el error. Dada la entrada que provoca fallas, una herramienta de minimización automatizada eliminaría tantos bytes de entrada como sea posible sin dejar de reproducir el error original. Por ejemplo, Delta Debugging es una técnica de minimización de entrada automatizada que emplea un algoritmo de búsqueda binaria extendido para encontrar una entrada mínima. [58]

Lista de fuzzers populares

La siguiente es una lista de fuzzers descritos como "populares", "ampliamente utilizados" o similares en la literatura académica. [59] [60]

Ver también

Referencias

  1. ^ ab John Neystadt (febrero de 2008). "Pruebas de penetración automatizadas con fuzzing de caja blanca". Microsoft . Consultado el 14 de mayo de 2009 .
  2. ^ Barton P. Miller (septiembre de 1988). "Lista de proyectos CS736 de otoño de 1988" (PDF) . Departamento de Ciencias de la Computación, Universidad de Wisconsin-Madison . Consultado el 30 de diciembre de 2020 .
  3. ^ Barton P. Miller; Lars Fredriksen; Bryan So (diciembre de 1990). "Un estudio empírico de la confiabilidad de las utilidades UNIX". Comunicaciones de la ACM . 33 (11): 32–44. doi : 10.1145/96267.96279 . S2CID  14313707.
  4. ^ ab Miller, Barton (abril de 2008). "Prólogo del libro de pruebas de Fuzz". Ciencias de la Computación de la UW-Madison . Consultado el 29 de marzo de 2024 .
  5. ^ "Pruebas difusas de la confiabilidad de las aplicaciones". Universidad de Wisconsin-Madison . Consultado el 30 de diciembre de 2020 .
  6. ^ ab "Anuncio de ClusterFuzz" . Consultado el 9 de marzo de 2017 .
  7. ^ Perlroth, Nicole (25 de septiembre de 2014). "Los expertos en seguridad esperan que el error de software 'Shellshock' en Bash sea significativo". Los New York Times . Consultado el 25 de septiembre de 2014 .
  8. ^ Zalewski, Michał (1 de octubre de 2014). "Error de Bash: los otros dos RCE, o cómo eliminamos la solución original (CVE-2014-6277 y '78)". Blog de lcamtuf . Consultado el 13 de marzo de 2017 .
  9. ^ Seltzer, Larry (29 de septiembre de 2014). "Shellshock hace que Heartbleed parezca insignificante". ZDNet . Consultado el 29 de septiembre de 2014 .
  10. ^ Böck, Hanno. "Fuzzing: Wie man Heartbleed hätte finden können (en alemán)". Golem.de (en alemán) . Consultado el 13 de marzo de 2017 .
  11. ^ Böck, Hanno. "Cómo se pudo haber encontrado Heartbleed (en inglés)". El blog de Hanno . Consultado el 13 de marzo de 2017 .
  12. ^ "Motor de búsqueda para el Internet de las cosas: los dispositivos aún son vulnerables a Heartbleed". shodan.io . Consultado el 13 de marzo de 2017 .
  13. ^ "Informe Heartbleed (2017-01)". shodan.io . Consultado el 10 de julio de 2017 .
  14. ^ Caminante, Michael. "Gran desafío cibernético de DARPA". darpa.mil . Consultado el 12 de marzo de 2017 .
  15. ^ "Mayhem ocupa el primer lugar en CGC" . Consultado el 12 de marzo de 2017 .
  16. ^ ab "Anuncio del Proyecto Springfield". 26 de septiembre de 2016 . Consultado el 8 de marzo de 2017 .
  17. ^ abcd "Anuncio de OSS-Fuzz" . Consultado el 8 de marzo de 2017 .
  18. ^ Christopher Domas (agosto de 2018). "MODO DIOS DESBLOQUEADO: puertas traseras de hardware en CPU x86" . Consultado el 3 de septiembre de 2018 .
  19. ^ "Microsoft: Windows 10 está reforzado con estas herramientas de seguridad difusas; ahora son de código abierto". ZDNet . 15 de septiembre de 2020.
  20. ^ "Marco de prueba de fuzzing de código abierto de Microsoft". InfoMundo . 17 de septiembre de 2020.
  21. ^ microsoft/onefuzz, Microsoft, 3 de marzo de 2024 , consultado el 6 de marzo de 2024
  22. ^ Gerald M. Weinberg (5 de febrero de 2017). "Pruebas de Fuzz e historial de Fuzz" . Consultado el 6 de febrero de 2017 .
  23. ^ Joe W. Durán; Simeón C. Ntafos (9 de marzo de 1981). Un informe sobre pruebas aleatorias. ICSE '81. Actas de la Conferencia Internacional ACM SIGSOFT sobre Ingeniería de Software (ICSE'81). págs. 179–183. ISBN 9780897911467.
  24. ^ Joe W. Durán; Simeón C. Ntafos (1 de julio de 1984). "Una evaluación de pruebas aleatorias". Transacciones IEEE sobre ingeniería de software (4). Transacciones IEEE sobre ingeniería de software (TSE): 438–444. doi :10.1109/TSE.1984.5010257. S2CID  17208399.
  25. ^ Andy Hertzfeld (2004). Revolución en el Valle: ¿La increíblemente grandiosa historia de cómo se hizo la Mac? . Prensa O'Reily. ISBN 978-0596007195.
  26. ^ "Historias de Macintosh: vidas de monos". Folklore.org. 1999-02-22 . Consultado el 28 de mayo de 2010 .
  27. ^ "chocarme". CódigoPlex . Consultado el 21 de mayo de 2021 .
  28. ^ Michael Sutton; Adán Greene; Pedram Amini (2007). Fuzzing: descubrimiento de vulnerabilidades de fuerza bruta . Addison-Wesley. ISBN 978-0-321-44611-4.
  29. ^ Offutt, Jeff; Xu, Wuzhi (2004). "Generación de casos de prueba para servicios web mediante perturbación de datos". Taller de Testeo, Análisis y Verificación de Servicios Web . 29 (5): 1–10. doi :10.1145/1022494.1022529. S2CID  52854851.
  30. ^ Rebert, Alejandro; Cha, Sang Kil; Avgerinos, Thanassis; Foote, Jonathan; Warren, David; Grieco, Gustavo; Brumley, David (2014). "Optimización de la selección de semillas para fuzzing" (PDF) . Actas del 23º Simposio de la Conferencia USENIX sobre Seguridad : 861–875.
  31. ^ a B C Patrice Godefroid; Adán Kiezun; Michael Y. Levin. "Whitebox Fuzzing basado en gramática" (PDF) . Investigación de Microsoft.
  32. ^ a b C Van-Thuan Pham; Marcel Böhme; Abhik Roychoudhury (7 de septiembre de 2016). "Fusing de caja blanca basada en modelos para binarios de programas". Actas de la 31ª Conferencia Internacional IEEE/ACM sobre Ingeniería de Software Automatizada - ASE 2016 . Actas de Ingeniería de Software Automatizada (ASE'16). págs. 543–553. doi :10.1145/2970276.2970316. ISBN 9781450338455. S2CID  5809364.
  33. ^ a b "Peach Fuzzer" . Consultado el 8 de marzo de 2017 .
  34. ^ Greg bancos; Marco Cova; Viktoria Felmetsger; Kevin Almeroth; Richard Kemmerer; Juan Vigna. SNOOZE: Hacia un fuzzER de protocolo de red con estado. Actas de la Conferencia sobre seguridad de la información (ISC'06).
  35. ^ Osbert Bastani; Rahul Sharma; Álex Aiken; Percy Liang (junio de 2017). Sintetizando gramáticas de entrada de programas . Actas de la Conferencia ACM SIGPLAN sobre diseño e implementación de lenguajes de programación (PLDI 2017). arXiv : 1608.01723 . Código Bib : 2016arXiv160801723B.
  36. ^ "VDA Labs - Sistema de fuzzing evolutivo". Archivado desde el original el 5 de noviembre de 2015 . Consultado el 14 de mayo de 2009 .
  37. ^ ab Ari Takanen; Jared D. Demott; Charles Miller (31 de enero de 2018). Fuzzing para pruebas de seguridad y control de calidad del software, segunda edición. Casa Artech. pag. 15.ISBN 978-1-63081-519-6.documento completo disponible (archivado el 19 de septiembre de 2018)
  38. ^ ab Vijay Ganesh; Tim puerro; Martín Rinard (16 de mayo de 2009). "Fusing de caja blanca dirigida basada en contaminación". IEEE . Actas de la Conferencia Internacional ACM SIGSOFT sobre Ingeniería de Software (ICSE'09).
  39. ^ Wang, T.; Wei, T.; Gu, G.; Zou, W. (mayo de 2010). "TaintScope: una herramienta de fuzzing dirigida según la suma de comprobación para la detección automática de vulnerabilidades de software". Simposio IEEE 2010 sobre seguridad y privacidad . págs. 497–512. CiteSeerX 10.1.1.169.7866 . doi :10.1109/SP.2010.37. ISBN  978-1-4244-6894-2. S2CID  11898088.
  40. ^ Patrice Godefroid; Michael Y. Levin; David Molnar (8 de febrero de 2008). "Prueba automatizada de Whitebox Fuzz" (PDF) . Actas del Simposio de redes y sistemas distribuidos (NDSS'08).
  41. ^ Marcel Böhme; Soumya Paul (5 de octubre de 2015). "Un análisis probabilístico de la eficiencia de las pruebas de software automatizadas". Transacciones IEEE sobre ingeniería de software . 42 (4): 345–360. doi :10.1109/TSE.2015.2487274. S2CID  15927031.
  42. ^ Nick Stephens; Juan Grosen; Christopher Salls; Andrés holandés; Ruoyu Wang; Jacopo Corbetta; Yan Shoshitaishvili; Cristóbal Kruegel; Giovanni Vigna (24 de febrero de 2016). Perforador: Aumentando. Borrando la ejecución simbólica selectiva (PDF) . Actas del Simposio de redes y sistemas distribuidos (NDSS'16).
  43. ^ Marcel Böhme; Van-Thuan Pham; Abhik Roychoudhury (28 de octubre de 2016). "Greybox Fuzzing basado en cobertura como cadena de Markov". Actas de la Conferencia ACM SIGSAC 2016 sobre seguridad informática y de las comunicaciones . Actas de la Conferencia ACM sobre seguridad informática y de las comunicaciones (CCS'16). págs. 1032-1043. doi :10.1145/2976749.2978428. ISBN 9781450341394. S2CID  3344888.
  44. ^ Hamlet, Richard G.; Taylor, Ross (diciembre de 1990). "Las pruebas de partición no inspiran confianza". Transacciones IEEE sobre ingeniería de software . 16 (12): 1402-1411. doi : 10.1109/32.62448.
  45. ^ Weyuker, Elaine J. (1 de noviembre de 1982). "Sobre la prueba de programas no comprobables". La revista informática . 25 (4): 465–470. doi : 10.1093/comjnl/25.4.465 .
  46. ^ Barr, conde T.; Harman, Marcos; McMinn, Phil; Shahbaz, Muzammil; Yoo, Shin (1 de mayo de 2015). "El problema de Oracle en las pruebas de software: una encuesta" (PDF) . Transacciones IEEE sobre ingeniería de software . 41 (5): 507–525. doi : 10.1109/TSE.2014.2372785 . S2CID  7165993.
  47. ^ "Documentación del compilador Clang". clang.llvm.org . Consultado el 13 de marzo de 2017 .
  48. ^ "Opciones de desinfectante GNU GCC". gcc.gnu.org . Consultado el 13 de marzo de 2017 .
  49. ^ Orso, Alejandro; Xie, Tao (2008). "BERTO". Actas del taller internacional de 2008 sobre análisis dinámico: celebrado junto con el Simposio internacional ACM SIGSOFT sobre pruebas y análisis de software (ISSTA 2008) . ACM. págs. 36–42. doi :10.1145/1401827.1401835. ISBN 9781605580548. S2CID  7506576.
  50. ^ McKeeman, William M. (1998). "Pruebas diferenciales de software" (PDF) . Revista Técnica Digital . 10 (1): 100–107.
  51. ^ Babic, Domagoj; Martignoni, Lorenzo; McCamant, Stephen; Canción, amanecer (2011). "Generación de pruebas automatizadas dinámicas dirigidas estáticamente". Actas del Simposio internacional sobre pruebas y análisis de software de 2011 . ACM. págs. 12-22. doi :10.1145/2001420.2001423. ISBN 9781450305624. S2CID  17344927.
  52. ^ ab Sesterhenn, Eric; Wever, Berend-Jan; Orrù, Michele; Vervier, Markus (19 de septiembre de 2017). "Informe técnico sobre seguridad del navegador" (PDF) . X41D SEC GmbH.
  53. ^ "Mejoras de seguridad para Microsoft Edge (Microsoft Edge para profesionales de TI)". Microsoft . 15 de octubre de 2017 . Consultado el 31 de agosto de 2018 .
  54. ^ "Herramientas de clasificación del CERT". División CERT del Instituto de Ingeniería de Software (SEI) de la Universidad Carnegie Mellon (CMU) . Consultado el 14 de marzo de 2017 .
  55. ^ "Microsoft! Analizador de fallos explotable". CódigoPlex . Consultado el 14 de marzo de 2017 .
  56. ^ "Reducción de casos de prueba". 2011-07-18.
  57. ^ "Técnicas de reducción de casos de prueba de IBM". 2011-07-18. Archivado desde el original el 10 de enero de 2016 . Consultado el 18 de julio de 2011 .
  58. ^ Zeller, Andrés; Hildebrandt, Ralf (febrero de 2002). "Simplificar y aislar las entradas que provocan fallos". Transacciones IEEE sobre ingeniería de software . 28 (2): 183–200. CiteSeerX 10.1.1.180.3357 . doi : 10.1109/32.988498. ISSN  0098-5589 . Consultado el 14 de marzo de 2017 . 
  59. ^ Hazimeh, Ahmad; Herrera, Adrián; Pagador, Mathias (15 de junio de 2021). "Magma: un punto de referencia de confusión de la verdad fundamental". Actas de la ACM sobre medición y análisis de sistemas informáticos . 4 (3): 49:1–49:29. arXiv : 2009.01120 . doi :10.1145/3428334. S2CID  227230949.
  60. ^ Li, Yuwei; Ji, hombro; Chen, Yuan; Liang, Sizhuang; Lee, Wei-Han; Chen, Yueyao; Lyu, Chenyang; Wu, Chunming; Beyah, Raheem; Cheng, Peng; Lu, Kangjie; Wang, Ting (2021). {UNIFUZZ}: una plataforma holística y pragmática {basada en métricas} para evaluar Fuzzers. págs. 2777–2794. ISBN 978-1-939133-24-3.
  61. ^ Hazimeh, Herrera y Pagador 2021, pag. 1: "Evaluamos siete fuzzers basados ​​en mutaciones (AFL,...) ampliamente utilizados".
  62. ^ Li y col. 2021, pág. 1: "Utilizando UniFuzz, realizamos evaluaciones en profundidad de varios fuzzers destacados, incluido AFL, ...".
  63. ^ Hazimeh, Herrera y Pagador 2021, pag. 1: "Evaluamos siete fuzzers basados ​​en mutaciones ampliamente utilizados (..., AFL++,...)".
  64. ^ Li y col. 2021, pág. 1: "Utilizando UniFuzz, realizamos evaluaciones en profundidad de varios fuzzers destacados, incluidos AFL, AFLFast, ...".
  65. ^ Li y col. 2021, pág. 1: "Utilizando UniFuzz, realizamos evaluaciones en profundidad de varios fuzzers destacados, incluidos AFL,..., Angora,...".
  66. ^ Hazimeh, Herrera y Pagador 2021, pag. 1: "Evaluamos siete fuzzers basados ​​en mutaciones ampliamente utilizados (..., honggfuzz,...)".
  67. ^ Li y col. 2021, pág. 1: "Utilizando UniFuzz, realizamos evaluaciones en profundidad de varios fuzzers destacados, incluidos AFL, ..., Honggfuzz, ...".
  68. ^ Li y col. 2021, pág. 1: "Utilizando UniFuzz, realizamos evaluaciones en profundidad de varios fuzzers destacados, incluidos AFL,..., QSYM,...".
  69. ^ Hazimeh, Herrera y Pagador 2021, pag. 1: "Evaluamos siete fuzzers basados ​​en mutaciones ampliamente utilizados (... y SymCC-AFL)".
  70. ^ Hazimeh, Herrera y Pagador 2021, pag. 14.
  71. ^ Li y col. 2021, pág. 1: "Utilizando UniFuzz, realizamos evaluaciones en profundidad de varios fuzzers destacados, incluidos AFL, ..., T-Fuzz, ...".
  72. ^ Li y col. 2021, pág. 1: "Utilizando UniFuzz, realizamos evaluaciones en profundidad de varios fuzzers destacados, incluidos AFL,... y VUzzer64".

Otras lecturas

enlaces externos