Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
UTopia — Generación automatizada de fuzz drivers basada en UT | Kitploit
Herramientas/GitHubGitHub/samsung/utopia
Análisis Estático de Código (SAST)Análisis de VulnerabilidadesAnálisis de CódigoFuzzing
GitHubsamsung/utopia

UTopia

Generación automatizada de fuzz drivers basada en UT

Ver Repositorio
16827hace 1 añoRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Introducción

UTopia es una herramienta para generar automáticamente fuzz drivers a partir de pruebas unitarias.

UTopia permite a los desarrolladores realizar pruebas de fuzzing sin conocimientos especiales sobre cómo escribir fuzzers. Incluso los desarrolladores familiarizados con el fuzzing pueden ahorrar una cantidad significativa de tiempo generando fuzz drivers automáticamente.

UTopia es compatible con librerías de C/C++ que tienen pruebas unitarias con GoogleTest, Boost.Test o Tizen TCT.

Trofeo

Para ver errores encontrados por UTopia, visita la página Trofeo. También puedes ver algunos fuzzers basados en UTopia allí.

Docker

Para una configuración sencilla, proporcionamos una imagen de docker para ejecutar UTopia. Puedes construir UTopia y generar/ejecutar fuzzers dentro de un contenedor de docker.

Construye la imagen de docker con el siguiente comando.

root@kitploit:~
docker buildx build -f docker/Dockerfile -t utopia . #llvm-10
docker buildx build --build-arg LLVM_VERSION=12 -f docker/Dockerfile -t utopia . #llvm-12

UTopia está diseñado para funcionar mejor con LLVM versión 10. Además, se ha confirmado que supera las pruebas unitarias en LLVM versión 12. Por lo tanto, recomendamos usar LLVM 10, pero si lo deseas puedes probar LLVM versión 12.

Compilación

UTopia depende de LLVM, Protobuf y GoogleTest. Puedes instalar las dependencias manualmente, pero recomendamos usar la imagen de docker proporcionada.

Después de clonar el repositorio, inicializa y actualiza todos los submódulos:

root@kitploit:~
git submodule update --init --recursive

Para construir UTopia, sigue el proceso de cmake a continuación.

root@kitploit:~
cd $UTOPIA_HOME_DIR
cmake -B build -S .
cmake --build build -j$(nproc)

Ejecución

Para algunos proyectos seleccionados, puedes usar el script auxiliar para ejecutar nuestra herramienta sin esfuerzo adicional. Por favor, consulta helper/README.md. Para otros proyectos, consulta el manual a continuación.

target_analyzer

Target Analyzer analiza el código de la librería objetivo y genera un resultado como archivo json. Las opciones obligatorias de la línea de comandos son las siguientes.

root@kitploit:~
target_analyzer --db ${builddb_path} --extern ${extern_path} --public ${api_json_path} --out ${output_path}

builddb_path

Build db es un archivo json que contiene las rutas de los archivos AST e IR del código de la librería objetivo. Su formato se ve a continuación.

root@kitploit:~
{
  "bc": "/root/fuzz-test-generation/exp/sample/output/bc/libcommon.a.bc",
  "ast": [
    "/root/fuzz-test-generation/exp/sample/libcommon.a_ast/codec/common/src/ast1.o.ast",
    "/root/fuzz-test-generation/exp/sample/libcommon.a_ast/codec/common/src/ast2.o.ast"
  ],
  "project_dir": "/root/fuzz-test-generation/exp/sample"
}

La ruta del archivo bitcode de LLVM de una librería específica debe especificarse con la palabra clave "bc". Solo aceptamos un archivo bitcode hasta ahora, por lo que puedes usar llvm-link para enlazar varios archivos de bitcode en un solo archivo de bitcode.

Las rutas de los archivos AST de una librería específica deben especificarse con la palabra clave "ast". Ten en cuenta que el archivo bitcode especificado y los archivos ast se generan a partir de los mismos códigos fuente para una librería específica.

extern_path

Target Analyzer acepta el informe de target analyzer de otras librerías para obtener un resultado preciso. Esta ruta debe ser una ruta de directorio donde se almacenan otros informes, lo que significa que se permiten informes de más de una librería.

api_json_path

Nombres de las funciones API a analizar. Debe ser un archivo json con el formato siguiente.

root@kitploit:~
{
  "libcommon.a": [
    "API1",
    "API2",
    "API3"
  ]
}

Puedes obtener la lista de API de una librería específica usando el siguiente comando.

root@kitploit:~
nm --no-demangle --defined-only -g ${librarypath} | awk '$2=="T" {k=""; for(i=3;i<=NF;i++) k=k $i""; print k}'

Informe

Dirección

La propiedad Direction es un parámetro esencial que utiliza el target analyzer. Indica si un parámetro se emplea para lectura (Dir_In), escritura (Dir_Out), o para lectura y escritura (Dir_In | Dir_Out) dentro de una función. El target analyzer define esta propiedad mediante un tipo de enumeración que comprende los siguientes elementos:

root@kitploit:~
enum Dir {
  Dir_NoOp = 0x000,        // No operation
  Dir_In = 0x100,          // Input direction
  Dir_Out = 0x010,         // Output direction
  Dir_Unidentified = 0x001 // Unidentified direction
};

