製品 Lemma API証明の発行・検証の基盤Trust402エージェントに任せ、取引するSeal鍵を渡さない、エージェント時代のサインイン
ユースケース 製造・基幹インフラ検査記録アシュアランス金融・FinTech取引先レコード検証自治体・公共証明書レス手続き医療・ヘルスケア有資格者アシュアランス調達・サプライチェーン仕入先資格モニタリングメディア・コンテンツコンテンツ真正性サービス・小売グループ横断アイデンティティAI導入(業種横断)AI実行ガバナンス開発者・エージェント運用エージェント権限統制 ▸ 業界別ソリューション索引を見る
料金
リソース Critical BriefAI×信頼の最前線ブログ考え方と実装の記録ドキュメントAPI と仕様書検証センター検証・発行の実数運営会社FRAME00, Inc.お問い合わせ導入・取材のご相談ニュースレター更新のお知らせ用語集言葉の定義FAQよくある質問
始める ↗ EN

Hugging Face Diffusers「FaceHugger」:モデルを読み込むだけで任意コードが実行された

安全ガードは最初の1回しか確かめていなかった(Zafran / CVE-2026-44827 他)

事案日
2026-07-27
公開日
2026-08-04
発行
Lemma Critical Team
関連 Pack
Pack A · Incident Response

TL;DR

2026 年 7 月 27 日、セキュリティ企業 Zafran は、Hugging Face の画像生成ライブラリ Diffusers に、悪性のモデルリポジトリを読み込ませるだけで利用者の端末で任意の Python コードが実行される欠陥群を公表した。総称は FaceHugger。原因は、未審査コードの実行を止めるはずの安全ガード trust_remote_code を、時間差(TOCTOU)で回避できたことにある。モデルのダウンロードは設定取得と本体取得という 2 回の非アトミックな HTTP リクエストに分かれており、ガードは最初の 1 回にしか働いていなかった。ガードは動いていた。効かなかったのは、ガードが確認した対象と、実際に実行される対象が同一だと確かめる層である。

何が起きたか

  • 対象は Hugging Face の Diffusers(拡散モデル用ライブラリ)。DiffusionPipeline.from_pretrained でカスタムパイプラインを読み込む利用者が影響を受け、悪性のモデルリポジトリを読み込んだ端末で任意コードが静かに実行される。月間およそ 700 万ダウンロード(1 日約 20 万)が、本番の AI パイプラインや CI/CD の内側で動いている。
  • 3 つの CVE として追跡される。CVE-2026-44827(CVSS 8.8)=既定で解決されるファイル名 None.py をカスタムパイプラインコードとして読ませるコードインジェクション。CVE-2026-45804(CVSS 7.5)=hf_hub_downloadsnapshot_download の 2 回の呼び出しのあいだに設定を書き換える競合状態。CVE-2026-44513(CVSS 8.8)=クロスリポジトリのパイプライン読込・ローカルスナップショットからの読込・悪性カスタムコンポーネントという、同じ根を持つ 3 変種を束ねたもの。
  • いずれも trust_remote_code——未審査のカスタムコード実行を止めるために設けられ、既定では無効(False)——を回避する。

回避は次の連鎖で成立している。

  1. モデルのダウンロードが「設定ファイルの取得」と「本体の取得」という、単一のアトミックな操作ではない 2 回の HTTP リクエストに分かれている。
  2. trust_remote_code のチェックは、最初のリクエスト(設定)に対してしか働かない。
  3. ガードが見た対象と、実際にロードされる対象を食い違わせる。競合状態の変種(CVE-2026-45804)では、チェック後・本体取得前の窓で設定を差し替える——Zafran の実測でこの窓は約 0.3 秒であり、初回ダウンロードが未キャッシュであることを要する。ただし利用の多いリポジトリでは、悪性の設定を一瞬だけ置いて戻すことで統計的に成功しうると同社は指摘する。他の変種は時間差を要さず、None.py の既定解決やクロスリポジトリ・ローカルスナップショット経由で同じ食い違いを作る。
  4. 差し替えられたコードが、ガードを通過した「安全」な扱いのまま実行される。

時系列 — 公表と対応

  • 2026-03-19:Zafran が最初の 2 件を Hugging Face へ報告。
  • 2026-05-01:修正版 Diffusers 0.38.0 が公開。
  • 2026-05:責任開示を経て CVE が公表。
  • 2026-07-27:Zafran Labs(Gal Zaban、Ido Shani)が技術詳細を公表。
  • 2026-08-03:The Hacker News、Cybersecurity News 等が報じ、報道が広がる。

CVSS はいずれも CNA である GitHub の採点である。NVD 上の評価状態は CVE ごとに異なり、本 Brief 執筆時点で CVE-2026-44827 は Analyzed、CVE-2026-44513 は Modified、CVE-2026-45804 は Awaiting Analysis である。責任開示を経ての公表であり、本 Brief 公表時点で広範な実地悪用の報告は確認されていない。

