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]
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
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]
Cargar la siguiente entrada de la cola
Minimizar el caso de prueba
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.
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]
Sobrescribir partes de la entrada con "aproximadamente dos docenas de valores 'interesantes'", incluidos cero y números enteros con y sin signo máximos y mínimos de varios anchos, nuevamente en codificaciones little-endian y big- endian .
Reemplazar partes de la entrada con datos extraídos de un "diccionario" de tokens especificados por el usuario o detectados automáticamente (por ejemplo, bytes mágicos o palabras clave en un formato basado en texto) [26] [23] [27]
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]
Las mutaciones deterministas descritas anteriormente
Sobrescribir bytes con valores aleatorios
Operaciones sobre "bloques" multibyte:
Eliminar bloques
Duplicando bloques
Establecer cada byte de un bloque con un único valor
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]
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++
Ministerio de Obras Públicas y Comunicaciones (MOPT) [36]
AFLFast [37]
AFLSmart [38]
AFLGo [39]
Simulación de la AFL [40]
WinAFL, "una bifurcación de AFL para fuzzear binarios de Windows" [41]
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
^ "Lanzamientos - google/AFL" . Consultado el 19 de enero de 2021 – vía GitHub .
^ "Aviso-2015-03-17". x.org .
^ "NVD - Detalle". nist.gov .
^ "NVD - Detalle". nist.gov .
^ "NVD - Detalle". nist.gov .
^ "CVE - CVE-2014-6278". mitre.org .
^ "CVE - CVE-2014-8637". mitre.org .
^ "Cómo fuzzear un servidor con American Fuzzy Lop". Fastly . 21 de julio de 2015.
^ "CVE - CVE-2015-5477". mitre.org .
^ "[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.
^ "Cómo se prueba SQLite n.º 4.1.1. SQL Fuzz utilizando el American Fuzzy Lop Fuzzer". sqlite.org .
^ 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. ISBN978-1-4503-9475-8.S2CID253456740 .
^ Fioraldi y col. 2023, pág. 2.
^ 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. ISBN978-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".
^ 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.
^ Metzman y otros. 2021.
^ "Software de gestión y generación de informes de pruebas". www.aflglobal.com . Consultado el 13 de agosto de 2024 .
^ Technion. "Fuzzing nginx - Búsqueda de vulnerabilidades con afl-fuzz". lolware.net .
^ Zalewski, Michał (27 de febrero de 2015). «Logotipo de afl-fuzz». afl-users | Grupos de Google . Consultado el 25 de julio de 2019 .
^ Fioraldi y otros. 2023.
^ 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. ISBN978-1-5386-4353-2. Número de identificación del sujeto 3729194.
^ "Motivación detrás de AFL — Documentación de AFL 2.53b". afl-1.readthedocs.io . Consultado el 26 de febrero de 2023 .
^ abcd Fioraldi y col. 2023, pág. 6.
^ "Estrategias de fuzzing binario: qué funciona y qué no". lcamtuf.blogspot.com . 8 de agosto de 2014.
^ "Guía del usuario de AFL: documentación de AFL 2.53b". afl-1.readthedocs.io . Consultado el 26 de febrero de 2023 .
^ "Cómo encontrar errores en SQLite de forma sencilla". lcamtuf.blogspot.com . 14 de abril de 2015.
^ 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.
^ abc Fioraldi y col. 2023, pág. 5.
^ "Libro blanco" técnico para afl-fuzz".
^ "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".
^ "Más información sobre AFL: documentación de AFL 2.53b". afl-1.readthedocs.io . Consultado el 27 de febrero de 2023 .
^ "Más información sobre AFL: documentación de AFL 2.53b". afl-1.readthedocs.io . Consultado el 27 de febrero de 2023 .
^ "Más información sobre AFL: documentación de AFL 2.53b". afl-1.readthedocs.io . Consultado el 27 de febrero de 2023 .
^ "Errores en programas aleatorios sin execve()". lcamtuf.blogspot.com . 14 de octubre de 2014.
^ "Novedades en AFL: modo persistente". Blog de lcamtuf . 11 de junio de 2015.
^ 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. ISBN978-1-939133-06-9.
^ 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.
^ 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.
^ 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.
^ Poeplau, Sebastian; Francillon, Aurélien (2020). Ejecución simbólica con {SymCC}: ¡No interpretes, compila!. pp. 181–198. ISBN978-1-939133-17-5.
^ WinAFL, Google Project Zero, 23 de febrero de 2023 , consultado el 26 de febrero de 2023
^ "Lanzamientos - AFLplusplus/AFLplusplus" . Consultado el 1 de noviembre de 2023 – vía GitHub .
^ 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).
^ "El marco de trabajo de fuzzing AFL++". AFLplusplus .
^ 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 .
^ Metzman y col. 2021, pág. 1394.
Fuentes
Fioraldi, Andrea; Mantovani, Alessandro; Maier, Dominik; Balzarotti, Davide (20 de enero de 2023). "Disección del Fuzzy Lop americano: una evaluación de FuzzBench". ACM Transactions on Software Engineering and Methodology . 32 (2): 1–26. doi :10.1145/3580596. ISSN 1049-331X. S2CID 247088398.
Metzman, Jonathan; Szekeres, László; Simon, Laurent; Sprabery, Read; Arya, Abhishek (18 de agosto de 2021). "FuzzBench: una plataforma y un servicio de evaluación comparativa de fuzzers abiertos". Actas de la 29.ª reunión conjunta de la ACM sobre la conferencia y el simposio europeos de ingeniería de software sobre los fundamentos de la ingeniería de software . ESEC/FSE 2021. Nueva York, NY, EE. UU.: Association for Computing Machinery. págs. 1393–1403. doi :10.1145/3468264.3473932. ISBN 978-1-4503-8562-6. Número de identificación del sujeto 237205274.
Lectura adicional
El "libro blanco" técnico de la AFL, escrito por el autor original Michał Zalewski
Libro de recetas de seguridad en Internet y en sistemas múltiples, Hors-Serie No. 11 "Outils de sécurité", p. 36, "American Fuzzy Lop", Kevin Denis, junio de 2015. [1] Archivado el 6 de mayo de 2016 en Wayback Machine .
"Fuzz y cuerdas (lwn.net)"
"Fuzzing (en) FreeBSD - Descubrimiento de errores (en su mayoría) automatizado con seguridad/afl" - una presentación en FOSDEM
"Pruebas con dos misiles buscadores de fallos: fuzzing y pruebas basadas en propiedades": una presentación en EuroPython 2015.
"El proyecto Fuzzing"
"Fuzzing Code with AFL", Peter Gutmann, ;login, vol. 41, n.º 2, verano de 2016, [2]
Enlaces externos
Documentación oficial de la AFL
El blog de Michał Zalewski, autor de AFL. El blog contiene varias publicaciones que profundizan en los detalles técnicos de AFL.