
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 モード: スコアがしきい値を下回ると終了コード 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
# 標準入力から読み取り
cat package.whl | python3 wheelaudit.py --stdin
| ルール | 深刻度 | 説明 |
|---|---|---|
| WH01 | CRITICAL | ファイル名のパストラバーサル (../、絶対パス、ヌルバイト) |
| 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__() — 動的インポート (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