画像生成AIを自分の計算機で動かすためのソフト「ComfyUI(コンフィーUI)」で使われる拡張機能「ComfyUI-Easy-Use」に、認証なしで外部から任意のプログラムを実行されるおそれのある欠陥(CVE-2026-123790)が見つかった。米国の脆弱性調整機関CERT/CC(CERTコーディネーションセンター)が11月12日(米国時間)に公表し、日本の脆弱性情報サイトJVN(JPCERT/CCと情報処理推進機構が運営)も13日に掲載した。対象は版1.4.1以前。CERT/CCは開発者と連絡が取れなかったとして、拡張機能を削除するか、ComfyUIに接続できる相手を信頼できる利用者に限るよう求めている。

画像生成AIを部品の組み合わせで動かすComfyUI

ComfyUIは、画像生成AIの処理を「ノード」と呼ぶ部品を線でつないで組み立てるソフトだ。CERT/CCは「生成AIのワークフロー(処理の流れ)を組むための、ノードを使う操作画面」と説明している。開発はGitHub上で公開されており、本体のリポジトリ(ソースコードの置き場)には11月15日時点で14万6860の「スター」(利用者が付けるお気に入りの印)が付いている。

グーグル、低コストの画像生成AI「Nano Banana 2 Lite」公開 1枚約5円・4秒で生成のように企業がクラウドで提供する画像生成AIと違い、ComfyUIは利用者が自分のパソコンや借りたサーバーに入れて動かす。モデル(学習済みのAI本体)や処理の部品を利用者が選んで追加できるのが特徴で、第三者が作った拡張機能(カスタムノード)が数多く出回っている。

今回欠陥が見つかったComfyUI-Easy-Useもその一つだ。リポジトリの説明には「ComfyUIを使いやすくするため、よく使うノードを最適化し、まとめた」とある。CERT/CCは「カスタムノードとワークフローの便利な機能を加える拡張機能」としている。このリポジトリのスターは15日時点で2822だった。

送り込んだファイルで部品の初期化処理を上書き

CERT/CCによると、欠陥はComfyUI-Easy-Useの「save_preview()」という処理にある。本来はモデルの見本画像(プレビュー)を保存するための処理だ。

攻撃の手順はこうだ。攻撃者はまず、Python(パイソン)で書いたプログラムのファイルをComfyUIの入力用フォルダーに送り込む。次にsave_preview()を使い、そのファイルを、すでに入っているカスタムノードの「init.py」(ノードを読み込むときに最初に実行されるファイル)に上書きコピーする。ComfyUIが再起動すると、書き換えられたノードが読み込まれ、攻撃者のプログラムが実行される。

CERT/CCは影響として、認証を受けていない攻撃者が、ComfyUIを動かしている利用者の権限でPythonのプログラムやOS(基本ソフト)の命令を実行できると説明する。その権限で読めるモデルやワークフローなどのファイルを読み書きでき、実行環境に置かれた資格情報(パスワードや接続用の鍵など)も取得されうる。利用者が何か操作をする必要は無い。報告者は版1.4.1までで欠陥を確認した。

一方、外部から攻撃できるのは、該当する機能を認証なしで攻撃者に届く状態にしている場合に限られる、とCERT/CCは書いている。

外部から攻撃を受けうるかどうかは、ComfyUIの接続の設定で分かれる。ComfyUI本体の起動設定を定めたプログラム(cli_args.py)によると、ComfyUIは既定で「127.0.0.1」、つまりその計算機自身からの接続だけを受け付ける。待ち受ける番号(ポート)は既定で8188だ。起動時に「--listen」を付けて値を省くと、すべての接続元(IPv4とIPv6)から受け付ける設定に変わる。

