1 puntos por GN⁺ 2024-10-07 | 1 comentarios | Compartir por WhatsApp
  • Fuzzing-101 es un curso creado para que quienes están aprendiendo fuzzing por primera vez practiquen el proceso de encontrar vulnerabilidades en software real
  • El curso está compuesto por 10 objetivos reales y 10 ejercicios, y cubre Xpdf, libexif, TCPdump, LibTIFF, Libxml2, GIMP, VLC media player, Adobe Reader, 7-Zip y Google Chrome/V8
  • Cada ejercicio tiene como objetivo reproducir o descubrir un CVE, y utiliza herramientas como AFL++, ASan, LCOV, WinAFL y Fuzzilli junto con vulnerabilidades como CVE-2019-13288, CVE-2016-2334 y CVE-2019-5847
  • El requisito para tomar el curso es un sistema Linux con conexión a internet; se recomienda manejo básico de Linux y todos los ejercicios fueron probados en Ubuntu 20.04.2 LTS
  • El fuzzing es una técnica automatizada de pruebas que introduce entradas aleatorias o mutadas en un programa y monitorea excepciones o crashes; este curso toma como objeto de estudio el funcionamiento básico de los fuzzers evolutivos guiados por cobertura

Objetivo del curso y público objetivo

  • Fuzzing-101 es un curso para personas que quieren aprender fuzzing como profesionales pero no saben por dónde empezar
  • El curso está compuesto por 10 objetivos reales y 10 ejercicios
  • El público objetivo es el siguiente
    • Personas que quieren aprender los fundamentos del fuzzing
    • Personas que quieren aprender cómo encontrar vulnerabilidades en proyectos de software reales

Estructura de los ejercicios

  • Cada ejercicio presenta el software específico, el CVE a encontrar, el tiempo estimado y los temas principales
Ejercicio Objetivo CVE a encontrar Tiempo estimado Temas principales
Exercise 1 Xpdf CVE-2019-13288 120 minutos Afl-clang-fast, Afl-fuzz, GDB
Exercise 2 libexif CVE-2009-3895, CVE-2012-2836 6 horas Afl-clang-lto, fuzzing de librerías, Eclipse IDE
Exercise 3 TCPdump CVE-2017-13028 4 horas ASan, Sanitizers
Exercise 4 LibTIFF CVE-2016-9297 3 horas cobertura de código, LCOV
Exercise 5 Libxml2 CVE-2017-9048 3 horas diccionario, paralelización básica, fuzzing de argumentos de línea de comandos
Exercise 6 GIMP CVE-2016-4994, bug extra 7 horas fuzzing persistente, fuzzing de aplicaciones interactivas
Exercise 7 VLC media player CVE-2019-14776 6 horas instrumentación parcial, harness de fuzzing
Exercise 8 Adobe Reader ninguno 8 horas fuzzing de aplicaciones de código cerrado, instrumentación con QEMU
Exercise 9 7-Zip CVE-2016-2334 8 horas WinAFL, fuzzing de aplicaciones Windows
Exercise 10 Google Chrome / V8 CVE-2019-5847 8 horas Fuzzilli, fuzzing de motores JavaScript

Entorno de ejecución y herramientas

  • Lo necesario es un sistema Linux con conexión a internet
  • Se proporciona una imagen de VMware que puede usarse en los ejercicios
  • Se recomienda enfáticamente tener conocimientos básicos de uso de Linux
  • Todos los ejercicios fueron probados en Ubuntu 20.04.2 LTS
  • El curso usa AFL++
    • AFL++ se presenta como un fork más nuevo y superior de AFL de Michał “lcamtuf” Zalewski

Conceptos básicos de fuzzing

  • La prueba de fuzz (fuzz testing) o fuzzing es una técnica automatizada de pruebas de software que introduce entradas aleatorias o mutadas en un programa y monitorea excepciones o crashes
  • Se presentan como ejemplos de fuzzers exitosos en aplicaciones reales AFL, libFuzzer y HonggFuzz
  • Estas tres herramientas son ejemplos de fuzzers evolutivos guiados por cobertura

Fuzzers evolutivos guiados por cobertura

  • El enfoque evolutivo (evolutionary) es un método metaheurístico inspirado en algoritmos evolutivos
    • Un conjunto inicial de entradas, llamadas seeds, evoluciona y se muta con el tiempo
    • Como ejemplo de criterio de selección se usa la cobertura
  • Un fuzzer guiado por cobertura (coverage-guided) recopila y compara datos de cobertura de código por entrada para aumentar la probabilidad de encontrar nuevos crashes
    • La recopilación de cobertura normalmente se realiza mediante instrumentación
    • Se seleccionan las entradas que llevan a nuevas rutas de ejecución

Historial de cambios

  • 2022-02-14: se corrigieron algunos errores tipográficos de wget en Exercise 5
  • 2021-11-25: Exercise 3 se actualizó con algunas correcciones

1 comentarios

 
GN⁺ 2024-10-07
Opiniones de Hacker News
  • Anécdota relacionada con fuzzing: https://threadreaderapp.com/thread/1799457232607985698
    Excelente lectura si quieres perder unos 11 minutos

    • Google muestra un artículo de CNET de 2007; probablemente porque eEye “repartió comunicados de prensa por todos lados”: https://www.cnet.com/news/privacy/flaw-found-in-office-2007/
      No termino de entender la cultura de competir para encontrar bugs en productos de otras empresas y luego presumir que encontraron uno precisamente en Microsoft Publisher, menospreciando a Microsoft
      Quizá todos tengamos suerte si contamos con una empresa cuyo “proceso estándar” es pasar toda la semana en vela probando nuestro producto
    • El estilo de escritura definitivamente lo hace más entretenido
      Al revisar al autor, podría ser alguien que conocía de IRC, y “Mantis” e “infosec” encajan perfecto
  • Lo interesante es que esto contrasta claramente con el enfoque de Go
    En Go se puede ejecutar fuzzing con la misma facilidad que correr tests, por lo que es muy sencillo apuntar a partes específicas de una aplicación o biblioteca
    Por eso, muchas de estas técnicas se vuelven innecesarias
    Me da curiosidad qué técnicas hay para guiar mejor el fuzzing, pero por ahora parece que lo mejor es proporcionar un corpus de semillas y esperar que todo salga bien

    • Algunas herramientas de fuzzing, como libFuzzer, aprovechan la representación intermedia de LLVM para generar métricas de cobertura de código y retroalimentarlas al algoritmo de fuzzing para aumentar la cobertura de las pruebas
    • Alguna vez propuse como tema de doctorado la idea de usar aprendizaje por refuerzo para guiar la cobertura, pero al final no seguí ese camino y no sé si funcionaría
  • Me sorprende que Heartbleed no esté en la lista. Es muy fácil de reproducir

    • Parece que se omitió porque todos estos tutoriales usan archivos o datos locales y no cubren el fuzzing basado en red