Hugging Face のモデルは trust_remote_code を有効にしない:小型 Qwen2 を装うマイナー「Load/Mine」
悪性モデルの本体は重みではなく付属の Python ファイル。trust_remote_code=True で読み込むと、重みを読む前に呼び出し元の権限で実行される。重みの形式を調べるだけのスキャンでは見つからない。
何が起きたか
- Pluto Security によると、小型 Qwen2 を装った 7 アカウント・31 リポジトリが Hugging Face で見つかった。第 1 波の削除後も別アカウントで再出現している。
- 代表例の重みはテンソルを含まない 42 バイト。付属 Python がカーネルのワーカースレッドを装う名前でマイナーを起動し、シェル起動ファイルで常駐する。一部はリバースシェルや、特権コンテナーからホストへ root ログインするスクリプトも配った。
- 付属 Python はウイルス対策を通過し、提携スキャナーも重みの形式中心の検査だったため検出できなかった。
防ぎ方
- trust_remote_code は既定の False のまま: transformers が標準で対応するアーキテクチャ(Qwen2 など)なら、付属コードなしで読み込める。True が必要なモデルは、付属の
.pyを読んでから判断する。 - 確認した版に固定する:
from_pretrained(..., revision="<コミットハッシュ>")で、確認済みのコミットに固定する。後から付属コードが差し替わっても取り込まない。 - safetensors 形式を選ぶ: pickle 形式(
.bin/.pt)は読み込み時にコードを実行しうる。use_safetensors=Trueを指定する。 - 実行環境を絞る: モデルの取得・評価は、秘密情報を置かない・外向き通信を制限した・特権のないコンテナーで行う。CI で未確認の小型モデルを取得するジョブにも同じ制限をかける。
- 推論サーバーを公開しない: Xinference や GPUStack などの自前推論環境は API 認証と接続元制限を設定する(狙われた環境として挙げられている)。
読み込んでしまったら
- 読み込みに失敗していても侵害を疑う。隔離・通信制限のあと、プロセス・通信・ログ・モデルキャッシュ・常駐設定を保全してから除去する。
- SSH の許可鍵や cron も確認し、その環境から参照できた認証情報は安全な端末で失効・更新する。
注意点
- 3 万 2,000 回超はダウンロード数で、感染数ではない。