自宅のパソコンで既定のまま使っている場合、別の計算機から直接この機能に届くことは無い。危険が高いのは、--listenを付けて家庭内や社内のネットワーク、インターネットに公開している環境や、借りたクラウドのサーバーで動かし、外から画面に接続して使っている環境だ。CERT/CCが対策として接続元の制限を挙げているのはこのためで、パスワードなどの認証を前段に置かずに公開している環境では、拡張機能の更新とは別に、接続できる相手を絞る必要がある。

修正は9月末、公開版v1.4.2は11月14日

CERT/CCは公表文の「解決策」の項で、開発者と連携の連絡が取れなかったとしながら、開発者が修正をコミット「8a0f2fc412」として開発中の版(main)に入れたと記している。製品の状態は「不明」、開発者からの声明も「受け取っていない」としている。

GitHubで確かめると、このコミットは9月29日(日本時間同日午後)に入っていた。件名は「モデル情報と見本画像の処理を堅くする」という趣旨だ。save_preview()は、保存先をcheckpointsとlorasという2種類のモデルのフォルダーに限り、実在するモデルの見本画像にしか書き込めないようにした。コピー元も一時フォルダーの画像ファイルに絞り、拡張子をpng・jpg・jpeg・webp・gifの5つに限ったうえ、中身が本当に画像かを画像処理の部品で確かめる。ComfyUIを再起動させる機能も、誰でも呼び出せる形から、同じ画面からの要求で専用の合言葉(トークン)を添えたときだけ受け付ける形に改めた。

利用者向けの公開版としては、11月14日(日本時間同日午後11時過ぎ)に版1.4.2が出た。GitHubで版1.4.1と1.4.2を比べると、間の18件のコミットに上記の修正が含まれている。ただ、1.4.2の更新内容の説明には新しいノードの追加など4項目が並ぶだけで、この欠陥の修正には触れていない。CERT/CCの公表は1.4.2の公開より前で、1.4.2を修正版と明記した公式の文書は確認できていない。

日付 出来事
9月5日 版1.4.1を公開
9月27日 関連する欠陥の報告がGitHubに投稿される(Issue #1045)
9月29日 開発中の版(main)に修正のコミット
11月12日 CERT/CCが公表(米国時間)
11月13日 JVNが掲載
11月14日 修正を含む版1.4.2を公開
ComfyUI-Easy-Useの欠陥をめぐる経過出典: CERT/CC、JVN、yolain/ComfyUI-Easy-Use(GitHub)

先行する別の報告は「未解決」のまま

修正のコミットには、9月27日にGitHubに投稿された報告(Issue #1045)の番号が付いている。この報告は、細工したモデルのファイルをきっかけにする別の経路を挙げていた。モデルのファイルに埋め込んだ説明文を、ComfyUI-Easy-Useの画面が無害化しないまま表示するため、利用者がそのモデルの情報画面を開くと、攻撃者の命令がその画面の中で実行される。そこから同じ見本画像の保存機能でカスタムノードの__init__.pyを書き換え、再起動の機能でComfyUIを起動し直させれば、書き換えたプログラムがすぐに実行される、という内容だ。

報告は、ComfyUI本体がcustom_nodes(カスタムノードの置き場)をモデルと同じ種類のフォルダーとして登録しているため、保存機能の書き込み先に__init__.pyを指定できたと分析している。こちらは利用者が細工されたモデルを入れて情報画面を開くことが前提で、CERT/CCが公表した認証不要の経路とは条件が異なる。修正のコミットは、見本画像の保存と再起動の処理に加え、モデルの情報画面を組み立てる画面側のプログラムにも手を入れている。この報告は15日時点でGitHub上で「未解決(open)」のままになっている。

ComfyUI-Easy-Useを使っている人がとれる対応は、版1.4.2以降に更新すること、使っていないなら削除すること、そしてComfyUIを外部に公開している場合は接続元を信頼できる相手に限ることの3つになる。拡張機能の多くは個人が開発しており、今回のように開発者と調整機関の連絡が取れないまま公表に至ることもある。外から入れた部品が更新されているかどうかは、利用者の側で確かめる必要がある。