
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 파일의 환경 변수를 통해 관리됩니다. 전체 참조는 다음과 같습니다:
OpenAI:
| 변수 | 설명 |
|---|---|
OPENAI_API_KEY | platform.openai.com에서 얻은 OpenAI API 키 |
Azure OpenAI:
Gemini (Google):
| 변수 | 설명 |
|---|---|
GOOGLE_API_KEY | Google AI Studio에서 얻은 Google API 키 |
AWS Bedrock:
* 인증: AWS_PROFILE 또는 AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY (+ 선택적 AWS_SESSION_TOKEN for STS)를 사용하십시오.
Bedrock .env 예시 (SSO):
PROVIDER=bedrock
MODEL=anthropic.claude-3-5-sonnet-20241022-v2:0
AWS_REGION_NAME=us-east-1
AWS_PROFILE=your-profile
⚠️ 사전 요구 사항:
- Bedrock 모델을 호출할 수 있는 권한이 있는 AWS 자격 증명(SSO, IAM 프로필 또는 액세스 키)이 구성되어 있어야 합니다.
- SSO 사용자의 경우: Vulnhalla를 사용하기 전에
aws sso login --profile your-profile을 실행하십시오.🔧 중요 - 모델 선택: Bedrock 모델을 선택할 때 도구 호출/함수 호출을 지원하는지 확인하십시오 (모든 Bedrock 모델이 지원하는 것은 아닙니다). 도구 호출은 Vulnhalla 분석 흐름의 핵심 부분이므로 호환 가능한 모델을 선택하면 기능과 결과에 큰 차이가 있습니다. 호환 가능한 모델은 Claude 3.x, Mistral 또는 Cohere Command R을 포함합니다.
⚠️ 중요:
LLM_TEMPERATURE또는LLM_TOP_P를 영향을 완전히 이해하지 않고는 증가시키지 마십시오. 낮은 값은 모델을 안정적이고 결정적으로 유지하며, 이는 보안 분석에 중요합니다. 높은 값은 모델이 일관성이 없어지거나 창의적이 되거나 결과를 환각(hallucinate)할 수 있습니다.
📝 참고: 추가 구성 예시는 프로젝트 루트의
.env.example파일을 참조하십시오.
Vulnhalla는 시작 시 구성을 검증합니다. 필수 변수가 누락되거나 잘못된 경우 수정해야 할 사항을 나타내는 명확한 오류 메시지가 표시됩니다.
일반적인 유효성 검사 오류:
PROVIDER 참조)CODEQL_PATH가 설정되었지만 파일이 존재하지 않는 경우)LLM은 다음 상태 코드를 사용합니다:
UI는 이를 다음과 같이 매핑합니다:
1337 → "True Positive"1007 → "False Positive"7331 또는 3713 → "Needs More Data"이 프로젝트는 pytest를 사용한 기본 테스트 인프라를 포함합니다:
# 모든 테스트 실행
poetry run pytest
# 상세 출력으로 실행
poetry run pytest -v
테스트 스위트에는 테스트 인프라가 올바르게 설정되었는지 확인하는 smoke 테스트가 포함되어 있습니다.
이 프로젝트는 mypy를 사용한 정적 타입 검사를 사용합니다:
poetry run mypy src
타입 검사는 pyproject.toml의 [tool.mypy]에서 구성됩니다.
구성은 점진적 적용을 허용하기 위해 모듈별 재정의가 있는 보수적인 기준선을 사용합니다.
종속성은 pyproject.toml의 Poetry를 통해 관리됩니다:
requests - GitHub API용 HTTP 요청pySmartDL - CodeQL 데이터베이스용 스마트 다운로드 관리자litellm - 여러 공급자를 지원하는 통합 LLM 인터페이스python-dotenv - 환경 변수 관리PyYAML - CodeQL 팩 파일용 YAML 파싱textual - 터미널 UI 프레임워크pytest - 테스트 프레임워크 (개발 종속성)mypy - 정적 타입 검사기 (개발 종속성)CodeQL 쿼리는 data/queries/<LANG>/에 구성되어 있습니다:
issues/ - 보안 문제 탐지 쿼리tools/ - 도우미 쿼리 (함수 트리, 클래스, 전역 변수, 매크로)각 디렉터리에는 CodeQL 팩을 정의하는 qlpack.yml 파일이 포함되어 있습니다.
Copyright (c) 2025 CyberArk Software Ltd. All rights reserved.
이 저장소는 Apache License, Version 2.0에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE.txt를 참조하십시오.
모든 종류의 기여를 환영합니다. 시작하는 방법과 개발 워크플로에 대한 설명은 기여 가이드를 참조하십시오.
행동 강령을 읽고 준수해 주십시오. 모든 기여자에게 환영하고 포용적인 환경을 제공하기 위해 최선을 다하고 있습니다.
기능 요청이나 프로젝트 문제가 있는 경우 GitHub 이슈를 통해 자유롭게 문의해 주십시오.
| 변수 | 필수 대상 | 설명 |
|---|
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) |
| 변수 | 설명 |
|---|
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) |
| 변수 | 필수 여부 | 설명 |
|---|
AWS_REGION_NAME | 예 | AWS 리전 (예: us-east-1, us-west-2) |
AWS_PROFILE | 아니오* | SSO/자격 증명 파일 인증용 AWS 프로필 이름 |
AWS_ACCESS_KEY_ID | 아니오* | AWS 액세스 키 (프로필을 사용하지 않는 경우) |
AWS_SECRET_ACCESS_KEY | 아니오* | AWS 시크릿 키 (프로필을 사용하지 않는 경우) |
AWS_SESSION_TOKEN | 아니오 | 임시 STS 자격 증명을 위한 세션 토큰 |
| 변수 | 기본값 | 설명 |
|---|
GITHUB_TOKEN | - | 더 높은 속도 제한을 위한 GitHub API 토큰. GitHub 설정 > 토큰에서 가져오기 |
GITHUB_API_URL | https://api.github.com | GitHub API URL. GitHub Enterprise의 경우 서버 API URL로 설정 (예: https://github.your-company.com/api/v3) |
GITHUB_SSL_VERIFY | true | SSL 인증서 확인. 자체 서명 또는 내부 CA 인증서를 사용하는 GitHub Enterprise의 경우 false로 설정 |
LLM_TEMPERATURE | 0.2 | LLM 온도 (0.0-2.0). 낮을수록 더 결정적입니다. 권장: 0.2 유지 |
LLM_TOP_P | 0.2 | LLM top-p 샘플링 (0.0-1.0). 낮을수록 더 집중됩니다. 권장: 0.2 유지 |
LOG_LEVEL | INFO | 로깅 수준: DEBUG, INFO, WARNING 또는 ERROR. 콘솔 출력의 상세도를 제어합니다 |
LOG_FILE | - | 선택적 로그 파일 경로 (예: logs/vulnhalla.log). 설정된 경우 콘솔과 파일 모두에 로그가 기록됩니다. 파일 로깅은 상세 출력을 위해 DEBUG 수준을 사용합니다 |
LOG_FORMAT | default | 로그 형식 스타일: default (사람이 읽을 수 있음) 또는 json (구조화된 JSON 형식) |
LOG_VERBOSE_CONSOLE | false | true인 경우 WARNING/ERROR/CRITICAL에 전체 형식 사용 (timestamp - logger - level - message). 기본: WARNING/ERROR는 단순 형식(LEVEL - message) 사용, INFO는 항상 최소(minimal) (message only) |
THIRD_PARTY_LOG_LEVEL | ERROR | 서드파티 라이브러리(LiteLLM, urllib3, requests)의 로그 수준. 옵션: DEBUG, INFO, WARNING, ERROR. 기본값은 대부분의 서드파티 잡음을 억제합니다 |