
Hugging Face
transformersにおける重大なリモートコード実行 (RCE) 脆弱性の防御的分析。
| 項目 | 値 |
|---|---|
| 識別子 | CVE-2026-4372 / GHSA-29pf-2h5f-8g72 |
| コンポーネント | Hugging Face transformers |
| 分類 | リモートコード実行 (CWE-94、コードインジェクション) |
| エントリポイント | AutoModelForCausalLM.from_pretrained()、モデル読み込み時 |
| メカニズム | モデルの config.json 内のアテンション設定 (attn_implementation / _attn_implementation_internal) により、ライブラリが攻撃者のコードをダウンロードして実行する |
| 重要な特性 | trust_remote_code=False をバイパスする。これはまさにこの攻撃を防ぐためにユーザーが依拠している設定である |
| 修正バージョン | transformers 5.3.0 |
安全を保つために意図的に trust_remote_code=False を設定していたユーザーも、依然として影響を受けていた。
以下の詳細を最終的なものとして扱う前に、公式情報源と照合して確認すること:
出回っているトリガーの説明は2つある:
config.json のアテンションフィールド (_attn_implementation_internal)。kernels パッケージ。多くの場合 transformers[all] 経由でインストールされる。これらはおそらく同じ経路である: アテンションフィールドが Hub リポジトリを指定し、
kernels パッケージがそこからコードをダウンロードして実行する。修正コミットが確認するまでは、
ここに記載されたフィールド名は暫定的なものとして扱うこと。
[ Model repo on the Hub ] untrusted source
│ config.json, tokenizer, weights, (code)
▼
[ Download to local cache ]
▼
[ Read config.json ] settings become a config object
▼
[ Pick model class + attention type ]
▼
[ Build model, load weights ]
▼
[ Model runs in the user's process, with the user's permissions ]
| # | 境界 | 適用されるべきガード |
|---|---|---|
| TB-1 | ハブ → ローカルディスク | 信頼済みリポジトリ、固定コミットへのピン留め |
| TB-2 | 設定ファイル → 設定オブジェクト | 既知の安全な値のみを許可する |
| TB-3 | 設定オブジェクト → 実行中のコード | trust_remote_code |
| TB-4 | モデル → オペレーティングシステム | サンドボックス、最小権限 |
このバグは TB-3 における失敗である。設定ファイルからの値が、trust_remote_code チェックを通過することなくコード実行に到達してしまった。
いずれの場合も、被害者は通常の呼び出し AutoModelForCausalLM.from_pretrained("<repo-id>") を実行するだけである。
trust_remote_code は、リポジトリのコードを実行する一つの方法、すなわちカスタムの modeling_*.py ファイルを保護する。アテンション設定は、そのガードを一切経由しない第二の方法であった。
untrusted config.json attention setting
│
▼
"pick attention type" logic
│ never checks:
✗ ─────────────▶ trust_remote_code
▼
download + run code from the Hub (via `kernels`)
_ プレフィックス)が信頼できないファイルから設定可能であった。kernels)がインストールされていると攻撃を暗黙的に有効化した。例えば transformers[all] 経由など。危険な動作そのものを保護せよ。その経路の1つだけではなく。 「コードを実行する」に至りうるすべての経路が、同じチェックを通過しなければならない。
防御は1つの自己完結したスクリプト defence/safe_load.py である。その関数 safe_from_pretrained() は from_pretrained() を置き換え、モデルがロードされる前に4つのチェックを実行する。1つでも失敗すれば UnsafeModelLoad を送出し、何もロードされない。
| # | チェック | 内容 |
|---|---|---|
| 1 | バージョン | transformers が 5.3.0 より古い場合は拒否する。これが本当の修正である。 |
| 2 | Kernels | 古いバージョンでは、攻撃に必要であるため kernels パッケージがインストールされていれば拒否する。 |
| 3 | Config | モデルの設定ファイルを読み取り、危険な設定(下記参照)が含まれていれば拒否する。Hub のモデルは同一コミットでチェックおよびロードされる。 |
| 4 | リモートコード | 常に trust_remote_code=False を設定する。あくまでベストプラクティスであり、この CVE はこれをバイパスする。 |
古いバージョンはチェック1で拒否される。チェック2と3は、ラボ専用オプション allow_vulnerable_env=True が設定されている場合にのみ、古いバージョンで実行される。
チェック3がブロックするもの:
attn_implementation、_attn_implementation、_attn_implementation_internal)。許可されるのは eager、sdpa、flash_attention_2、flash_attention_3、flex_attention のみであるため、attacker-org/evil-kernel のような値は、ネストされたサブ設定内であってもブロックされる。_attn_implementation_internal、auto_map、custom_pipelines。config= で直接渡された設定。チェックをスキップしてしまうため。Hub のモデルでは、設定ファイルのみがダウンロードされ、重みやコードは決してダウンロードされない。これらは1つの固定コミットでダウンロードされ、その後モデルは同じコミットからロードされるため、チェックとロードの間でファイルをすり替えることはできない。警告を確認した後、人は accept_findings=True でチェック3を上書きできる。
| 状況 | 攻撃を阻止するもの |
|---|---|
transformers 5.3.0 以降 | チェック1 |
古いバージョン、kernels インストール済み | チェック2 |
| 古いバージョン、設定に危険な項目あり | チェック3 |
| チェック後にリポジトリが変更された | チェック3(同一コミットでチェックおよびロード) |
制限: チェック3は上記の設定しか認識しないため、新しい攻撃を捕捉することはできない。transformers>=5.3.0 へのアップグレードが唯一の完全な修正である。
検出コンポーネントは、CVE-2026-4372 に関連する潜在的に安全でない Hugging Face モデル設定および脆弱な依存関係を特定する。2つの独立した検出メカニズム、静的設定スキャンと依存関係分析を提供する。
防御コンポーネントとは異なり、これらのツールはモデルをロードしたり信頼できないコードを実行したりすることなく、潜在的なセキュリティリスクを報告する。
ファイル: src/detection/static_detector.py
静的検出器は config.json ファイルを解析し、ネストされた JSON オブジェクトや配列を再帰的に調べて、セキュリティ上重要なフィールドを探す。
以下のフィールドが監視される:
| 設定フィールド | 検出目的 |
|---|---|
_attn_implementation_internal | CVE-2026-4372 に関連する内部アテンション設定フィールド |
_experts_implementation_internal | レビューが必要な追加の内部実装フィールド |
auto_map | カスタムモデル実装コードを参照する可能性がある |
custom_pipelines | カスタムパイプライン実装を参照する可能性がある |
使用方法:
cd src/detection
python3 static_detector.py samples/suspicious_config.json
出力例:
[WARNING] samples/suspicious_config.json: review field '_attn_implementation_internal'
終了コード:
| 終了コード | 意味 |
|---|---|
0 | PASS — 監視対象フィールドは検出されませんでした |
1 | WARNING — 1つ以上の監視対象フィールドが検出されました |
2 | ERROR — 無効な JSON、ファイルの欠落、または処理エラー |
監視対象フィールドの存在は、必ずしも悪用を示すものではありません。検出結果についてはさらなる調査が必要です。
ファイル: src/detection/dependency_detector.py
依存関係検出器は Python 環境を調べて以下を特定します:
kernels パッケージのバージョン(利用可能な場合)kernels パッケージがインポート可能かどうか使用方法:
cd src/detection
python3 -m pip install packaging
python3 dependency_detector.py
シミュレートされた脆弱な環境に対する出力例:
=== CVE-2026-4372 Dependency Detection ===
Transformers version: 5.2.0
Kernels version: Not installed
Kernels import available: False
[WARNING] Vulnerable Transformers version detected.
[INFO] The optional kernels package is not available.
[ACTION] Upgrade Transformers to 5.3.0 or newer.
検出器は読み取り専用のチェックを実行し、脆弱な Transformers バージョンをインストールしたり実行したりすることはありません。
pip-audit ツールを使用して、脆弱なバージョンと修正済みバージョンの Transformers に関する公開セキュリティアドバイザリを比較しました。
ファイル:
requirements-vulnerable.txt — Transformers 5.2.0requirements-patched.txt — Transformers 5.3.0コマンド:
cd src/detection
pip-audit --no-deps --disable-pip -r requirements-vulnerable.txt
pip-audit --no-deps --disable-pip -r requirements-patched.txt
pip-audit 2.10.1 を使用した観測結果:
| Transformers バージョン | 報告された脆弱性エントリ数 |
|---|---|
| 5.2.0 | 6 |
| 5.3.0 | 3 |
パッチ適用後のバージョンでは、脆弱性エントリが3件減少したことが示されました。ただし、Transformers 5.3.0 には依然として他の報告された脆弱性が存在していました。これらの監査結果は、アドバイザリデータベースの更新に伴い変更される可能性があります。
この監査は公開されている依存関係の脆弱性を特定するものであり、悪用可能性を独自に実証するものではありません。
ファイル: src/detection/test_detection.py
Python の組み込み unittest フレームワークを使用して、8つのユニットテストを実装しました。
テストカバレッジ:
auto_map フィールドcustom_pipelines フィールドテストの実行:
cd src/detection
python3 -m unittest -v test_detection.py
観測された結果:
Ran 8 tests
OK
8つのテストはすべて、隔離された Python 3.12 Docker 環境で合格しました。