
2026/08/30 17:51
QubesOS のコピートーエビョールポートリングバックチャンネルによる任意コード実行
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
中央の Dom0 システムにおいて任意のコード実行を可能にする重大なセキュリティ欠陥について、Qubes セキュリティチームが 2026 年 8 月 28 日に発表した Qubes セキュリティ通告書(QSB)118 に詳述されています。この脆弱性は
qvm-copy-to-vm ユーティリティ内の問題により発生しており、sanitize_remote_filename() が非 ASCII 文字と二重引用符のみを除去するが、system() がエラーダイアログコマンドを実行する前にシェルメタ文字をそのまま残すことから、攻撃者が Dom0 から破損した qube へのファイルコピー時に悪意のあるコマンドを注入できる点が原因です。qvm-copy-to-vm の VM バリアントは execlp() を使用しているため影響はありません。
すべての Qubes OS リリースが影響を受けています。発見へのクレジットは Tim C にあります。対策として、ユーザーは通常通り Dom0 を
qubes-core-dom0-linux パッケージのバージョン 4.3.22 に更新するべきであり、ホストを最新状態に保つ以上の追加の手動ステップは必要ありません。正当性を確認するには、Marek Marczykowski-Górecki および Simon Gaiser の PGP 署名を使って通告書を検証してください:
gpg --verify qsb-118-2026.txt.sig.marmarek qsb-118-2026.txtgpg --verify qsb-118-2026.txt.sig.simon qsb-118-2026.txt
マスター署名キーの指紋(DDFA1A3E36879494)の使用前に、別途チャネルで認証する必要があります。管理者は更新を適用する前に、公式の通告書と署名を参照して正当性を確認してください。
本文
Qubes セキュリティ Bulletin 118:qvm-copy-to-vm
のエラー報告機能による Dom0 へのコード実行脆弱性
qvm-copy-to-vmQubes OS は、
qvm-copy-to-vm コマンドのエラー処理プロセス中に、攻められた VM からファイル転送を試みた際、Dom0(メイン環境)に対して任意のコードを実行できる重大な脆弱性を発見した。
本記事では、このセキュリティ Bulletin(QSB)の内容を整理し、影響範囲、技術的な詳細、対策手順および PGP 署名の検証方法を解説します。
🔴 ユーザーへの対応
【重要】今すぐ必要なこと
- 特別なアクションは不要です。通常通りシステムを更新を行ってください。
- 以下の「パッチ適用」セクションに記載されているアップデートを適用してください。
- この脆弱性を解消するセキュリティアップデートが公開されています。
📌 概要
脆弱性の説明
- 悪意のある VM(qube)からファイルを受信中にエラーが発生した場合、そのエラー処理プロセスで攻撃者がDom0 を制御できてしまいます。
コマンドを使用する際、ターゲット VM がすでに侵害されている状態でファイルをコピーすると、攻撃者は Dom0 に任意のコマンドを実行できます。qvm-copy-to-vm
影響範囲
- 対象: すべての Qubes OS リリース。
- 被害: 攻められた VM からのファイル転送要求に対し、攻撃者が Dom0 を乗っ取って Qubes OS 全体の制御権を奪うことが可能です。
⚙️ 技術的な詳細
1. 脆弱性のメカニズム
qvm-copy-to-vm ツールは「qfile」プロトコルを使用し、ファイル転送完了時にターゲットから確認メッセージを送り返します。このメッセージに含まれるファイル名の処理に問題があります。
問題点:不正な入力フィルタリングの不完全さ
-
整形化(Sanitization)の不備:
関数は、非 ASCII 文字やダブルクォート記号 (sanitize_remote_filename()
) のみを除去しています。 しかし、シェルのメタ文字(特殊文字)はそのまま残っています。"// linux-utils/qrexec-lib/pack.c static void sanitize_remote_filename(char *untrusted_filename) { for (; *untrusted_filename; ++untrusted_filename) { if (*untrusted_filename < ' ' || *untrusted_filename > '~' || *untrusted_filename == '"') *untrusted_filename = '_'; } } -
シェルインジェクション: エラー報告関数
が Dom0 で表示ダイアログを生成するためにcall_error_handler()
を使用しています。system()// core-admin-linux/file-copy-vm/qfile-dom0-agent.c void display_error(const char *fmt, va_list args) { ... // エラーメッセージを構築 asprintf(&dialog_cmd, "%s '%s: %s (error type: %s)'", ...) < 0) { ... } // ⚠️ シェル経由でコマンドを実行(脆弱性) system(dialog_cmd); } -
結果: 攻撃者が制御可能なファイル名を介して、シェルインジェクション攻撃が成功し、Dom0 に任意のコマンドが実行されます。
2. なぜ VM 版は影響を受けないのか?
VM 内部のエラー処理関数は、外部コマンドを実行する
system() を使用していないため安全です。
安全な実装例(VM 版)
- execlp や zenity/kdialog の直接呼び出しを使用するため、シェルパス分割やメタ文字の解釈が防ぎます。
// core-agent-linux/qubes-rpc/gui-fatal.c (影響なし) static void produce_message(...) { if (progress_type && !strcmp(progress_type, "gui")) { switch (fork()) { case -1: exit(1); case 0: // setuid で権限降格を試みる fix_display(); // ⚠️ シェル(system)を使わず、直接実行 execlp("/usr/bin/zenity", "zenity", "--error", "--text", dialog_msg, NULL); execlp("/usr/bin/kdialog", "kdialog", "--sorry", dialog_msg, NULL); exit(1); } } }
🔧 パッチ適用
脆弱性を解消するには、以下のパッケージを更新してください。
対象バージョン
- Qubes OS: 4.3
- パッケージ:
qubes-core-dom0-linux - 最小バージョン: 4.3.22
更新手順
- コミュニティテスト期間を経て、このパッケージが安定版リポジトリに移行します。
- Qubes Update ツールまたはコマンドラインを使用し、通常通りアップデートを適用してください。
# 例:コマンドラインでの更新(環境により異なります) sudo qubes-dom0-update
📜 PGP 署名の検証方法
Qubes セキュリティ Bulletin(QSB)の信頼性を保証するため、必ず PGP 署名を検証してください。偽造されたBulletinに従うと、システムへの悪意のある変更が行われる可能性があります。
検証手順
以下のコマンドは
git と gpg がインストールされている Linux システムを前提としています。
1. Qubes Master Signing Key (QMSK) の取得と認証
まず、信頼できる公開鍵を取得し、オフバンド(別のチャネル)でフィンガープリントを確認して認証してください。
$ gpg --fetch-keys https://keys.qubes-os.org/keys/qubes-master-signing-key.asc
2. キーの信頼レベルを設定
取得したキーを「究極」の信頼(ultimate trust, Level 5)に設定します。
$ gpg --edit-key <KEY_FINGERPRINT> gpg> trust gpg> Your decision? 5 gpg> Do you really want to set this key to ultimate trust? (y/N) y gpg> q
3. リポジトリのクローンと検証(推奨)
qubes-secpack リポジトリから署名を検証する手順です。
# リポジトリをクローン $ git clone https://github.com/QubesOS/qubes-secpack.git # 同梱されている PGP キーをインポート $ gpg --import qubes-secpack/keys/*/* # Git タグの署名を検証(例:qsb-118) $ cd qubes-secpack/ $ git tag -v `git describe`
4. QSB ファイルの直接検証
Bulletin テキストファイルと署名ファイルを指定して検証します。
今回の対象となるコマンドは以下の通りです:
# Marek Marczykowski-Górecki の署名を検証 $ gpg --verify qsb-118-2026.txt.sig.marmarek qsb-118-2026.txt # Simon Gaiser (HW42) の署名を検証 $ gpg --verify qsb-118-2026.txt.sig.simon qsb-118-2026.txt
確認すべき出力: 各コマンドの最終行に、以下のようなメッセージが表示されることを確認してください。
gpg: Good signature from "..."
これにより、Bulletin が Qubes セキュリティチームによって本物であることを証明されます。