stringtranslate.com

American Fuzzy Lop (software)

American Fuzzy Lop ( AFL ), estilizado en minúsculas como american fuzzy lop , es un fuzzer de software libre que emplea algoritmos genéticos para aumentar eficientemente la cobertura de código de los casos de prueba . Hasta ahora ha detectado docenas de errores de software significativos en los principales proyectos de software libre, incluidos X.Org Server , [2] PHP , [3] OpenSSL , [4] [5] pngcrush , bash , [6] Firefox , [7] BIND , [8] [9] Qt , [10] y SQLite . [11]

Durante muchos años después de su lanzamiento, AFL ha sido considerado un fuzzer de "última generación". [12] AFL se considera "un estándar de facto para fuzzing", [13] y el lanzamiento de AFL contribuyó significativamente al desarrollo de fuzzing como un área de investigación. [14] AFL se usa ampliamente en el ámbito académico; los fuzzers académicos a menudo son bifurcaciones de AFL, y AFL se usa comúnmente como una línea base para evaluar nuevas técnicas. [15] [16]

El código fuente de American Fuzzy Lop está publicado en GitHub . Su nombre es una referencia a una raza de conejo, el American Fuzzy Lop .

American Fuzzy Lop (AFL), cuyo nombre completo es American Fuzzy Lop, es un fuzzer de software libre que emplea algoritmos genéticos para aumentar de manera eficiente la cobertura de código de los casos de prueba. Lanzado inicialmente en noviembre de 2013, AFL [17] se convirtió rápidamente en uno de los fuzzers más utilizados en la investigación de seguridad.

Descripción general

AFL requiere que el usuario proporcione un comando de muestra que ejecute la aplicación probada y al menos una pequeña entrada de ejemplo. La entrada se puede introducir en el programa probado mediante una entrada estándar o como un archivo de entrada especificado en la línea de comandos del proceso. Actualmente, no se admite directamente el fuzzing de programas en red, aunque en algunos casos existen soluciones factibles para este problema. [18] Por ejemplo, en el caso de un reproductor de audio, se puede indicar a American fuzzy lop que abra un archivo de sonido corto con él. Luego, el fuzzer intenta ejecutar realmente el comando especificado y, si lo logra, intenta reducir el archivo de entrada al más pequeño que active el mismo comportamiento.

Después de esta fase inicial, AFL comienza el proceso real de fuzzing aplicando varias modificaciones al archivo de entrada. Cuando el programa probado falla o se cuelga , esto generalmente implica el descubrimiento de un nuevo error, posiblemente una vulnerabilidad de seguridad . En este caso, el archivo de entrada modificado se guarda para una inspección posterior del usuario.

Para maximizar el rendimiento del fuzzing, American fuzzy lop espera que el programa probado se compile con la ayuda de un programa de utilidad que instrumenta el código con funciones auxiliares que rastrean el flujo de control . Esto permite que el fuzzer detecte cuándo cambia el comportamiento del objetivo en respuesta a la entrada. En los casos en que esto no es posible, también se admiten las pruebas de caja negra .

Algoritmo de fuzzing

El logotipo de AFL a partir de la entrada difusa se unió como una única animación. [19]

Los fuzzers intentan encontrar comportamientos inesperados (es decir, errores ) en un programa de destino mediante la ejecución repetida del programa en varias entradas. Como se describió anteriormente, AFL es un fuzzer de caja gris , lo que significa que inyecta instrumentación para medir la cobertura del código en el programa de destino en tiempo de compilación y utiliza la métrica de cobertura para dirigir la generación de nuevas entradas. El algoritmo de fuzzing de AFL ha influido en muchos fuzzers de caja gris posteriores. [20] [21]

Las entradas de AFL son un programa objetivo instrumentado (el sistema bajo prueba ) y un corpus , es decir, una colección de entradas al objetivo. Las entradas también se conocen como casos de prueba . El algoritmo mantiene una cola de entradas, que se inicializa en el corpus de entrada. El algoritmo general funciona de la siguiente manera: [22]

  1. Cargar la siguiente entrada de la cola
  2. Minimizar el caso de prueba
  3. Mute el caso de prueba. Si alguna mutación genera una cobertura de código adicional, agréguela a la cola. Si la mutación genera un bloqueo o una falla, guárdela en el disco para inspeccionarla más adelante.
  4. Ir al paso 1

Mutación

Para generar nuevas entradas, AFL aplica varias mutaciones a las entradas existentes. [23] Estas mutaciones son en su mayoría independientes del formato de entrada del programa de destino; generalmente tratan la entrada como un simple bloque de datos binarios .

