
Pour un aperçu détaillé de la recherche et de la motivation derrière Vulnhalla, consultez l'article de blog officiel de CyberArk Threat Research :
Vulnhalla : Extraire les vraies vulnérabilités de la botte de foin CodeQL
Avant de commencer, assurez-vous de disposer de :
Python 3.10 – 3.13 (Python 3.11 ou 3.12 recommandé)
CodeQL CLI
codeql est dans votre PATH, ou vous définirez le chemin dans .env (voir l'étape 2)(Facultatif) Jeton API GitHub
Clé API LLM
Toute la configuration se trouve dans un seul fichier : .env
git clone https://github.com/cyberark/Vulnhalla
cd Vulnhalla
.env.example vers .env :cp .env.example .env # macOS / Linux
Copy-Item .env.example .env # Windows (PowerShell)
.env et renseignez vos valeurs :Exemple pour 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)
📖 Pour la référence de configuration complète : Consultez la Référence de configuration ci-dessous pour tous les fournisseurs pris en charge (OpenAI, Azure, Gemini, Bedrock), les variables requises/facultatives et des exemples détaillés.
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
Cela va automatiquement :
output/results/Si vous disposez déjà d'une base de données CodeQL sur disque (par exemple, créée manuellement ou lors d'une exécution précédente), vous pouvez ignorer l'étape de récupération GitHub à l'aide de l'option --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
Remarque : L'option
--localattend un répertoire de base de données CodeQL, pas un dossier de code source. Vous pouvez vérifier en vous assurant que le dossier contient un fichiercodeql-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 comprend une interface utilisateur complète pour parcourir et explorer les résultats d'analyse.
poetry run vulnhalla-ui
L'interface affiche une zone supérieure à deux panneaux avec une barre de contrôles en bas :
Zone supérieure (côte à côte, redimensionnable) :
Panneau gauche (liste des problèmes) :
Panneau droit (détails) :
Barre de contrôles inférieure :
↑/↓ - Naviguer dans la liste des problèmes (ligne par ligne)Tab / Shift+Tab - Basculer le focus entre les panneauxEntrée - Afficher les détails du problème sélectionné/ - Focus sur la zone de saisie de recherche (panneau gauche)Échap - Effacer la recherche et rendre le focus au tableau des problèmesr - Recharger les résultats depuis le disque[ / ] - Redimensionner les panneaux gauche/droit (ajuster la position du séparateur)q - Quitter l'application[ pour déplacer le séparateur vers la gauche, ] pour le déplacer vers la droiteAprès l'exécution du pipeline, les résultats sont organisés dans 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
└── ...
Chaque *_final.json contient :
Chaque *_raw.json contient :
output/databases/<LANG>/<ORG>/<REPO>)CodeQL CLI introuvable :
Définissez CODEQL_PATH dans votre fichier .env avec le chemin complet de votre exécutable CodeQL.
Sous Windows : le chemin doit se terminer par .cmd (par exemple, C:\path\to\codeql\codeql.cmd).
Limites de débit GitHub :
Définissez GITHUB_TOKEN dans votre fichier .env (obtenez un jeton sur https://github.com/settings/tokens).
Problèmes liés au LLM :
Vérifiez que vos clés API dans le fichier .env correspondent à votre fournisseur sélectionné.
Erreurs d'importation dans l'interface :
Assurez-vous d'exécuter à partir du répertoire racine du projet, ou utilisez python examples/ui_example.py qui gère la configuration des chemins.
Toute la configuration est gérée par des variables d'environnement dans votre fichier .env. Voici une référence complète :
OpenAI :
| Variable | Description |
|---|---|
OPENAI_API_KEY | Votre clé API OpenAI depuis platform.openai.com |
Azure OpenAI :
Gemini (Google) :
| Variable | Description |
|---|---|
GOOGLE_API_KEY | Votre clé API Google depuis Google AI Studio |
AWS Bedrock :
* Authentification : utilisez AWS_PROFILE ou AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY (+ AWS_SESSION_TOKEN facultatif pour STS).
Exemple .env pour Bedrock (SSO) :
PROVIDER=bedrock
MODEL=anthropic.claude-3-5-sonnet-20241022-v2:0
AWS_REGION_NAME=us-east-1
AWS_PROFILE=your-profile
⚠️ Prérequis :
- Les identifiants AWS doivent être configurés (SSO, profil IAM ou clés d'accès) avec les autorisations d'invoquer des modèles Bedrock
- Pour les utilisateurs SSO : Exécutez
aws sso login --profile your-profileavant d'utiliser Vulnhalla🔧 Important - Sélection du modèle : Lors de la sélection d'un modèle Bedrock, assurez-vous qu'il prend en charge les appels d'outils/les appels de fonctions (ce n'est pas le cas de tous les modèles Bedrock). L'appel d'outils est un élément clé du flux d'analyse de Vulnhalla ; choisir un modèle compatible fait donc une grande différence en termes de fonctionnalités et de résultats. Les modèles compatibles incluent : Claude 3.x, Mistral ou Cohere Command R.
⚠️ Important : N'augmentez pas
LLM_TEMPERATUREouLLM_TOP_Psauf si vous comprenez parfaitement l'impact. Des valeurs plus basses maintiennent le modèle stable et déterministe, ce qui est essentiel pour l'analyse de sécurité. Des valeurs plus élevées peuvent rendre le modèle incohérent, créatif ou lui faire halluciner des résultats.
📝 Remarque : Pour des exemples de configuration supplémentaires, consultez le fichier
.env.exampleà la racine du projet.
Vulnhalla valide votre configuration au démarrage. Si des variables requises sont manquantes ou invalides, vous verrez des messages d'erreur clairs indiquant ce qui doit être corrigé.
Erreurs de validation courantes :
PROVIDER pour les valeurs prises en charge)CODEQL_PATH est défini mais que le fichier n'existe pas)Le LLM utilise les codes de statut suivants :
L'interface les mappe ainsi :
1337 → "Vrai positif"1007 → "Faux positif"7331 ou 3713 → "Besoin de plus de données"Le projet comprend une infrastructure de test de base utilisant pytest :
# Run all tests
poetry run pytest
# Run with verbose output
poetry run pytest -v
La suite de tests comprend des tests de fumée pour vérifier que l'infrastructure de test est correctement configurée.
Le projet utilise mypy pour la vérification statique des types :
poetry run mypy src
La vérification de types est configurée dans pyproject.toml sous [tool.mypy].
La configuration utilise une base conservatrice avec des dérogations par module pour permettre une adoption progressive.
Les dépendances sont gérées via Poetry dans pyproject.toml :
requests - Requêtes HTTP pour l'API GitHubpySmartDL - Gestionnaire de téléchargement intelligent pour les bases de données CodeQLlitellm - Interface LLM unifiée prenant en charge plusieurs fournisseurspython-dotenv - Gestion des variables d'environnementPyYAML - Analyse YAML pour les fichiers de pack CodeQLtextual - Framework d'interface utilisateur terminalpytest - Framework de test (dépendance de développement)mypy - Vérificateur de types statique (dépendance de développement)Les requêtes CodeQL sont organisées dans data/queries/<LANG>/ :
issues/ - Requêtes de détection de problèmes de sécuritétools/ - Requêtes auxiliaires (arbres de fonctions, classes, variables globales, macros)Chaque répertoire contient un fichier qlpack.yml définissant le pack CodeQL.
Copyright (c) 2025 CyberArk Software Ltd. Tous droits réservés.
Ce dépôt est distribué sous la licence Apache, version 2.0 - voir LICENSE.txt pour plus de détails.
Nous accueillons toutes sortes de contributions sur ce dépôt. Pour savoir comment commencer et pour découvrir nos workflows de développement, consultez notre guide de contribution.
Veuillez lire et respecter notre Code de conduite. Nous nous engageons à offrir un environnement accueillant et inclusif à tous les contributeurs.
N'hésitez pas à nous contacter via les issues GitHub si vous avez des demandes de fonctionnalités ou des problèmes liés au projet.
| Variable | Requis pour | Description |
|---|
CODEQL_PATH | Tous | Chemin vers l'exécutable CodeQL. Par défaut codeql si CodeQL est dans le PATH. Utilisez le chemin complet s'il n'est pas dans le PATH (par exemple, C:\path\to\codeql\codeql.cmd sous Windows) |
PROVIDER | Tous | Fournisseur LLM : openai, azure, gemini, bedrock, anthropic, mistral, groq, openrouter, ollama, etc. |
MODEL | Tous | Nom du modèle (par exemple, gpt-4o, gpt-4-turbo, gemini-2.5-flash) |
| Variable | Description |
|---|
AZURE_OPENAI_API_KEY ou AZURE_API_KEY | Votre clé API Azure OpenAI |
AZURE_OPENAI_ENDPOINT ou AZURE_API_BASE | L'URL de votre point de terminaison Azure OpenAI (par exemple, https://your-resource.openai.azure.com) |
AZURE_OPENAI_API_VERSION ou AZURE_API_VERSION | Version de l'API (par défaut : 2024-08-01-preview) |
| Variable | Requis | Description |
|---|
AWS_REGION_NAME | Oui | Région AWS (par exemple, us-east-1, us-west-2) |
AWS_PROFILE | Non* | Nom du profil AWS pour l'authentification SSO/fichier d'identifiants |
AWS_ACCESS_KEY_ID | Non* | Clé d'accès AWS (si vous n'utilisez pas de profil) |
AWS_SECRET_ACCESS_KEY | Non* | Clé secrète AWS (si vous n'utilisez pas de profil) |
AWS_SESSION_TOKEN | Non | Jeton de session pour les identifiants STS temporaires |
| Variable | Défaut | Description |
|---|
GITHUB_TOKEN | - | Jeton API GitHub pour des limites de débit plus élevées. Obtenez-le depuis Paramètres GitHub > Jetons |
GITHUB_API_URL | https://api.github.com | URL de l'API GitHub. Pour GitHub Enterprise, définissez l'URL de l'API de votre serveur (par exemple, https://github.your-company.com/api/v3) |
GITHUB_SSL_VERIFY | true | Vérification du certificat SSL. Définissez false pour GitHub Enterprise avec des certificats auto-signés ou d'une autorité de certification interne |
LLM_TEMPERATURE | 0.2 | Température du LLM (0.0-2.0). Plus bas = plus déterministe. Recommandé : conservez 0.2 |
LLM_TOP_P | 0.2 | Échantillonnage top-p du LLM (0.0-1.0). Plus bas = plus ciblé. Recommandé : conservez 0.2 |
LOG_LEVEL | INFO | Niveau de journalisation : DEBUG, INFO, WARNING ou ERROR. Contrôle la verbosité de la sortie console |
LOG_FILE | - | Chemin facultatif vers le fichier journal (par exemple, logs/vulnhalla.log). S'il est défini, les journaux sont écrits à la fois sur la console et dans le fichier. La journalisation dans le fichier utilise le niveau DEBUG pour une sortie détaillée |
LOG_FORMAT | default | Style de format de journal : default (lisible par l'humain) ou json (format JSON structuré) |
LOG_VERBOSE_CONSOLE | false | Si true, WARNING/ERROR/CRITICAL utilisent le format complet (horodatage - logger - niveau - message). Par défaut : WARNING/ERROR utilisent le format simple (NIVEAU - message), INFO toujours minimal (message uniquement) |
THIRD_PARTY_LOG_LEVEL | ERROR | Niveau de journal pour les bibliothèques tierces (LiteLLM, urllib3, requests). Options : DEBUG, INFO, WARNING, ERROR. Par défaut, supprime la plupart du bruit des bibliothèques tierces |