Por ejemplo, en el fragmento de archivo JSON proporcionado:

root@kitploit:~
{
  "Direction": {
    "BF_crypt(0)": 256,
    "BF_crypt(1)": 272,
    "BF_crypt(2)": 272,
    "BF_decode(1)": 272
  }
}
  • La entrada "BF_crypt(0)": 256 indica que la dirección del primer parámetro en la función BF_crypt está establecida en 256 (0x100), lo que significa una dirección In, es decir, se usa para entrada.
  • De manera similar, "BF_crypt(1)": 272 revela que la dirección del segundo parámetro en la función BF_crypt es 272 (0x110), lo que indica que tiene direcciones In y Out, es decir, se utiliza tanto para entrada como para salida.

Esta notación ayuda a comprender cómo se utiliza cada parámetro dentro de una función, ya sea para entrada, salida o ambos, proporcionando información clara sobre el flujo de datos y las operaciones que realiza la función.

ut_analyzer

UT Analyzer analiza el código de las pruebas unitarias de una librería objetivo y genera un resultado como archivo json. Las opciones obligatorias de la línea de comandos son las siguientes.

root@kitploit:~
ut_analyzer --entry ${entry_path} --extern ${extern_path} --ut ${ut_type} --name ${lib_name} --public ${api_json_path} --out ${output_path}

La mayoría de las opciones son las mismas que las de target_analyzer. Ten en cuenta que entry_path debe especificar los archivos AST/IR de un ejecutable de prueba unitaria, no de la librería.

ut_type

Framework utilizado por el proyecto objetivo; puede ser tct, gtest o boost.

fuzz_generator

fuzz_generator genera fuzz drivers utilizando los archivos de informe de target_anlayzer y ut_analyzer. Las opciones obligatorias de la línea de comandos son las siguientes.

root@kitploit:~
fuzz_generator --src ${src_path} --target ${target_analyzer_report_path} --ut ${ut_analyzer_report_path} --public ${api_json_path} --out ${output_dir}

src_path

src_path es la ruta del directorio donde se almacena el código fuente de las pruebas unitarias. fuzz_generator copia este directorio y genera el fuzz driver modificando esos archivos copiados.

Las demás opciones son las mismas que las opciones de target_analyzer.

Cómo funciona el fuzz driver

Esta sección describe la funcionalidad y los detalles de implementación del fuzz driver generado, lo cual es crucial para comprender cómo se integran las pruebas de fuzzing con el código fuente objetivo.

fuzz_entry.cc (Archivo generado automáticamente)

root@kitploit:~
DEFINE_PROTO_FUZZER(const AutoFuzz::FuzzArgsProfile &autofuzz_mutation) {
  ... /* Values are assigned from autofuzz_mutation */
  enterAutofuzz();
}

Esta función sirve como punto de entrada para el fuzz driver generado. Toma valores generados por el fuzzer y los asigna a variables que posteriormente se utilizan para invocar las funciones de la librería. Finalmente, la función llama a enterAutofuzz(); para continuar con el proceso de pruebas de fuzzing.

Código fuente que define el caso de prueba objetivo

root@kitploit:~
#ifdef __cplusplus
extern "C" {
#endif
void enterAutofuzz() {
  class AutofuzzTest : public ::Parser_TestArray_Test {
  public:
    void runTest() {
      try {
        SetUpTestCase();
      } catch (std::exception &E) {}
      try {
        SetUp();
      } catch (std::exception &E) {}
      try {
        TestBody();
      } catch (std::exception &E) {}
      try {
        TearDown();
      } catch (std::exception &E) {}
      try {
        TearDownTestCase();
      } catch (std::exception &E) {}
    }
  };
  AutofuzzTest Fuzzer;
  Fuzzer.runTest();
}
#ifdef __cplusplus
}
#endif

En la parte final del código fuente que define el caso de prueba objetivo, UTopia inyecta la función enterAutofuzz. Dentro de esta función se declara la clase AutofuzzTest, que hereda de ::Parser_TestArray_Test. Esta clase padre está definida por el framework GoogleTest y es específica del caso de prueba que se está tratando, como se muestra a continuación:

root@kitploit:~
TEST(Parser, TestArray)
{
  ...
}

El método runTest() ejecuta el caso de prueba de forma independiente de GoogleTest, invocando cinco funciones que GoogleTest normalmente llama para cada caso de prueba. Este enfoque permite la ejecución directa de la prueba sin depender del framework GoogleTest.

Compilar los fuzz drivers generados

Los fuzz drivers se generan en ${output_dir}, pasado a fuzz_generator como opción de la línea de comandos. Puedes compilarlos usando el mismo comando de compilador que para el ejecutable de prueba unitaria. Ten en cuenta que debes incluir los archivos fuzz_entry.cc y FuzzArgsProto.pb.cc que son generados por fuzz_generator. Puedes encontrar esos archivos en ${output_dir}.

Reproducir la evaluación

Generar fuzzer

root@kitploit:~
python3 -m helper.make {library name}
python3 -m helper.build {library name}

Puedes encontrar todas las salidas de todo el pipeline de 'UTopia' en los siguientes dos directorios:

  • exp/{library name}/output,
  • result/test/{library name}
Descargar herramienta