En primer lugar, AFL aplica una secuencia determinista de mutaciones a cada entrada. Estas se aplican en varios puntos de la entrada. Entre ellas se incluyen: [24] [25]

Después de aplicar todas las mutaciones deterministas disponibles, AFL pasa a la etapa de estragos , en la que se aplican entre 2 y 128 mutaciones seguidas. Estas mutaciones son cualquiera de las siguientes: [23]

Si AFL recorre toda la cola sin generar ninguna entrada que logre una nueva cobertura de código, comienza el empalme . El empalme toma dos entradas de la cola, las trunca en posiciones arbitrarias, las concatena y aplica la etapa de havoc al resultado.

Medición de la cobertura

AFL fue pionero en el uso de recuentos de hits agrupados para medir la cobertura del código. [28] El autor afirma que esta técnica mitiga la explosión de rutas . [29] [30]

Conceptualmente, AFL cuenta la cantidad de veces que una ejecución dada del objetivo atraviesa cada borde en el gráfico de flujo de control del objetivo ; la documentación se refiere a estos bordes como tuplas y a los recuentos como hitcounts . Al final de la ejecución, los hitcounts se agrupan en los siguientes ocho grupos: 1, 2, 3, 4–7, 8–15, 16–31, 32–127 y 128 y mayores. AFL mantiene un conjunto global de pares (tupla, recuento agrupado) que se han producido por cualquier ejecución hasta el momento. Una entrada se considera "interesante" y se agrega a la cola si produce un par (tupla, recuento agrupado) que aún no está en el conjunto global.

En la práctica, los recuentos de visitas se recopilan y procesan utilizando un esquema eficiente pero con pérdidas . La instrumentación en tiempo de compilación inyecta código que es conceptualmente similar al siguiente en cada rama del gráfico de flujo de control del programa de destino: [31]

ubicación_actual = < TIEMPO_DE_COMPILACIÓN_ALEATORIO > ; memoria_compartida [ ubicación_actual ^ ubicación_anterior ] ++ ; ubicación_anterior = ubicación_actual >> 1 ;        

donde <COMPILE_TIME_RANDOM>es un entero aleatorio y es una región de memoria de shared_mem64 kilobytes compartida entre el fuzzer y el objetivo.

Esta representación es más detallada (distingue entre más ejecuciones) que la cobertura simple de bloques o declaraciones, pero aún permite una prueba de "interés" en tiempo lineal.

Minimización