公表後の対応と業界の動きは次のとおり。

  • Diffusers は 0.38.0 で、セキュリティチェックを動的モジュール読込の隘路へ移し、確認の対象と実行の対象を同じ地点に揃えることで既知の回避経路を塞いだ。利用者には 0.38.0 以降への更新と、リポジトリのリビジョン固定が推奨されている。
  • Zafran は同時に Hugging Face の transformers にも並行する欠陥を開示した。固定したコミットハッシュが伝播せず、trust_remote_code の承認後に悪性コードへ差し替えられる——同じ「確認と使用のあいだ」の問題である。
  • 本件に先立つ 2026 年 3〜4 月にも、モデル読込時の同種のコード実行が別のフレームワークで指摘されている(3 月に vLLM の trust_remote_code 回避、4 月に InstructLab の trust_remote_code=True ハードコード)。「モデルを読み込む=コードを実行しうる」という前提が、拡散モデルに限らないことを示す。

なぜ止まらなかったか

この事案の失敗は、安全ガードが無かったことでも、ガードが誤作動したことでもない。ガードが確認した対象と、実際に実行される対象が同一だと独立に確かめる層が無かったことにある。

trust_remote_code は、未審査コードの実行を止めるために設けられ、既定でカスタムコードを拒んでいた。検出は効いていた。効かなかったのは、その手前——チェックの瞬間に見た成果物と、実行の瞬間の成果物が同じものだという保証——である。

TOCTOU は、確認と使用のあいだに対象が変わりうるとき、確認そのものを無意味にする。ガードは嘘をつかない。ただ、確認した対象がもう存在しないだけである。

モデルは、名前とカードとダウンロード数をまとって配布される。だがそれらは、いま実行されようとしているコードの来歴を証明しない。差し替えは、リポジトリという「信頼された配布経路」の内側で起きる。Brief 116 が示した「トレンドやダウンロード数は来歴の代用にならない」を、実行時点の完全性まで押し進めた事案であり、スキャナーを通過した後に中身が変わる Brief 090 の時間差と地続きである。

証明があれば、何が変わるか

事前証明(proof-as-auth)は、モデルが読み込まれる一つひとつの実行の前に、いま実行される成果物そのものの来歴を独立に検証する層を経路に一段挟む。リポジトリの所在や名声を来歴の代用にせず、「このコードと重みは、主張どおりの発行者が発行した、改ざんされていないものか」を、実行が成立する前に確かめる。差し替えの起きる「チェックと実行のあいだ」ではなく、「実行の直前」に置くのが要点である。

Lemma がこの primitive に対して提示する設計は次の通りである。

  • 実行される成果物への来歴バインド:モデルカードや名前ではなく、実際にロードされるコード・重みのハッシュに、来歴と発行者の証明を結びつける。
  • 読み込みの直前検証:取得の完了後・実行の直前に、成果物が検証済みの来歴と一致することを確かめ、チェックと使用の間隙を閉じる。
  • 発行者の独立検証:リポジトリの所在ではなく、発行者の身元を独立に確かめる。
  • 最小権限での実行:モデル読込プロセスを、コード実行を前提としないスコープに閉じる。

Lemma は、悪性のモデルを見分ける製品でも、コードの危険性を判定するものでもない。射程は、実行される成果物の来歴を実行の前に独立検証し、証明と一致しない読み込みを差し止め可能にすることにある。スキャナーやガード(trust_remote_code、リビジョン固定、リポジトリの監視)と、事前証明(実行の直前に成果物の同一性を確かめる証跡)は、代替ではなく補完の関係にある。前者は既知の危険を弾き、後者は「確認した対象と実行される対象がずれる」という、検出が構造的に届かない一点を閉じる。補完の位置づけは 「AI 時代のサイバー防衛に残された、最後の層」(Lemma、2026-05)、設計の詳細は 「Proof-as-Auth: 鍵を一度も送らずにサインインする」、適用範囲は Pillar 02 — 検証可能 AI を参照。

Sources

「AI 時代のサイバー防衛に残された、最後の層」Pillar 02 — 検証可能 AIBrief 116(偽の OSS プライバシーフィルタ)Brief 090(AIR 偽エージェントスキル)

本資料は公開情報の構造化分析であり、特定組織への監査・診断・推奨ではありません。

この Brief を引用する

Lemma Critical Team. (2026).
"Hugging Face Diffusers「FaceHugger」:モデルを読み込むだけで任意コードが実行された — 安全ガードは最初の1回しか確かめていなかった(Zafran / CVE-2026-44827 他)".
Lemma Critical Brief No.121. Lemma / FRAME00, Inc.
https://lemma.frame00.com/ja/critical/briefs/121-hugging-face-diffusers-toctou/
Lemma

確かめられないものを、
業務に入れない。

Lemma は、データや AI の実行に暗号技術で証明を付け、受け取った側が発行者に問い合わせることなく真正性を確認できるようにします。検出はそのままに、その前段へ一層を足す構成です。