テック技報最新号へ →
セキュリティ

Hugging Face のモデルは trust_remote_code を有効にしない:小型 Qwen2 を装うマイナー「Load/Mine」

悪性モデルの本体は重みではなく付属の Python ファイル。trust_remote_code=True で読み込むと、重みを読む前に呼び出し元の権限で実行される。重みの形式を調べるだけのスキャンでは見つからない。

@MalwareBibleJP · 2026-11-02
#supply-chain#hugging-face#ml-model#trust-remote-code#cryptominer

何が起きたか

  • Pluto Security によると、小型 Qwen2 を装った 7 アカウント・31 リポジトリが Hugging Face で見つかった。第 1 波の削除後も別アカウントで再出現している。
  • 代表例の重みはテンソルを含まない 42 バイト。付属 Python がカーネルのワーカースレッドを装う名前でマイナーを起動し、シェル起動ファイルで常駐する。一部はリバースシェルや、特権コンテナーからホストへ root ログインするスクリプトも配った。
  • 付属 Python はウイルス対策を通過し、提携スキャナーも重みの形式中心の検査だったため検出できなかった。

防ぎ方

  1. trust_remote_code は既定の False のまま: transformers が標準で対応するアーキテクチャ(Qwen2 など)なら、付属コードなしで読み込める。True が必要なモデルは、付属の .py を読んでから判断する。
  2. 確認した版に固定する: from_pretrained(..., revision="<コミットハッシュ>") で、確認済みのコミットに固定する。後から付属コードが差し替わっても取り込まない。
  3. safetensors 形式を選ぶ: pickle 形式(.bin / .pt)は読み込み時にコードを実行しうる。use_safetensors=True を指定する。
  4. 実行環境を絞る: モデルの取得・評価は、秘密情報を置かない・外向き通信を制限した・特権のないコンテナーで行う。CI で未確認の小型モデルを取得するジョブにも同じ制限をかける。
  5. 推論サーバーを公開しない: Xinference や GPUStack などの自前推論環境は API 認証と接続元制限を設定する(狙われた環境として挙げられている)。

読み込んでしまったら

  • 読み込みに失敗していても侵害を疑う。隔離・通信制限のあと、プロセス・通信・ログ・モデルキャッシュ・常駐設定を保全してから除去する。
  • SSH の許可鍵や cron も確認し、その環境から参照できた認証情報は安全な端末で失効・更新する。

注意点

  • 3 万 2,000 回超はダウンロード数で、感染数ではない。

出典

X の元の投稿を開く