
Pipeline automatizzata di analisi della sicurezza che esegue query CodeQL sui repository GitHub e utilizza LLM per classificare e filtrare le vulnerabilità reali dai falsi positivi.
Per una panoramica dettagliata della ricerca e della motivazione alla base di Vulnhalla, consulta il post ufficiale del blog CyberArk Threat Research:
Vulnhalla: Picking the True Vulnerabilities from the CodeQL Haystack
Prima di iniziare, assicurati di avere:
Python 3.10 – 3.13 (Python 3.11 o 3.12 raccomandato)
CodeQL CLI
codeql sia nel tuo PATH, oppure imposterai il percorso in .env (vedi Passo 2)(Opzionale) Token API GitHub
Chiave API LLM
Tutta la configurazione è in un unico file: .env
git clone https://github.com/cyberark/Vulnhalla
cd Vulnhalla
.env.example in .env:cp .env.example .env # macOS / Linux
Copy-Item .env.example .env # Windows (PowerShell)
.env e inserisci i tuoi valori:Esempio per 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
# Opzionale: Configurazione logging
LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR
LOG_FILE= # Opzionale: percorso file di log (es. logs/vulnhalla.log)
LOG_FORMAT=default # default o json
# LOG_VERBOSE_CONSOLE=false # Se true, WARNING/ERROR usano formato completo (timestamp - logger - livello - messaggio)
📖 Per il riferimento completo alla configurazione: Vedi Riferimento configurazione qui sotto per tutti i provider supportati (OpenAI, Azure, Gemini, Bedrock), variabili obbligatorie/opzionali ed esempi dettagliati.
Windows (PowerShell):
# Elenca le versioni Python disponibili
py -0p
# Scegli un Python supportato: 3.10 / 3.11 / 3.12 / 3.13
py -3.12 -m pip install --user -U pipx
py -3.12 -m pipx ensurepath
# Chiudi e riapri il terminale (obbligatorio)
pipx install poetry
poetry --version
macOS / Linux:
# Controlla la tua versione Python
python3 --version
# Usa qualsiasi Python supportato: 3.10 / 3.11 / 3.12 / 3.13
python3 -m pip install --user -U pipx
python3 -m pipx ensurepath
# Riavvia il terminale (obbligatorio)
pipx install poetry
poetry --version
Windows (PowerShell):
# Scegli una versione supportata che hai: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # Forza Poetry a usare una versione Python supportata se hai più versioni installate
poetry install
poetry run vulnhalla-setup
macOS / Linux:
# Scegli una versione supportata che hai: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # Forza Poetry a usare una versione Python supportata se hai più versioni installate
poetry install
poetry run vulnhalla-setup
# Analizza un repository specifico, ad esempio:
poetry run vulnhalla redis/redis
# Scarica di nuovo anche se il database esiste già
poetry run vulnhalla redis/redis --force
# Mostra aiuto
poetry run vulnhalla --help
Questo farà automaticamente:
output/results/Se hai già un database CodeQL su disco (ad esempio creato manualmente o da un'esecuzione precedente), puoi saltare il passaggio di recupero da GitHub usando il flag --local / -l:
Windows (PowerShell):
poetry run vulnhalla --local C:\percorso\al\mio-database-codeql
macOS / Linux:
poetry run vulnhalla --local /percorso/al/mio-database-codeql
Nota: Il flag
--localrichiede una directory di database CodeQL, non una cartella di codice sorgente. Puoi verificare controllando che la cartella contenga un filecodeql-database.yml.
# Aprire l'interfaccia utente per visualizzare i risultati esistenti (senza eseguire l'analisi)
poetry run vulnhalla-ui
# Convalidare la configurazione: CodeQL, LLM, Logging (senza eseguire l'analisi)
poetry run vulnhalla-validate
# Elencare i repository analizzati e i conteggi dei problemi
poetry run vulnhalla-list
# Eseguire la pipeline di esempio (analizza videolan/vlc e redis/redis)
poetry run vulnhalla-example
Vulnhalla include un'interfaccia utente completa per navigare ed esplorare i risultati dell'analisi.
poetry run vulnhalla-ui
L'interfaccia mostra un'area superiore a due pannelli con una barra dei controlli in basso:
Area superiore (affiancata, ridimensionabile):
Pannello sinistro (Elenco problemi):
Pannello destro (Dettagli):
Barra dei controlli in basso:
↑/↓ - Navigare l'elenco dei problemi (riga per riga)Tab / Shift+Tab - Cambiare focus tra i pannelliEnter - Mostrare i dettagli per il problema selezionato/ - Focalizzare la casella di ricerca (nel pannello sinistro)Esc - Cancellare la ricerca e riportare il focus sulla tabella dei problemir - Ricaricare i risultati dal disco[ / ] - Ridimensionare i pannelli sinistro/destro (regolare la posizione dello split)q - Uscire dall'applicazione[ per spostare il divisore a sinistra, ] per spostarlo a destraDopo aver eseguito la pipeline, i risultati sono organizzati in output/results/<LANG>/<ISSUE_TYPE>/:
output/results/c/Copy_function_using_source_size/
├── 1_raw.json # Dati originali del problema CodeQL
├── 1_final.json # Conversazione e classificazione LLM
├── 2_raw.json
├── 2_final.json
└── ...
Ogni *_final.json contiene:
Ogni *_raw.json contiene:
output/databases/<LANG>/<ORG>/<REPO>)CodeQL CLI non trovato:
Imposta CODEQL_PATH nel tuo file .env con il percorso completo dell'eseguibile CodeQL.
Su Windows: Il percorso deve terminare con .cmd (es. C:\percorso\per\codeql\codeql.cmd).
Limiti di velocità GitHub:
Imposta GITHUB_TOKEN nel tuo file .env (ottieni il token da https://github.com/settings/tokens).
Problemi con LLM:
Controlla che le tue chiavi API nel file .env corrispondano al provider selezionato.
Errori di import nell'interfaccia utente:
Assicurati di eseguire dalla directory principale del progetto, oppure usa python examples/ui_example.py che gestisce l'impostazione del percorso.
Tutta la configurazione è gestita tramite variabili d'ambiente nel file .env. Ecco un riferimento completo:
| Variabile | Richiesta per | Descrizione |
|---|---|---|
CODEQL_PATH | Tutti | Percorso dell'eseguibile CodeQL. Predefinito a codeql se CodeQL è nel PATH. Usa il percorso completo se non è nel PATH (es. C:\percorso\per\codeql\codeql.cmd su Windows) |
PROVIDER | Tutti | Provider LLM: openai, azure, gemini, bedrock, anthropic, mistral, groq, openrouter, ollama, ecc. |
MODEL | Tutti | Nome del modello (es. gpt-4o, gpt-4-turbo, gemini-2.5-flash) |
OpenAI:
| Variabile | Descrizione |
|---|---|
OPENAI_API_KEY | La tua chiave API OpenAI da platform.openai.com |
Azure OpenAI:
| Variabile | Descrizione |
|---|---|
AZURE_OPENAI_API_KEY o AZURE_API_KEY | La tua chiave API Azure OpenAI |
AZURE_OPENAI_ENDPOINT o AZURE_API_BASE | L'URL dell'endpoint Azure OpenAI (es. https://tuo-risorsa.openai.azure.com) |
AZURE_OPENAI_API_VERSION o AZURE_API_VERSION | Versione API (predefinita: 2024-08-01-preview) |
Gemini (Google):
| Variabile | Descrizione |
|---|---|
GOOGLE_API_KEY | La tua chiave API Google da Google AI Studio |
AWS Bedrock:
| Variabile | Obbligatoria | Descrizione |
|---|---|---|
AWS_REGION_NAME | Sì | Regione AWS (es. us-east-1, us-west-2) |
AWS_PROFILE | No* | Nome del profilo AWS per autenticazione SSO/file credenziali |
AWS_ACCESS_KEY_ID | No* | Chiave di accesso AWS (se non si usa il profilo) |
AWS_SECRET_ACCESS_KEY | No* | Chiave segreta AWS (se non si usa il profilo) |
AWS_SESSION_TOKEN | No | Token di sessione per credenziali STS temporanee |
* Autenticazione: Usa AWS_PROFILE oppure AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY (+ opzionale AWS_SESSION_TOKEN per STS).
Esempio .env per Bedrock (SSO):
PROVIDER=bedrock
MODEL=anthropic.claude-3-5-sonnet-20241022-v2:0
AWS_REGION_NAME=us-east-1
AWS_PROFILE=tuo-profilo
⚠️ Prerequisiti:
- Le credenziali AWS devono essere configurate (SSO, profilo IAM o chiavi di accesso) con autorizzazioni per invocare i modelli Bedrock
- Per utenti SSO: Esegui
aws sso login --profile tuo-profiloprima di utilizzare Vulnhalla🔧 Importante - Selezione del modello: Quando selezioni un modello Bedrock, assicurati che supporti il tool calling/function calling (non tutti i modelli Bedrock lo fanno). Il tool calling è una parte chiave del flusso di analisi di Vulnhalla, quindi scegliere un modello compatibile fa una grande differenza in termini di funzionalità e risultati. I modelli compatibili includono: Claude 3.x, Mistral, o Cohere Command R.
| Variabile | Predefinito | Descrizione |
|---|---|---|
GITHUB_TOKEN | - | Token API GitHub per limiti di velocità più elevati. Ottienilo da GitHub Settings > Tokens |
GITHUB_API_URL | https://api.github.com | URL API GitHub. Per GitHub Enterprise, imposta l'URL API del tuo server (es. https://github.tua-azienda.com/api/v3) |
GITHUB_SSL_VERIFY | true | Verifica certificato SSL. Imposta a false per GitHub Enterprise con certificati autofirmati o CA interni |
LLM_TEMPERATURE | 0.2 | Temperatura LLM (0.0-2.0). Più basso = più deterministico. Consigliato: mantenerlo a 0.2 |
LLM_TOP_P | 0.2 | Campionamento top-p LLM (0.0-1.0). Più basso = più focalizzato. Consigliato: mantenerlo a 0.2 |
LOG_LEVEL | INFO | Livello di logging: DEBUG, INFO, WARNING, o ERROR. Controlla la verbosità dell'output console |
LOG_FILE | - | Percorso opzionale al file di log (es. logs/vulnhalla.log). Se impostato, i log vengono scritti sia su console che su file. Il logging su file usa livello DEBUG per output dettagliato |
LOG_FORMAT | default | Stile formato log: default (leggibile dall'uomo), o json (formato JSON strutturato) |
LOG_VERBOSE_CONSOLE | false | Se true, WARNING/ERROR/CRITICAL usano formato completo (timestamp - logger - livello - messaggio). Predefinito: WARNING/ERROR usano formato semplice (LEVEL - messaggio), INFO sempre minimale (solo messaggio) |
THIRD_PARTY_LOG_LEVEL | ERROR | Livello log per librerie di terze parti (LiteLLM, urllib3, requests). Opzioni: , , , . Predefinito sopprime la maggior parte del rumore di terze parti |
⚠️ Importante: Non aumentare
LLM_TEMPERATUREoLLM_TOP_Pa meno che tu non capisca appieno l'impatto. Valori più bassi mantengono il modello stabile e deterministico, il che è fondamentale per l'analisi della sicurezza. Valori più alti potrebbero portare il modello a diventare incoerente, creativo o a allucinare risultati.
📝 Nota: Per ulteriori esempi di configurazione, consulta il file
.env.examplenella radice del progetto.
Vulnhalla convalida la tua configurazione all'avvio. Se mancano variabili obbligatorie o non sono valide, vedrai chiari messaggi di errore che indicano cosa deve essere corretto.
Errori di convalida comuni:
PROVIDER per i valori supportati)CODEQL_PATH è impostato ma il file non esiste)L'LLM utilizza i seguenti codici di stato:
L'interfaccia utente li mappa come:
1337 → "True Positive"1007 → "False Positive"7331 o 3713 → "Needs More Data"Il progetto include un'infrastruttura di test di base che utilizza pytest:
# Esegui tutti i test
poetry run pytest
# Esegui con output verbose
poetry run pytest -v
La suite di test include smoke test per verificare che l'infrastruttura di test sia configurata correttamente.
Il progetto utilizza mypy per il type checking statico:
poetry run mypy src
Il type checking è configurato in pyproject.toml sotto [tool.mypy].
La configurazione utilizza una baseline conservativa con override per modulo per consentire un'adozione graduale.
Le dipendenze sono gestite tramite Poetry in pyproject.toml:
requests - Richieste HTTP per l'API GitHubpySmartDL - Download manager intelligente per database CodeQLlitellm - Interfaccia LLM unificata che supporta più providerpython-dotenv - Gestione delle variabili d'ambientePyYAML - Analisi YAML per file pack CodeQLtextual - Framework per interfaccia utente a terminalepytest - Framework di test (dipendenza di sviluppo)mypy - Type checker statico (dipendenza di sviluppo)Le query CodeQL sono organizzate in data/queries/<LANG>/:
issues/ - Query di rilevamento problemi di sicurezzatools/ - Query helper (alberi di funzioni, classi, variabili globali, macro)Ogni directory contiene un file qlpack.yml che definisce il pack CodeQL.
Copyright (c) 2025 CyberArk Software Ltd. Tutti i diritti riservati.
Questo repository è concesso in licenza sotto la Apache License, Version 2.0 - vedi LICENSE.txt per maggiori dettagli.
Accogliamo contributi di ogni tipo a questo repository. Per istruzioni su come iniziare e descrizioni dei nostri flussi di lavoro di sviluppo, consulta la nostra guida per contribuire.
Leggi e segui il nostro Codice di condotta. Siamo impegnati a fornire un ambiente accogliente e inclusivo per tutti i contributori.
Sentiti libero di contattarci tramite GitHub issues se hai richieste di funzionalità o problemi con il progetto.
DEBUGINFOWARNINGERROR