
GitHub 저장소에서 CodeQL 쿼리를 실행하고 LLM을 사용하여 실제 취약점과 오탐을 분류하고 필터링하는 자동화된 보안 분석 파이프라인입니다.
Vulnhalla의 연구 배경 및 동기에 대한 자세한 개요는 공식 CyberArk 위협 연구 블로그 게시물을 참조하십시오:
Vulnhalla: Picking the True Vulnerabilities from the CodeQL Haystack
시작하기 전에 다음이 필요합니다:
Python 3.10 – 3.13 (Python 3.11 또는 3.12 권장)
CodeQL CLI
codeql이 있는지 확인하거나, .env에서 경로를 설정합니다 (2단계 참조)(선택 사항) GitHub API 토큰
LLM API 키
모든 구성은 단일 파일 .env에 있습니다.
git clone https://github.com/cyberark/Vulnhalla
cd Vulnhalla
.env.example을 .env로 복사합니다:cp .env.example .env # macOS / Linux
Copy-Item .env.example .env # Windows (PowerShell)
.env를 편집하고 값을 입력합니다: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
# 선택 사항: 로깅 구성
LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR
LOG_FILE= # 선택 사항: 로그 파일 경로 (예: logs/vulnhalla.log)
LOG_FORMAT=default # default 또는 json
# LOG_VERBOSE_CONSOLE=false # true인 경우 WARNING/ERROR에 전체 형식 사용 (timestamp - logger - level - message)
📖 전체 구성 참조는: 아래 구성 참조에서 지원되는 모든 공급자(OpenAI, Azure, Gemini, Bedrock), 필수/선택 변수 및 자세한 예시를 확인하세요.
Windows (PowerShell):
# 사용 가능한 Python 버전 나열
py -0p
# 지원되는 Python 중 선택: 3.10 / 3.11 / 3.12 / 3.13
py -3.12 -m pip install --user -U pipx
py -3.12 -m pipx ensurepath
# 터미널을 닫고 다시 엽니다 (필수)
pipx install poetry
poetry --version
macOS / Linux:
# Python 버전 확인
python3 --version
# 지원되는 Python 중 사용: 3.10 / 3.11 / 3.12 / 3.13
python3 -m pip install --user -U pipx
python3 -m pipx ensurepath
# 터미널 재시작 (필수)
pipx install poetry
poetry --version
Windows (PowerShell):
# 설치된 지원 버전 중 하나 선택: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # 여러 버전이 설치된 경우 지원되는 Python 버전을 강제로 사용
poetry install
poetry run vulnhalla-setup
macOS / Linux:
# 설치된 지원 버전 중 하나 선택: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # 여러 버전이 설치된 경우 지원되는 Python 버전을 강제로 사용
poetry install
poetry run vulnhalla-setup
# 특정 레포지토리 분석, 예:
poetry run vulnhalla redis/redis
# 데이터베이스가 이미 존재해도 다시 다운로드
poetry run vulnhalla redis/redis --force
# 도움말 보기
poetry run vulnhalla --help
이렇게 하면 자동으로:
output/results/에 저장이미 디스크에 CodeQL 데이터베이스가 있는 경우 (예: 수동으로 생성 또는 이전 실행에서), --local / -l 플래그를 사용하여 GitHub 가져오기 단계를 건너뛸 수 있습니다.
Windows (PowerShell):
poetry run vulnhalla --local C:\path\to\my-codeql-db
macOS / Linux:
poetry run vulnhalla --local /path/to/my-codeql-db
참고:
--local플래그는 소스 코드 폴더가 아닌 CodeQL 데이터베이스 디렉터리를 필요로 합니다. 폴더에codeql-database.yml파일이 있는지 확인하여 확인할 수 있습니다.
# 분석 실행 없이 기존 결과 보기 위해 UI 열기
poetry run vulnhalla-ui
# 구성 유효성 검사: CodeQL, LLM, 로깅 (분석 실행 없이)
poetry run vulnhalla-validate
# 분석된 레포지토리 및 문제 수 나열
poetry run vulnhalla-list
# 예제 파이프라인 실행 (videolan/vlc 및 redis/redis 분석)
poetry run vulnhalla-example
Vulnhalla는 분석 결과를 탐색하고 살펴보기 위한 완전한 기능의 사용자 인터페이스를 포함합니다.
poetry run vulnhalla-ui
UI는 두 개의 패널 상단 영역과 하단 컨트롤 막대로 구성됩니다.
상단 영역 (좌우 나란히, 크기 조절 가능):
왼쪽 패널 (문제 목록):
오른쪽 패널 (세부 정보):
하단 컨트롤 막대:
↑/↓ - 문제 목록 탐색 (행별)Tab / Shift+Tab - 패널 간 포커스 전환Enter - 선택한 문제의 세부 정보 표시/ - 검색 입력 상자에 포커스 (왼쪽 패널)Esc - 검색 지우고 문제 테이블로 포커스 복귀r - 디스크에서 결과 다시 로드[ / ] - 왼쪽/오른쪽 패널 크기 조정 (분할 위치 조정)q - 애플리케이션 종료[를 사용하여 구분선을 왼쪽으로, ]를 사용하여 오른쪽으로 이동파이프라인 실행 후 결과는 output/results/<LANG>/<ISSUE_TYPE>/에 정리됩니다:
output/results/c/Copy_function_using_source_size/
├── 1_raw.json # 원본 CodeQL 문제 데이터
├── 1_final.json # LLM 대화 및 분류
├── 2_raw.json
├── 2_final.json
└── ...
각 *_final.json 파일에는 다음이 포함됩니다:
각 *_raw.json 파일에는 다음이 포함됩니다:
output/databases/<LANG>/<ORG>/<REPO>)CodeQL CLI를 찾을 수 없음:
.env 파일의 CODEQL_PATH에 CodeQL 실행 파일의 전체 경로를 설정하십시오.
Windows에서: 경로는 .cmd로 끝나야 합니다 (예: C:\path\to\codeql\codeql.cmd).
GitHub 속도 제한:
.env 파일의 GITHUB_TOKEN을 설정하십시오 (토큰은 https://github.com/settings/tokens에서 가져오기).
LLM 문제:
.env 파일의 API 키가 선택한 공급자와 일치하는지 확인하십시오.
UI에서 가져오기 오류:
프로젝트 루트 디렉터리에서 실행 중인지 확인하거나, 경로 설정을 처리하는 python examples/ui_example.py를 사용하십시오.
모든 구성은 .env 파일의 환경 변수를 통해 관리됩니다. 전체 참조는 다음과 같습니다:
| 변수 | 필수 대상 | 설명 |
|---|---|---|
CODEQL_PATH | 모든 사용자 | CodeQL 실행 파일 경로. CodeQL이 PATH에 있으면 기본값은 codeql입니다. PATH에 없으면 전체 경로를 사용하십시오 (Windows의 경우 예: C:\path\to\codeql\codeql.cmd) |
PROVIDER | 모든 사용자 | LLM 공급자: openai, azure, gemini, bedrock, anthropic, mistral, groq, openrouter, ollama 등 |
MODEL | 모든 사용자 | 모델 이름 (예: gpt-4o, gpt-4-turbo, gemini-2.5-flash) |
OpenAI:
| 변수 | 설명 |
|---|---|
OPENAI_API_KEY | platform.openai.com에서 얻은 OpenAI API 키 |
Azure OpenAI:
| 변수 | 설명 |
|---|---|
AZURE_OPENAI_API_KEY 또는 AZURE_API_KEY | Azure OpenAI API 키 |
AZURE_OPENAI_ENDPOINT 또는 AZURE_API_BASE | Azure OpenAI 엔드포인트 URL (예: https://your-resource.openai.azure.com) |
AZURE_OPENAI_API_VERSION 또는 AZURE_API_VERSION | API 버전 (기본값: 2024-08-01-preview) |
Gemini (Google):
| 변수 | 설명 |
|---|---|
GOOGLE_API_KEY | Google AI Studio에서 얻은 Google API 키 |