
Para obtener una visión detallada de la investigación y la motivación detrás de Vulnhalla, consulta la entrada oficial del blog de CyberArk Threat Research:
Vulnhalla: Cómo extraer las verdaderas vulnerabilidades del pajar de CodeQL
Antes de comenzar, asegúrate de tener:
Python 3.10 – 3.13 (se recomienda Python 3.11 o 3.12)
CodeQL CLI
codeql esté en tu PATH, o establece la ruta en .env (ver Paso 2)(Opcional) Token de API de GitHub
Clave de API del LLM
Toda la configuración está en un único archivo: .env
git clone https://github.com/cyberark/Vulnhalla
cd Vulnhalla
.env.example a .env:cp .env.example .env # macOS / Linux
Copy-Item .env.example .env # Windows (PowerShell)
.env y completa tus valores:Ejemplo para OpenAI:
CODEQL_PATH=codeql
GITHUB_TOKEN=ghp_your_token_here
PROVIDER=openai
MODEL=gpt-4o
OPENAI_API_KEY=your-api-key-here
LLM_TEMPERATURE=0.2
LLM_TOP_P=0.2
# Optional: Logging Configuration
LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR
LOG_FILE= # Optional: path to log file (e.g., logs/vulnhalla.log)
LOG_FORMAT=default # default or json
# LOG_VERBOSE_CONSOLE=false # If true, WARNING/ERROR use full format (timestamp - logger - level - message)
📖 Para la referencia de configuración completa: consulta Referencia de Configuración más abajo para conocer todos los proveedores compatibles (OpenAI, Azure, Gemini, Bedrock), las variables requeridas/opcionales y ejemplos detallados.
Windows (PowerShell):
# List available Python versions
py -0p
# Pick any supported Python: 3.10 / 3.11 / 3.12 / 3.13
py -3.12 -m pip install --user -U pipx
py -3.12 -m pipx ensurepath
# Close and reopen terminal (required)
pipx install poetry
poetry --version
macOS / Linux:
# Check your Python version
python3 --version
# Use any supported Python: 3.10 / 3.11 / 3.12 / 3.13
python3 -m pip install --user -U pipx
python3 -m pipx ensurepath
# Restart terminal (required)
pipx install poetry
poetry --version
Windows (PowerShell):
# Pick one supported version you have: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # Force Poetry to use a supported Python version if you have multiple versions installed
poetry install
poetry run vulnhalla-setup
macOS / Linux:
# Pick one supported version you have: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # Force Poetry to use a supported Python version if you have multiple versions installed
poetry install
poetry run vulnhalla-setup
# Analyze a specific repository, for example:
poetry run vulnhalla redis/redis
# Re-download even if database already exists
poetry run vulnhalla redis/redis --force
# Show help
poetry run vulnhalla --help
Esto hará automáticamente:
output/results/Si ya tienes una base de datos de CodeQL en disco (por ejemplo, creada manualmente o de una ejecución anterior), puedes omitir el paso de obtención de GitHub usando la bandera --local / -l:
Windows (PowerShell):
poetry run vulnhalla --local C:\path\to\my-codeql-db
macOS / Linux:
poetry run vulnhalla --local /path/to/my-codeql-db
Nota: La bandera
--localespera un directorio de base de datos de CodeQL, no una carpeta de código fuente. Puedes verificarlo comprobando que la carpeta contenga un archivocodeql-database.yml.
# Open UI to view existing results (without running analysis)
poetry run vulnhalla-ui
# Validate configuration: CodeQL, LLM, Logging (without running analysis)
poetry run vulnhalla-validate
# List analyzed repositories and their issue counts
poetry run vulnhalla-list
# Run example pipeline (analyzes videolan/vlc and redis/redis)
poetry run vulnhalla-example
Vulnhalla incluye una Interfaz de Usuario completa para navegar y explorar los resultados de los análisis.
poetry run vulnhalla-ui
La UI muestra un área superior de dos paneles con una barra de controles en la parte inferior:
Área Superior (lado a lado, redimensionable):
Panel Izquierdo (Lista de Problemas):
Panel Derecho (Detalles):
Barra de Controles Inferior:
↑/↓ - Navegar por la lista de problemas (fila por fila)Tab / Shift+Tab - Cambiar el foco entre panelesEnter - Mostrar detalles del problema seleccionado/ - Enfocar la caja de búsqueda (en el panel izquierdo)Esc - Limpiar la búsqueda y devolver el foco a la tabla de problemasr - Recargar los resultados desde el disco[ / ] - Redimensionar los paneles izquierdo/derecho (ajustar la posición de división)q - Salir de la aplicación[ para mover el divisor a la izquierda, ] para moverlo a la derechaDespués de ejecutar el pipeline, los resultados se organizan en output/results/<LANG>/<ISSUE_TYPE>/:
output/results/c/Copy_function_using_source_size/
├── 1_raw.json # Original CodeQL issue data
├── 1_final.json # LLM conversation and classification
├── 2_raw.json
├── 2_final.json
└── ...
Cada *_final.json contiene:
Cada *_raw.json contiene:
output/databases/<LANG>/<ORG>/<REPO>)CodeQL CLI no encontrado:
Establece CODEQL_PATH en tu archivo .env con la ruta completa de tu ejecutable de CodeQL.
En Windows: La ruta debe terminar en .cmd (por ejemplo, C:\path\to\codeql\codeql.cmd).
Límites de tasa de GitHub:
Establece GITHUB_TOKEN en tu archivo .env (obtén un token desde https://github.com/settings/tokens).
Problemas con el LLM:
Verifica que las claves de API en el archivo .env coincidan con tu proveedor seleccionado.
Errores de importación en la UI:
Asegúrate de estar ejecutando desde el directorio raíz del proyecto, o usa python examples/ui_example.py, que maneja la configuración de rutas.
Toda la configuración se gestiona mediante variables de entorno en tu archivo .env. Esta es una referencia completa:
OpenAI:
| Variable | Descripción |
|---|---|
OPENAI_API_KEY | Tu clave de API de OpenAI desde platform.openai.com |
Azure OpenAI:
Gemini (Google):
| Variable | Descripción |
|---|---|
GOOGLE_API_KEY | Tu clave de API de Google desde Google AI Studio |
AWS Bedrock:
* Autenticación: Usa AWS_PROFILE o AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY (+ AWS_SESSION_TOKEN opcional para STS).
Ejemplo de .env para Bedrock (SSO):
PROVIDER=bedrock
MODEL=anthropic.claude-3-5-sonnet-20241022-v2:0
AWS_REGION_NAME=us-east-1
AWS_PROFILE=your-profile
⚠️ Requisitos previos:
- Las credenciales de AWS deben estar configuradas (SSO, perfil de IAM o claves de acceso) con permisos para invocar modelos de Bedrock
- Para usuarios de SSO: Ejecuta
aws sso login --profile your-profileantes de usar Vulnhalla🔧 Importante - Selección del Modelo: Al seleccionar un modelo de Bedrock, asegúrate de que soporte tool calling/function calling (no todos los modelos de Bedrock lo hacen). El tool calling es una parte clave del flujo de análisis de Vulnhalla, por lo que elegir un modelo compatible marca una gran diferencia en funcionalidad y resultados. Los modelos compatibles incluyen: Claude 3.x, Mistral, o Cohere Command R.
⚠️ Importante: No aumentes
LLM_TEMPERATUREniLLM_TOP_Pa menos que entiendas completamente el impacto. Los valores más bajos mantienen el modelo estable y determinista, lo cual es crítico para el análisis de seguridad. Los valores más altos pueden hacer que el modelo se vuelva inconsistente, creativo o que alucine resultados.
📝 Nota: Para ejemplos de configuración adicionales, consulta el archivo
.env.exampleen la raíz del proyecto.
Vulnhalla valida tu configuración al iniciar. Si faltan variables requeridas o son inválidas, verás mensajes de error claros que indican qué hay que corregir.
Errores de validación comunes:
PROVIDER para los valores compatibles)CODEQL_PATH está establecido pero el archivo no existe)El LLM utiliza los siguientes códigos de estado:
La UI los asigna de la siguiente manera:
1337 → "Verdadero Positivo"1007 → "Falso Positivo"7331 o 3713 → "Necesita Más Datos"El proyecto incluye una infraestructura básica de pruebas usando pytest:
# Run all tests
poetry run pytest
# Run with verbose output
poetry run pytest -v
La suite de pruebas incluye pruebas de humo para verificar que la infraestructura de pruebas esté correctamente configurada.
El proyecto usa mypy para la comprobación estática de tipos:
poetry run mypy src
La comprobación de tipos está configurada en pyproject.toml bajo [tool.mypy].
La configuración usa una línea base conservadora con anulaciones por módulo para permitir una adopción gradual.
Las dependencias se gestionan mediante Poetry en pyproject.toml:
requests - Solicitudes HTTP para la API de GitHubpySmartDL - Gestor de descargas inteligente para bases de datos de CodeQLlitellm - Interfaz LLM unificada que soporta múltiples proveedorespython-dotenv - Gestión de variables de entornoPyYAML - Análisis YAML para archivos de paquetes de CodeQLtextual - Framework de UI de terminalpytest - Framework de pruebas (dependencia de desarrollo)mypy - Comprobador de tipos estático (dependencia de desarrollo)Las consultas de CodeQL están organizadas en data/queries/<LANG>/:
issues/ - Consultas de detección de problemas de seguridadtools/ - Consultas auxiliares (árboles de funciones, clases, variables globales, macros)Cada directorio contiene un archivo qlpack.yml que define el paquete de CodeQL.
Copyright (c) 2025 CyberArk Software Ltd. Todos los derechos reservados.
Este repositorio está licenciado bajo la Apache License, Versión 2.0 - consulta LICENSE.txt para más detalles.
Damos la bienvenida a todo tipo de contribuciones a este repositorio. Para obtener instrucciones sobre cómo comenzar y descripciones de nuestros flujos de trabajo de desarrollo, consulta nuestra guía de contribución.
Por favor, lee y sigue nuestro Código de Conducta. Estamos comprometidos a proporcionar un entorno acogedor e inclusivo para todos los contribuyentes.
No dudes en contactarnos a través de los issues de GitHub si tienes solicitudes de funciones o problemas con el proyecto.
| Variable | Requerida Para | Descripción |
|---|
CODEQL_PATH | Todas | Ruta al ejecutable de CodeQL. Por defecto, codeql si CodeQL está en PATH. Usa la ruta completa si no está en PATH (por ejemplo, C:\path\to\codeql\codeql.cmd en Windows) |
PROVIDER | Todas | Proveedor de LLM: openai, azure, gemini, bedrock, anthropic, mistral, groq, openrouter, ollama, etc. |
MODEL | Todas | Nombre del modelo (por ejemplo, gpt-4o, gpt-4-turbo, gemini-2.5-flash) |
| Variable | Descripción |
|---|
AZURE_OPENAI_API_KEY o AZURE_API_KEY | Tu clave de API de Azure OpenAI |
AZURE_OPENAI_ENDPOINT o AZURE_API_BASE | URL del endpoint de tu Azure OpenAI (por ejemplo, https://your-resource.openai.azure.com) |
AZURE_OPENAI_API_VERSION o AZURE_API_VERSION | Versión de la API (por defecto: 2024-08-01-preview) |
| Variable | Requerida | Descripción |
|---|
AWS_REGION_NAME | Sí | Región de AWS (por ejemplo, us-east-1, us-west-2) |
AWS_PROFILE | No* | Nombre del perfil de AWS para autenticación SSO/archivo de credenciales |
AWS_ACCESS_KEY_ID | No* | Clave de acceso de AWS (si no se usa un perfil) |
AWS_SECRET_ACCESS_KEY | No* | Clave secreta de AWS (si no se usa un perfil) |
AWS_SESSION_TOKEN | No | Token de sesión para credenciales STS temporales |
| Variable | Por defecto | Descripción |
|---|
GITHUB_TOKEN | - | Token de API de GitHub para límites de tasa más altos. Obtén uno desde GitHub Settings > Tokens |
GITHUB_API_URL | https://api.github.com | URL de la API de GitHub. Para GitHub Enterprise, establece la URL de la API de tu servidor (por ejemplo, https://github.your-company.com/api/v3) |
GITHUB_SSL_VERIFY | true | Verificación de certificados SSL. Establece false para GitHub Enterprise con certificados autofirmados o de CA interna |
LLM_TEMPERATURE | 0.2 | Temperatura del LLM (0.0-2.0). Más bajo = más determinista. Recomendado: mantener en 0.2 |
LLM_TOP_P | 0.2 | Muestreo top-p del LLM (0.0-1.0). Más bajo = más enfocado. Recomendado: mantener en 0.2 |
LOG_LEVEL | INFO | Nivel de registro: DEBUG, INFO, WARNING, o ERROR. Controla la verbosidad de la salida en consola |
LOG_FILE | - | Ruta opcional al archivo de registro (por ejemplo, logs/vulnhalla.log). Si se establece, los registros se escriben tanto en la consola como en el archivo. El registro en archivo usa nivel DEBUG para una salida detallada |
LOG_FORMAT | default | Estilo de formato de registro: default (legible por humanos), o json (formato JSON estructurado) |
LOG_VERBOSE_CONSOLE | false | Si es true, WARNING/ERROR/CRITICAL usan el formato completo (timestamp - logger - level - message). Por defecto: WARNING/ERROR usan formato simple (LEVEL - message), INFO siempre mínimo (solo message) |
THIRD_PARTY_LOG_LEVEL | ERROR | Nivel de registro para bibliotecas de terceros (LiteLLM, urllib3, requests). Opciones: DEBUG, INFO, WARNING, ERROR. Por defecto, suprime la mayor parte del ruido de terceros |