
Python Wheel 파일 보안 스캐너 — 설치 전에 .whl 파일에서 보안 문제를 스캔합니다. 경로 탐색(CVE-2026-24049), RECORD 변조, 명령어 섀도잉, 비밀 정보, zip 폭탄을 탐지합니다. 의존성 없음.
Python Wheel 파일 보안 스캐너 — 설치 전에 .whl 파일의 보안 문제를 스캔합니다.
최근 Python wheel 처리에서 발생한 CVE에서 영감을 받았습니다:
의존성 제로. 단일 파일. Python 3.9+.
pip-audit는 패키지에 알려진 CVE가 있는지 확인합니다. wheelaudit는 wheel 파일 자체가 구조적으로 악성인지 확인합니다 — 경로 탐색, 변조된 RECORD 해시, 내장된 비밀 정보, 명령어 섀도잉, zip 폭탄 등. "이 패키지가 알려진 악성인가?"와 "이 패키지가 악성으로 보이는가?"의 차이입니다.
pip install 전에 실행하세요. CI에서 실행하세요. 신뢰할 수 없는 다운로드 wheel에 대해 실행하세요.
# 파일만 복사
curl -O https://raw.githubusercontent.com/kriskimmerle/wheelaudit/main/wheelaudit.py
chmod +x wheelaudit.py
# 또는 저장소 클론
git clone https://github.com/kriskimmerle/wheelaudit.git
cd wheelaudit
# wheel 파일 스캔
python3 wheelaudit.py package-1.0.0-py3-none-any.whl
# 여러 wheel 스캔
python3 wheelaudit.py *.whl
# wheel 디렉토리 스캔
python3 wheelaudit.py ./wheels/
# CI 모드: 점수가 임계값 미만이면 exit 1
python3 wheelaudit.py package.whl --check --min-score 80
# 도구 통합용 JSON 출력
python3 wheelaudit.py package.whl --json
# 상세 정보 포함 자세한 모드
python3 wheelaudit.py package.whl -v
# 심각도별 필터링
python3 wheelaudit.py package.whl --severity high
# 특정 규칙 무시
python3 wheelaudit.py package.whl --ignore WH11
# stdin에서 읽기
cat package.whl | python3 wheelaudit.py --stdin
| 규칙 | 심각도 | 설명 |
|---|---|---|
| WH01 | CRITICAL | 파일 이름의 경로 탐색 (../, 절대 경로, null 바이트) |
| WH02 | CRITICAL-HIGH | RECORD 파일 무결성 (누락, 변조된 해시, 미등록 파일) |
| WH03 | HIGH-LOW | 의심스러운 파일 유형 (실행 파일, pickle, 아카이브, 숨김 파일) |
| WH04 | CRITICAL | 엔트리 포인트 명령어 섀도잉 (pip, python, sudo 등) |
| WH05 | CRITICAL | 내장된 비밀 정보 (API 키, 토큰, 개인 키) |
| WH06 | CRITICAL-LOW | 파일 권한 문제 (SUID/SGID, 전역 쓰기 가능, 실행 가능 데이터) |
| WH07 | HIGH-MEDIUM | 메타데이터 일관성 (METADATA/WHEEL 누락, 구조적 문제) |
| WH08 | HIGH | Zip 폭탄 탐지 (극단적 압축 비율, 과대 아카이브) |
| WH09 | HIGH-MEDIUM | PEP 427 준수 (파일 이름 형식, 이름/버전 불일치) |
| WH10 | CRITICAL | 네임스페이스 충돌 (stdlib 모듈 섀도잉) |
| WH11 | HIGH-MEDIUM | 악성 코드 패턴 (eval, exec, os.system, 자격 증명 접근) |
| WH12 | MEDIUM-LOW | 데이터 파일 문제 (.data/의 스크립트, 과대 파일) |
| WH13 | HIGH | CRC32 조작 (CVE-2025-1889 우회 패턴) |
| WH14 | HIGH | 확장자 불일치 (.py/.txt로 위장한 ELF/PE 바이너리) |
| WH15 | HIGH-MEDIUM | 심볼릭 링크 및 중복 파일 이름 |
CRITICAL (20점): 경로 탐색, SUID 비트, 내장된 비밀 정보, 명령어 섀도잉, stdlib 섀도잉, RECORD 해시 변조
HIGH (12점): RECORD 누락, 의심스러운 실행 파일, zip 폭탄, CRC 조작, 확장자 불일치, 심볼릭 링크, 자격 증명 수집 패턴
MEDIUM (6점): 백슬래시 경로, 메타데이터 누락, PEP 427 문제, subprocess/네트워크 패턴
LOW (2점): 숨김 파일, 실행 가능 데이터 파일, 대용량 파일
INFO (0점): 합법적인 네이티브 확장, 환경 변수 접근
============================================================
requests 2.32.5 — B (88/100)
============================================================
[HIGH]
WH11 의심스러운 패턴: __import__() — 동적 import (requests/packages.py)
요약: high 1건
============================================================
evil-pip 99.0.0 — F (0/100)
============================================================
[CRITICAL]
WH01 wheel 아카이브의 경로 탐색 (../../../etc/crontab)
WH04 엔트리 포인트가 시스템 명령어를 가림: 'pip'
WH04 엔트리 포인트가 시스템 명령어를 가림: 'python'
WH05 내장된 비밀 정보: GitHub 개인 액세스 토큰 (pip/__init__.py)
[HIGH]
WH02 RECORD에 나열되지 않은 파일 (../../../etc/crontab)
WH03 의심스러운 파일 유형: .exe (pip/payload.exe)
WH11 의심스러운 패턴: os.system() — 셸 명령어 실행
WH11 의심스러운 패턴: eval() 호출 — 동적 코드 실행
WH11 의심스러운 패턴: SSH 디렉토리 참조
요약: critical 4건, high 5건, medium 2건, low 2건
{
"version": "0.1.0",
"results": [
{
"path": "package-1.0.0-py3-none-any.whl",
"score": 88,
"grade": "B",
"metadata": {
"name": "package",
"version": "1.0.0",
"file_count": 15,
"total_uncompressed_bytes": 45000
},
"findings": [
{
"rule": "WH11",
"severity": "high",
"message": "Suspicious pattern: __import__() — dynamic import",
"file": "package/compat.py"
}
],
"summary": {
"high": 1
}
}
]
}
- name: Audit wheel
run: |
python3 wheelaudit.py dist/*.whl --check --min-score 80
pip download some-package --no-deps -d /tmp/wheels
python3 wheelaudit.py /tmp/wheels/*.whl --check
pip install /tmp/wheels/*.whl
wheelaudit는 모든 .whl 파일을 신뢰할 수 없는 zip 아카이브로 취급합니다. 다음을 수행합니다:
파일이 디스크에 추출되지 않습니다. 모든 분석은 메모리에서 수행됩니다.
| 기능 | wheelaudit | pip-audit | safety | GuardDog |
|---|---|---|---|---|
| 의존성 제로 | ✅ | ❌ | ❌ | ❌ |
| wheel 콘텐츠 스캔 | ✅ | ❌ | ❌ | ✅ |
| 경로 탐색 탐지 | ✅ | ❌ | ❌ | ❌ |
| RECORD 무결성 | ✅ | ❌ | ❌ | ❌ |
| CVE 데이터베이스 | ❌ | ✅ | ✅ | ❌ |
| 오프라인 작동 | ✅ | ❌ | ❌ | ❌ |
| Python 3.9+ | ✅ | ✅ | ✅ | ✅ |
wheelaudit는 pip-audit/safety를 보완합니다 — 이들은 알려진 취약점을 확인하고, wheelaudit는 wheel 자체를 확인합니다.
MIT