Suponiendo que las entradas más pequeñas toman menos tiempo para ejecutarse, AFL intenta minimizar o recortar los casos de prueba en la cola. [23] [32] El recorte funciona eliminando bloques de la entrada; si la entrada recortada todavía da como resultado la misma cobertura (ver #Medición de la cobertura), entonces la entrada original se descarta y la entrada recortada se guarda en la cola.

Programación

AFL selecciona un subconjunto de entradas favorecidas de la cola, las entradas no favorecidas se omiten con cierta probabilidad. [33] [28]

Características

Características de rendimiento

Uno de los desafíos que American Fuzzy Lop tuvo que resolver fue la generación eficiente de cientos de procesos por segundo. Además del motor original que generaba cada proceso desde cero, American Fuzzy Lop ofrece el motor predeterminado que depende en gran medida de la forkllamada al sistema. [34] [28] Esto se puede acelerar aún más aprovechando el modo de servidor de bifurcación diferida de LLVM o el modo persistente similar, pero esto tiene el costo de tener que modificar el programa probado. [35] Además, American Fuzzy Lop admite la prueba de fuzzing del mismo programa en la red.

Interfaz de usuario

American fuzzy lop cuenta con una interfaz de línea de comandos colorida que muestra estadísticas en tiempo real sobre el proceso de fuzzing. Se pueden activar varias configuraciones mediante opciones de línea de comandos o variables de entorno . Además de eso, los programas pueden leer estadísticas de tiempo de ejecución de archivos en un formato legible por máquina.

Programas de utilidad

Además de afl-fuzzlas herramientas y que se pueden utilizar para la instrumentación binaria, American Fuzzy Lop cuenta con programas de utilidad diseñados para supervisar el proceso de fuzzing. Además de eso, existen afl-cminy afl-tmin, que se pueden utilizar para la minimización de casos de prueba y corpus de prueba. Esto puede ser útil cuando los casos de prueba generados por afl-fuzzse utilizarían por otros fuzzers.

Tenedores

AFL se ha bifurcado muchas veces con el fin de examinar nuevas técnicas de fuzzing o aplicar fuzzing a diferentes tipos de programas. Algunas de las bifurcaciones más notables son:

AFL++

AFL++ ( AFLplusplus ) [43] es una bifurcación de AFL mantenida por la comunidad y creada debido a la relativa inactividad del desarrollo de AFL de Google desde septiembre de 2017. Incluye nuevas características y aceleraciones. [44]

La iniciativa OSS-Fuzz de Google, que proporciona servicios de fuzzing gratuitos para software de código abierto, reemplazó su opción AFL con AFL++ en enero de 2021. [45] [46]

Referencias

Notas

  1. ^ "Lanzamientos - google/AFL" . Consultado el 19 de enero de 2021 – vía GitHub .
  2. ^ "Aviso-2015-03-17". x.org .
  3. ^ "NVD - Detalle". nist.gov .
  4. ^ "NVD - Detalle". nist.gov .
  5. ^ "NVD - Detalle". nist.gov .
  6. ^ "CVE - CVE-2014-6278". mitre.org .
  7. ^ "CVE - CVE-2014-8637". mitre.org .
  8. ^ "Cómo fuzzear un servidor con American Fuzzy Lop". Fastly . 21 de julio de 2015.
  9. ^ "CVE - CVE-2015-5477". mitre.org .
  10. ^ "[Anuncio] Aviso de seguridad del proyecto Qt: Múltiples vulnerabilidades en el manejo del formato de imagen Qt". qt-project.org . 13 de abril de 2015.
  11. ^ "Cómo se prueba SQLite n.º 4.1.1. SQL Fuzz utilizando el American Fuzzy Lop Fuzzer". sqlite.org .
  12. ^ Poncelet, Clement; Sagonas, Konstantinos; Tsiftes, Nicolas (5 de enero de 2023). "Tantos fuzzers, tan poco tiempo✱". Actas de la 37.ª Conferencia internacional IEEE/ACM sobre ingeniería de software automatizada . ASE '22. Nueva York, NY, EE. UU.: Association for Computing Machinery. págs. 1–12. doi :10.1145/3551349.3556946. ISBN 978-1-4503-9475-8.S2CID253456740  .​
  13. ^ Fioraldi y col. 2023, pág. 2.
  14. ^ Fioraldi, Andrea; Maier, Dominik Christian; Zhang, Dongjia; Balzarotti, Davide (7 de noviembre de 2022). "LibAFL". Actas de la Conferencia ACM SIGSAC de 2022 sobre seguridad informática y de las comunicaciones . CCS '22. Nueva York, NY, EE. UU.: Association for Computing Machinery. págs. 1051–1065. doi :10.1145/3548606.3560602. ISBN 978-1-4503-9450-5.S2CID253410747  .​"El lanzamiento de AFL marcó un hito importante en el área de pruebas de seguridad de software, revitalizando el fuzzing como un tema de investigación importante".
  15. ^ Hazimeh, Ahmad; Herrera, Adrian; Payer, Mathias (15 de junio de 2021). "Magma: un punto de referencia de fuzzing de 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.
  16. ^ Metzman y otros. 2021.
  17. ^ "Software de gestión y generación de informes de pruebas". www.aflglobal.com . Consultado el 13 de agosto de 2024 .
  18. ^ Technion. "Fuzzing nginx - Búsqueda de vulnerabilidades con afl-fuzz". lolware.net .
  19. ^ Zalewski, Michał (27 de febrero de 2015). «Logotipo de afl-fuzz». afl-users | Grupos de Google . Consultado el 25 de julio de 2019 .
  20. ^ Fioraldi y otros. 2023.
  21. ^ Chen, Peng; Chen, Hao (mayo de 2018). "Angora: análisis de errores de codificación eficiente mediante búsqueda basada en principios". Simposio IEEE sobre seguridad y privacidad de 2018 (SP) . págs. 711–725. doi :10.1109/SP.2018.00046. ISBN 978-1-5386-4353-2. Número de identificación del sujeto  3729194.
  22. ^ "Motivación detrás de AFL — Documentación de AFL 2.53b". afl-1.readthedocs.io . Consultado el 26 de febrero de 2023 .
  23. ^ abcd Fioraldi y col. 2023, pág. 6.
  24. ^ "Estrategias de fuzzing binario: qué funciona y qué no". lcamtuf.blogspot.com . 8 de agosto de 2014.
  25. ^ "Guía del usuario de AFL: documentación de AFL 2.53b". afl-1.readthedocs.io . Consultado el 26 de febrero de 2023 .
  26. ^ "Cómo encontrar errores en SQLite de forma sencilla". lcamtuf.blogspot.com . 14 de abril de 2015.
  27. ^ Manès, Valentín JM; Han, HyungSeok; Han, Choongwoo; Cha, Sang Kil; Egele, Manuel; Schwartz, Edward J.; Woo, Maverick (noviembre de 2021). "El arte, la ciencia y la ingeniería del fuzzing: una encuesta". Transacciones IEEE sobre ingeniería de software . 47 (11): 2312–2331. arXiv : 1812.00140 . doi :10.1109/TSE.2019.2946563. ISSN  1939-3520. S2CID  102351047.
  28. ^ abc Fioraldi y col. 2023, pág. 5.
  29. ^ "Libro blanco" técnico para afl-fuzz".
  30. ^ "Más información sobre AFL: documentación de AFL 2.53b". afl-1.readthedocs.io . Consultado el 27 de febrero de 2023 ."Este enfoque permite una exploración muy detallada y a largo plazo del estado del programa sin tener que realizar comparaciones globales frágiles y de alto consumo computacional de trazas de ejecución complejas, y al mismo tiempo evitando el flagelo de la explosión de rutas".
  31. ^ "Más información sobre AFL: documentación de AFL 2.53b". afl-1.readthedocs.io . Consultado el 27 de febrero de 2023 .
  32. ^ "Más información sobre AFL: documentación de AFL 2.53b". afl-1.readthedocs.io . Consultado el 27 de febrero de 2023 .
  33. ^ "Más información sobre AFL: documentación de AFL 2.53b". afl-1.readthedocs.io . Consultado el 27 de febrero de 2023 .
  34. ^ "Errores en programas aleatorios sin execve()". lcamtuf.blogspot.com . 14 de octubre de 2014.
  35. ^ "Novedades en AFL: modo persistente". Blog de lcamtuf . 11 de junio de 2015.
  36. ^ Liu, Chenyang; Ji, hombro; Zhang, Chao; Li, Yuwei; Lee, Wei-Han; Canción, Yu; Beyah, Raheem (2019). {MOPT}: Programación de mutaciones optimizada para Fuzzers. págs. 1949-1966. ISBN 978-1-939133-06-9.
  37. ^ Böhme, Marcel; Pham, Van-Thuan; Roychoudhury, Abhik (mayo de 2019). "Greybox Fuzzing basado en cobertura como cadena de Markov". Transacciones IEEE sobre ingeniería de software . 45 (5): 489–506. doi :10.1109/TSE.2017.2785841. ISSN  1939-3520.
  38. ^ Pham, Van-Thuan; Böhme, Marcel; Santosa, Andrés E.; Căciulescu, Alexandru Răzvan; Roychoudhury, Abhik (septiembre de 2021). "Fusing inteligente de Greybox". Transacciones IEEE sobre ingeniería de software . 47 (9): 1980–1997. doi :10.1109/TSE.2019.2941681. ISSN  1939-3520. S2CID  53721813.
  39. ^ Böhme, Marcel; Pham, Van-Thuan; Nguyen, Manh-Dung; Roychoudhury, Abhik (30 de octubre de 2017). "Directed Greybox Fuzzing". Actas de la Conferencia ACM SIGSAC de 2017 sobre seguridad informática y de las comunicaciones . CCS '17. Nueva York, NY, EE. UU.: Association for Computing Machinery. págs. 2329–2344. doi :10.1145/3133956.3134020. ISBN . 978-1-4503-4946-8. Número de identificación del sujeto  29430742.
  40. ^ Poeplau, Sebastian; Francillon, Aurélien (2020). Ejecución simbólica con {SymCC}: ¡No interpretes, compila!. pp. 181–198. ISBN 978-1-939133-17-5.
  41. ^ WinAFL, Google Project Zero, 23 de febrero de 2023 , consultado el 26 de febrero de 2023
  42. ^ "Lanzamientos - AFLplusplus/AFLplusplus" . Consultado el 1 de noviembre de 2023 – vía GitHub .
  43. ^ Fioraldi, Andrea; Maier, Dominik; Eißfeldt, Heiko; Heuse, Marc (agosto de 2020). AFL++: Combinación de pasos incrementales de investigación sobre fuzzing. 14.º taller USENIX sobre tecnologías ofensivas (WOOT 20).
  44. ^ "El marco de trabajo de fuzzing AFL++". AFLplusplus .
  45. ^ metzman, jonathan. "[afl++] Use AFL++ en lugar de AFL para fuzzing. por jonathanmetzman · Solicitud de incorporación de cambios n.° 5046 · google/oss-fuzz". GitHub .
  46. ^ Metzman y col. 2021, pág. 1394.

Fuentes

Lectura adicional

Enlaces externos