
Automatisierte Sicherheitsanalyse-Pipeline, die CodeQL-Abfragen auf GitHub-Repositories ausführt und LLMs verwendet, um echte Schwachstellen von False Positives zu klassifizieren und zu filtern.
Eine detaillierte Übersicht über die Forschung und Motivation hinter Vulnhalla finden Sie im offiziellen CyberArk Threat Research Blog-Beitrag:
Vulnhalla: Picking the True Vulnerabilities from the CodeQL Haystack
Stellen Sie vor dem Start sicher, dass Sie Folgendes haben:
Python 3.10 – 3.13 (Python 3.11 oder 3.12 empfohlen)
CodeQL CLI
codeql in Ihrem PATH ist, oder Sie setzen den Pfad in .env (siehe Schritt 2)(Optional) GitHub-API-Token
LLM-API-Schlüssel
Die gesamte Konfiguration erfolgt in einer einzigen Datei: .env
git clone https://github.com/cyberark/Vulnhalla
cd Vulnhalla
.env.example nach .env:cp .env.example .env # macOS / Linux
Copy-Item .env.example .env # Windows (PowerShell)
.env und fügen Sie Ihre Werte ein:Beispiel für 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-Konfiguration
LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR
LOG_FILE= # Optional: Pfad zur Logdatei (z. B. logs/vulnhalla.log)
LOG_FORMAT=default # default oder json
# LOG_VERBOSE_CONSOLE=false # Bei true: WARNING/ERROR im vollständigen Format (Timestamp - Logger - Level - Message)
📖 Für die vollständige Konfigurationsreferenz: Siehe Konfigurationsreferenz unten für alle unterstützten Anbieter (OpenAI, Azure, Gemini, Bedrock), erforderliche/optionale Variablen und detaillierte Beispiele.
Windows (PowerShell):
# Verfügbare Python-Versionen auflisten
py -0p
# Beliebige unterstützte Python-Version auswählen: 3.10 / 3.11 / 3.12 / 3.13
py -3.12 -m pip install --user -U pipx
py -3.12 -m pipx ensurepath
# Terminal schließen und erneut öffnen (erforderlich)
pipx install poetry
poetry --version
macOS / Linux:
# Python-Version prüfen
python3 --version
# Beliebige unterstützte Python-Version verwenden: 3.10 / 3.11 / 3.12 / 3.13
python3 -m pip install --user -U pipx
python3 -m pipx ensurepath
# Terminal neu starten (erforderlich)
pipx install poetry
poetry --version
Windows (PowerShell):
# Eine unterstützte Version auswählen, die Sie installiert haben: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # Poetry zwingen, eine unterstützte Python-Version zu verwenden, wenn mehrere Versionen installiert sind
poetry install
poetry run vulnhalla-setup
macOS / Linux:
# Eine unterstützte Version auswählen, die Sie installiert haben: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # Poetry zwingen, eine unterstützte Python-Version zu verwenden, wenn mehrere Versionen installiert sind
poetry install
poetry run vulnhalla-setup
# Ein bestimmtes Repository analysieren, z. B.:
poetry run vulnhalla redis/redis
# Erneut herunterladen, auch wenn die Datenbank bereits existiert
poetry run vulnhalla redis/redis --force
# Hilfe anzeigen
poetry run vulnhalla --help
Dies wird automatisch:
output/results/ speichernWenn Sie bereits eine CodeQL-Datenbank auf der Festplatte haben (z. B. manuell erstellt oder von einem vorherigen Lauf), können Sie den GitHub-Abruf-Schritt mit dem --local / -l-Flag überspringen:
Windows (PowerShell):
poetry run vulnhalla --local C:\path\to\my-codeql-db
macOS / Linux:
poetry run vulnhalla --local /path/to/my-codeql-db
Hinweis: Das
--local-Flag erwartet ein CodeQL-Datenbank-Verzeichnis, keinen Quellcode-Ordner. Sie können überprüfen, ob der Ordner einecodeql-database.yml-Datei enthält.
# UI öffnen, um vorhandene Ergebnisse anzuzeigen (ohne Analyse auszuführen)
poetry run vulnhalla-ui
# Konfiguration validieren: CodeQL, LLM, Logging (ohne Analyse)
poetry run vulnhalla-validate
# Analysierte Repositorys und deren Problemzahlen auflisten
poetry run vulnhalla-list
# Beispiel-Pipeline ausführen (analysiert videolan/vlc und redis/redis)
poetry run vulnhalla-example
Vulnhalla enthält eine voll ausgestattete Benutzeroberfläche zum Durchsuchen und Erkunden der Analyseergebnisse.
poetry run vulnhalla-ui
Die UI zeigt einen zweigeteilten oberen Bereich mit einer Steuerungsleiste unten an:
Oberer Bereich (nebeneinander, in der Größe veränderbar):
Linkes Panel (Problemliste):
Rechtes Panel (Details):
Untere Steuerungsleiste:
↑/↓ - Durch die Problemliste navigieren (zeilenweise)Tab / Shift+Tab - Fokus zwischen den Panels wechselnEnter - Details zum ausgewählten Problem anzeigen/ - Suchfeld fokussieren (im linken Panel)Esc - Suche löschen und Fokus zurück zur Tabelle setzenr - Ergebnisse von der Festplatte neu laden[ / ] - Linkes/rechtes Panel in der Größe ändern (Teilungsposition anpassen)q - Anwendung beenden[, um den Trenner nach links zu verschieben, ], um ihn nach rechts zu verschiebenNach dem Ausführen der Pipeline werden die Ergebnisse in output/results/<LANG>/<ISSUE_TYPE>/ organisiert:
output/results/c/Copy_function_using_source_size/
├── 1_raw.json # Ursprüngliche CodeQL-Problemdaten
├── 1_final.json # LLM-Gespräch und Klassifizierung
├── 2_raw.json
├── 2_final.json
└── ...
Jede *_final.json enthält:
Jede *_raw.json enthält:
output/databases/<LANG>/<ORG>/<REPO>)CodeQL CLI nicht gefunden:
Setzen Sie CODEQL_PATH in Ihrer .env-Datei auf den vollständigen Pfad zu Ihrer CodeQL-Ausführungsdatei.
Unter Windows: Der Pfad muss mit .cmd enden (z. B. C:\path\to\codeql\codeql.cmd).
GitHub-Ratenlimits:
Setzen Sie GITHUB_TOKEN in Ihrer .env-Datei (Token von https://github.com/settings/tokens abrufen).
LLM-Probleme:
Überprüfen Sie Ihre API-Schlüssel in der .env-Datei, ob sie mit Ihrem ausgewählten Anbieter übereinstimmen.
Importfehler in der UI:
Stellen Sie sicher, dass Sie aus dem Projektstammverzeichnis ausführen, oder verwenden Sie python examples/ui_example.py, das die Pfadeinrichtung übernimmt.
Die gesamte Konfiguration erfolgt über Umgebungsvariablen in Ihrer .env-Datei. Hier ist eine vollständige Referenz:
| Variable | Erforderlich für | Beschreibung |
|---|---|---|
CODEQL_PATH | Alle | Pfad zur CodeQL-Ausführungsdatei. Standard ist codeql, wenn CodeQL im PATH ist. Verwenden Sie den vollständigen Pfad, wenn nicht im PATH (z. B. C:\path\to\codeql\codeql.cmd unter Windows) |
PROVIDER | Alle | LLM-Anbieter: openai, azure, gemini, bedrock, anthropic, mistral, groq, openrouter, ollama, usw. |
MODEL | Alle | Modellname (z. B. gpt-4o, gpt-4-turbo, gemini-2.5-flash) |
OpenAI:
| Variable | Beschreibung |
|---|---|
OPENAI_API_KEY | Ihr OpenAI-API-Schlüssel von platform.openai.com |
Azure OpenAI:
| Variable | Beschreibung |
|---|---|
AZURE_OPENAI_API_KEY oder AZURE_API_KEY | Ihr Azure OpenAI-API-Schlüssel |
AZURE_OPENAI_ENDPOINT oder AZURE_API_BASE | Ihre Azure OpenAI-Endpunkt-URL (z. B. https://your-resource.openai.azure.com) |
AZURE_OPENAI_API_VERSION oder AZURE_API_VERSION | API-Version (Standard: 2024-08-01-preview) |
Gemini (Google):
| Variable | Beschreibung |
|---|---|
GOOGLE_API_KEY | Ihr Google-API-Schlüssel von Google AI Studio |
AWS Bedrock:
| Variable | Erforderlich | Beschreibung |
|---|---|---|
AWS_REGION_NAME | Ja | AWS-Region (z. B. us-east-1, us-west-2) |
AWS_PROFILE | Nein* | AWS-Profilname für SSO-/Credentials-Datei-Authentifizierung |
AWS_ACCESS_KEY_ID | Nein* | AWS-Zugriffsschlüssel (falls kein Profil verwendet wird) |
AWS_SECRET_ACCESS_KEY | Nein* | AWS-Geheimschlüssel (falls kein Profil verwendet wird) |
AWS_SESSION_TOKEN | Nein | Sitzungstoken für temporäre STS-Anmeldeinformationen |
* Authentifizierung: Verwenden Sie AWS_PROFILE oder AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY (+ optional AWS_SESSION_TOKEN für STS).
Bedrock .env-Beispiel (SSO):
PROVIDER=bedrock
MODEL=anthropic.claude-3-5-sonnet-20241022-v2:0
AWS_REGION_NAME=us-east-1
AWS_PROFILE=your-profile
⚠️ Voraussetzungen:
- AWS-Anmeldeinformationen müssen konfiguriert sein (SSO, IAM-Profil oder Zugriffsschlüssel) mit Berechtigungen zum Aufrufen von Bedrock-Modellen
- Für SSO-Benutzer: Führen Sie
aws sso login --profile your-profileaus, bevor Sie Vulnhalla verwenden🔧 Wichtig – Modellauswahl: Stellen Sie bei der Auswahl eines Bedrock-Modells sicher, dass es Tool-Aufrufe/Function Calling unterstützt (nicht alle Bedrock-Modelle tun dies). Tool-Aufrufe sind ein wesentlicher Bestandteil des Vulnhalla-Analyseflusses, daher macht die Wahl eines kompatiblen Modells einen großen Unterschied in der Funktionalität und den Ergebnissen. Kompatible Modelle umfassen: Claude 3.x, Mistral oder Cohere Command R.
| Variable | Standard | Beschreibung |
|---|---|---|
GITHUB_TOKEN | - | GitHub-API-Token für höhere Ratenlimits. Holen Sie sich einen von GitHub Settings > Tokens |
GITHUB_API_URL | https://api.github.com | GitHub-API-URL. Für GitHub Enterprise auf die API-URL Ihres Servers setzen (z. B. https://github.your-company.com/api/v3) |
GITHUB_SSL_VERIFY | true | SSL-Zertifikatsüberprüfung. Setzen Sie auf false für GitHub Enterprise mit selbstsignierten oder internen CA-Zertifikaten |
LLM_TEMPERATURE | 0.2 | LLM-Temperatur (0.0-2.0). Niedriger = deterministischer. Empfohlen: bei 0.2 belassen |
LLM_TOP_P | 0.2 | LLM Top-P-Sampling (0.0-1.0). Niedriger = fokussierter. Empfohlen: bei 0.2 belassen |
LOG_LEVEL | INFO | Logging-Level: DEBUG, INFO, WARNING oder ERROR. Steuert die Ausführlichkeit der Konsolenausgabe |
LOG_FILE | - | Optionaler Pfad zur Logdatei (z. B. logs/vulnhalla.log). Wenn gesetzt, werden Logs sowohl auf die Konsole als auch in die Datei geschrieben. Datei-Logging verwendet DEBUG-Level für detaillierte Ausgabe |
LOG_FORMAT | default | Log-Format-Stil: default (menschenlesbar) oder json (strukturiertes JSON-Format) |
LOG_VERBOSE_CONSOLE | false | Bei true verwenden WARNING/ERROR/CRITICAL das vollständige Format (Timestamp - Logger - Level - Nachricht). Standard: WARNING/ERROR verwenden einfaches Format (LEVEL - Nachricht), INFO immer minimal (nur Nachricht) |
THIRD_PARTY_LOG_LEVEL | ERROR | Log-Level für Drittanbieter-Bibliotheken (LiteLLM, urllib3, requests). Optionen: , , , . Standard unterdrückt die meisten Drittanbieter-Störungen |
⚠️ Wichtig: Erhöhen Sie
LLM_TEMPERATUREoderLLM_TOP_Pnur, wenn Sie die Auswirkungen vollständig verstehen. Niedrigere Werte halten das Modell stabil und deterministisch, was für die Sicherheitsanalyse entscheidend ist. Höhere Werte können dazu führen, dass das Modell inkonsistent, kreativ wird oder Ergebnisse halluziniert.
📝 Hinweis: Weitere Konfigurationsbeispiele finden Sie in der Datei
.env.exampleim Projektstamm.
Vulnhalla validiert Ihre Konfiguration beim Start. Wenn erforderliche Variablen fehlen oder ungültig sind, werden klare Fehlermeldungen angezeigt, die angeben, was behoben werden muss.
Häufige Validierungsfehler:
PROVIDER für unterstützte Werte)CODEQL_PATH gesetzt ist, aber die Datei nicht existiert)Das LLM verwendet die folgenden Statuscodes:
Die UI bildet diese wie folgt ab:
1337 → "True Positive"1007 → "False Positive"7331 oder 3713 → "Needs More Data"Das Projekt enthält eine grundlegende Testinfrastruktur mit pytest:
# Alle Tests ausführen
poetry run pytest
# Mit ausführlicher Ausgabe
poetry run pytest -v
Die Testsuite enthält Smoke-Tests, um zu überprüfen, ob die Testinfrastruktur korrekt eingerichtet ist.
Das Projekt verwendet mypy für die statische Typprüfung:
poetry run mypy src
Die Typprüfung ist in pyproject.toml unter [tool.mypy] konfiguriert.
Die Konfiguration verwendet eine konservative Basislinie mit modulspezifischen Überschreibungen, um eine schrittweise Einführung zu ermöglichen.
Abhängigkeiten werden über Poetry in pyproject.toml verwaltet:
requests - HTTP-Anfragen für die GitHub-APIpySmartDL - Intelligenter Download-Manager für CodeQL-Datenbankenlitellm - Einheitliches LLM-Interface, das mehrere Anbieter unterstütztpython-dotenv - Verwaltung von UmgebungsvariablenPyYAML - YAML-Parsing für CodeQL-Pack-Dateientextual - Terminal-UI-Frameworkpytest - Testframework (Entwicklungsabhängigkeit)mypy - Statischer Typprüfer (Entwicklungsabhängigkeit)CodeQL-Abfragen sind in data/queries/<LANG>/ organisiert:
issues/ - Abfragen zur Erkennung von Sicherheitsproblementools/ - Hilfsabfragen (Funktionsbäume, Klassen, globale Variablen, Makros)Jedes Verzeichnis enthält eine qlpack.yml-Datei, die das CodeQL-Pack definiert.
Copyright (c) 2025 CyberArk Software Ltd. Alle Rechte vorbehalten.
Dieses Repository ist unter der Apache License, Version 2.0 lizenziert – siehe LICENSE.txt für weitere Details.
Wir begrüßen Beiträge aller Art zu diesem Repository. Anweisungen zum Einstieg und Beschreibungen unserer Entwicklungsabläufe finden Sie in unserem Leitfaden für Mitwirkende.
Bitte lesen und befolgen Sie unseren Verhaltenskodex. Wir verpflichten uns, eine einladende und inklusive Umgebung für alle Mitwirkenden zu schaffen.
Sie können uns gerne über GitHub-Issues kontaktieren, wenn Sie Feature-Wünsche oder Projektprobleme haben.
DEBUGINFOWARNINGERROR