
Pipeline automatizado de análise de segurança que executa consultas CodeQL em repositórios GitHub e usa LLMs para classificar e filtrar vulnerabilidades verdadeiras de falsos positivos.
Para uma visão geral detalhada da pesquisa e motivação por trás do Vulnhalla, consulte o artigo oficial no blog de Pesquisa de Ameaças da CyberArk:
Vulnhalla: Selecionando as Vulnerabilidades Reais do Palheiro do CodeQL
Antes de começar, certifique-se de ter:
Python 3.10 – 3.13 (Python 3.11 ou 3.12 recomendado)
CodeQL CLI
codeql está no seu PATH, ou você definirá o caminho no .env (veja Passo 2)(Opcional) Token da API do GitHub
Chave da API do LLM
Toda a configuração está em um único arquivo: .env
git clone https://github.com/cyberark/Vulnhalla
cd Vulnhalla
.env.example para .env:cp .env.example .env # macOS / Linux
Copy-Item .env.example .env # Windows (PowerShell)
.env e preencha seus valores:Exemplo 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
# Opcional: Configuração de Logging
LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR
LOG_FILE= # Opcional: caminho para arquivo de log (ex: logs/vulnhalla.log)
LOG_FORMAT=default # default ou json
# LOG_VERBOSE_CONSOLE=false # Se true, WARNING/ERROR usam formato completo (timestamp - logger - level - message)
📖 Para referência completa de configuração: Veja Referência de Configuração abaixo para todos os provedores suportados (OpenAI, Azure, Gemini, Bedrock), variáveis obrigatórias/opcionais e exemplos detalhados.
Windows (PowerShell):
# Listar versões Python disponíveis
py -0p
# Escolha qualquer Python suportado: 3.10 / 3.11 / 3.12 / 3.13
py -3.12 -m pip install --user -U pipx
py -3.12 -m pipx ensurepath
# Feche e reabra o terminal (obrigatório)
pipx install poetry
poetry --version
macOS / Linux:
# Verifique sua versão do Python
python3 --version
# Use qualquer Python suportado: 3.10 / 3.11 / 3.12 / 3.13
python3 -m pip install --user -U pipx
python3 -m pipx ensurepath
# Reinicie o terminal (obrigatório)
pipx install poetry
poetry --version
Windows (PowerShell):
# Escolha uma versão suportada que você tenha: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # Force o Poetry a usar uma versão Python suportada se você tiver várias versões instaladas
poetry install
poetry run vulnhalla-setup
macOS / Linux:
# Escolha uma versão suportada que você tenha: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # Force o Poetry a usar uma versão Python suportada se você tiver várias versões instaladas
poetry install
poetry run vulnhalla-setup
# Analisar um repositório específico, por exemplo:
poetry run vulnhalla redis/redis
# Baixar novamente mesmo se o database já existir
poetry run vulnhalla redis/redis --force
# Exibir ajuda
poetry run vulnhalla --help
Isso irá automaticamente:
output/results/Se você já tem um database CodeQL em disco (ex: criado manualmente ou de uma execução anterior), pode pular a etapa de busca no GitHub usando a flag --local / -l:
Windows (PowerShell):
poetry run vulnhalla --local C:\caminho\para\meu-codeql-db
macOS / Linux:
poetry run vulnhalla --local /caminho/para/meu-codeql-db
Nota: A flag
--localespera um diretório de database do CodeQL, não uma pasta de código fonte. Você pode verificar se a pasta contém um arquivocodeql-database.yml.
# Abrir interface para visualizar resultados existentes (sem executar análise)
poetry run vulnhalla-ui
# Validar configuração: CodeQL, LLM, Logging (sem executar análise)
poetry run vulnhalla-validate
# Listar repositórios analisados e suas contagens de problemas
poetry run vulnhalla-list
# Executar pipeline de exemplo (analisa videolan/vlc e redis/redis)
poetry run vulnhalla-example
O Vulnhalla inclui uma Interface do Usuário completa para navegar e explorar os resultados da análise.
poetry run vulnhalla-ui
A UI exibe uma área superior de dois painéis com uma barra de controles na parte inferior:
Área Superior (lado a lado, redimensionável):
Painel Esquerdo (Lista de Problemas):
Painel Direito (Detalhes):
Barra de Controles Inferior:
↑/↓ - Navegar na lista de problemas (linha por linha)Tab / Shift+Tab - Alternar foco entre painéisEnter - Mostrar detalhes do problema selecionado/ - Focar caixa de busca (no painel esquerdo)Esc - Limpar busca e retornar foco para tabela de problemasr - Recarregar resultados do disco[ / ] - Redimensionar painéis esquerdo/direito (ajustar posição da divisória)q - Sair da aplicação[ para mover o divisor para a esquerda, ] para mover para a direitaApós executar o pipeline, os resultados são organizados em output/results/<LANG>/<ISSUE_TYPE>/:
output/results/c/Copy_function_using_source_size/
├── 1_raw.json # Dados originais do problema CodeQL
├── 1_final.json # Conversa e classificação do LLM
├── 2_raw.json
├── 2_final.json
└── ...
Cada *_final.json contém:
Cada *_raw.json contém:
output/databases/<LANG>/<ORG>/<REPO>)CodeQL CLI não encontrado:
Defina CODEQL_PATH no seu arquivo .env com o caminho completo do executável CodeQL.
No Windows: O caminho deve terminar com .cmd (ex: C:\caminho\para\codeql\codeql.cmd).
Limites de taxa do GitHub:
Defina GITHUB_TOKEN no seu arquivo .env (obtenha o token em https://github.com/settings/tokens).
Problemas com LLM:
Verifique suas chaves de API no arquivo .env correspondentes ao provedor selecionado.
Erros de importação na UI:
Certifique-se de estar executando a partir do diretório raiz do projeto, ou use python examples/ui_example.py que gerencia a configuração de caminho.
Toda a configuração é gerenciada através de variáveis de ambiente no seu arquivo .env. Aqui está uma referência completa:
| Variável | Obrigatória Para | Descrição |
|---|---|---|
CODEQL_PATH | Todos | Caminho para o executável CodeQL. Padrão é codeql se CodeQL estiver no PATH. Use caminho completo se não estiver no PATH (ex: C:\caminho\para\codeql\codeql.cmd no Windows) |
PROVIDER | Todos | Provedor LLM: openai, azure, gemini, bedrock, anthropic, mistral, groq, openrouter, ollama, etc. |
MODEL | Todos | Nome do modelo (ex: gpt-4o, gpt-4-turbo, gemini-2.5-flash) |
OpenAI:
| Variável | Descrição |
|---|---|
OPENAI_API_KEY | Sua chave de API OpenAI de platform.openai.com |
Azure OpenAI:
| Variável | Descrição |
|---|---|
AZURE_OPENAI_API_KEY ou AZURE_API_KEY | Sua chave de API Azure OpenAI |
AZURE_OPENAI_ENDPOINT ou AZURE_API_BASE | URL do endpoint Azure OpenAI (ex: https://seu-recurso.openai.azure.com) |
AZURE_OPENAI_API_VERSION ou AZURE_API_VERSION | Versão da API (padrão: 2024-08-01-preview) |
Gemini (Google):
| Variável | Descrição |
|---|---|
GOOGLE_API_KEY | Sua chave de API Google de Google AI Studio |
AWS Bedrock:
| Variável | Obrigatório | Descrição |
|---|---|---|
AWS_REGION_NAME | Sim | Região AWS (ex: us-east-1, us-west-2) |
AWS_PROFILE | Não* | Nome do perfil AWS para autenticação SSO/arquivo de credenciais |
AWS_ACCESS_KEY_ID | Não* | Chave de acesso AWS (se não estiver usando perfil) |
AWS_SECRET_ACCESS_KEY | Não* | Chave secreta AWS (se não estiver usando perfil) |
AWS_SESSION_TOKEN | Não | Token de sessão para credenciais STS temporárias |
* Autenticação: Use AWS_PROFILE ou AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY (+ opcional AWS_SESSION_TOKEN para STS).
Exemplo .env Bedrock (SSO):
PROVIDER=bedrock
MODEL=anthropic.claude-3-5-sonnet-20241022-v2:0
AWS_REGION_NAME=us-east-1
AWS_PROFILE=seu-perfil
⚠️ Pré-requisitos:
- As credenciais AWS devem estar configuradas (SSO, perfil IAM ou chaves de acesso) com permissões para invocar modelos Bedrock
- Para usuários SSO: Execute
aws sso login --profile seu-perfilantes de usar o Vulnhalla🔧 Importante - Seleção de Modelo: Ao selecionar um modelo Bedrock, certifique-se de que ele suporta tool calling/function calling (nem todos os modelos Bedrock suportam). Tool calling é uma parte fundamental do fluxo de análise do Vulnhalla, então escolher um modelo compatível faz uma grande diferença na funcionalidade e nos resultados. Modelos compatíveis incluem: Claude 3.x, Mistral ou Cohere Command R.
| Variável | Padrão | Descrição |
|---|---|---|
GITHUB_TOKEN | - | Token da API GitHub para limites de taxa mais altos. Obtenha em GitHub Settings > Tokens |
GITHUB_API_URL | https://api.github.com | URL da API GitHub. Para GitHub Enterprise, defina a URL da API do seu servidor (ex: https://github.sua-empresa.com/api/v3) |
GITHUB_SSL_VERIFY | true | Verificação de certificado SSL. Defina como false para GitHub Enterprise com certificados autoassinados ou de CA interna |
LLM_TEMPERATURE | 0.2 | Temperatura do LLM (0.0-2.0). Menor = mais determinístico. Recomendado: manter em 0.2 |
LLM_TOP_P | 0.2 | Amostragem top-p do LLM (0.0-1.0). Menor = mais focado. Recomendado: manter em 0.2 |
LOG_LEVEL | INFO | Nível de logging: DEBUG, INFO, WARNING ou ERROR. Controla a verbosidade da saída no console |
LOG_FILE | - | Caminho opcional para arquivo de log (ex: logs/vulnhalla.log). Se definido, logs são escritos tanto no console quanto no arquivo. O logging em arquivo usa nível DEBUG para saída detalhada |
LOG_FORMAT | default | Estilo de formato de log: default (legível por humanos) ou json (formato JSON estruturado) |
LOG_VERBOSE_CONSOLE | false | Se true, WARNING/ERROR/CRITICAL usam formato completo (timestamp - logger - level - message). Padrão: WARNING/ERROR usam formato simples (LEVEL - message), INFO sempre mínimo (message apenas) |
THIRD_PARTY_LOG_LEVEL | ERROR | Nível de log para bibliotecas de terceiros (LiteLLM, urllib3, requests). Opções: , , , . Padrão suprime a maior parte do ruído de terceiros |
⚠️ Importante: Não aumente
LLM_TEMPERATUREouLLM_TOP_Pa menos que você entenda completamente o impacto. Valores mais baixos mantêm o modelo estável e determinístico, o que é crítico para análise de segurança. Valores mais altos podem fazer o modelo se tornar inconsistente, criativo ou alucinar resultados.
📝 Nota: Para exemplos adicionais de configuração, veja o arquivo
.env.examplena raiz do projeto.
O Vulnhalla valida sua configuração na inicialização. Se variáveis obrigatórias estiverem ausentes ou inválidas, você verá mensagens de erro claras indicando o que precisa ser corrigido.
Erros comuns de validação:
PROVIDER para valores suportados)CODEQL_PATH estiver definido mas o arquivo não existir)O LLM usa os seguintes códigos de status:
A UI mapeia estes para:
1337 → "Verdadeiro Positivo"1007 → "Falso Positivo"7331 ou 3713 → "Precisa de Mais Dados"O projeto inclui infraestrutura básica de testes usando pytest:
# Executar todos os testes
poetry run pytest
# Executar com saída verbosa
poetry run pytest -v
A suíte de testes inclui testes smoke para verificar se a infraestrutura de testes está configurada corretamente.
O projeto usa mypy para verificação estática de tipos:
poetry run mypy src
A verificação de tipos está configurada em pyproject.toml sob [tool.mypy].
A configuração usa uma linha de base conservadora com substituições por módulo para permitir adoção gradual.
As dependências são gerenciadas via Poetry em pyproject.toml:
requests - Requisições HTTP para API do GitHubpySmartDL - Gerenciador de download inteligente para databases CodeQLlitellm - Interface LLM unificada suportando múltiplos provedorespython-dotenv - Gerenciamento de variáveis de ambientePyYAML - Parsing YAML para arquivos de pacotes CodeQLtextual - Framework de interface de terminalpytest - Framework de teste (dependência de desenvolvimento)mypy - Verificador de tipos estático (dependência de desenvolvimento)As consultas CodeQL estão organizadas em data/queries/<LANG>/:
issues/ - Consultas de detecção de problemas de segurançatools/ - Consultas auxiliares (árvores de função, classes, variáveis globais, macros)Cada diretório contém um arquivo qlpack.yml definindo o pacote CodeQL.
Copyright (c) 2025 CyberArk Software Ltd. Todos os direitos reservados.
Este repositório está licenciado sob a Licença Apache, Versão 2.0 - veja LICENSE.txt para mais detalhes.
Aceitamos contribuições de todos os tipos para este repositório. Para instruções sobre como começar e descrições de nossos fluxos de trabalho de desenvolvimento, consulte nosso guia de contribuição.
Por favor, leia e siga nosso Código de Conduta. Estamos comprometidos em fornecer um ambiente acolhedor e inclusivo para todos os contribuidores.
Sinta-se à vontade para nos contatar através de issues no GitHub se tiver alguma solicitação de funcionalidade ou problema com o projeto.
DEBUGINFOWARNINGERROR