通过copy-to-VM错误报告回传通道在QubesOS中执行任意代码

Hacker News Top 新闻

摘要

Qubes安全公告118详述了一个关键漏洞,恶意qube可以利用qvm-copy-to-vm错误报告机制,在特权dom0域中执行任意代码。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/08/30 09:42

# QSB-118:qvm-copy-to-vm 错误报告中的 Dom0 任意代码执行漏洞 来源:https://www.qubes-os.org/news/2026/08/29/qsb-118/ 我们已发布 Qubes 安全公告(QSB)118:qvm-copy-to-vm 错误报告中的 Dom0 任意代码执行漏洞 (https://github.com/QubesOS/qubes-secpack/blob/f65082c8211a421ed15a59219d6e54e93289fafb/QSBs/qsb-118-2026.txt)。此 QSB 的文本及其配套的加密签名如下,后附此公告的通用说明和身份验证说明。 ## Qubes 安全公告 118 ``` ---===[ Qubes Security Bulletin 118 ]===--- 2026-08-28 qvm-copy-to-vm 错误报告中的 Dom0 任意代码执行漏洞 用户操作 ------------ 请正常继续更新 [1] 以接收下文“修补”部分描述的安全更新。无需因本 QSB 进行其他用户操作。 摘要 -------- 如果使用 `qvm-copy-to-vm` 从 dom0 复制文件到一个恶意 qube,该 qube 可能向 dom0 注入任意命令。 影响 ------- 如果攻击者已控制一个 qube,并且用户从 dom0 向该受控 qube 发起 `qvm-copy-to-vm` 调用,那么攻击者可利用此漏洞向 dom0 注入任意命令,从而完全控制 Qubes OS。 技术细节 ------------------ `qvm-copy-to-vm` 工具允许从 dom0 复制文件到指定的 qube。它使用“qfile”协议,这是一种简化的归档格式,包含简单的文件元数据(比 `tar` 或 `cpio` 简单得多)。该协议还包括结束时由目标发回源的传输确认信息。该确认信息包括所有传输文件的校验和、错误代码(如有)以及最后接收的文件名。在发生错误时(如错误代码字段所示),dom0 会显示一个包含错误信息和目标 qube 报告的受影响文件名的 GUI 消息。漏洞存在于对该文件名的处理过程中: 1. `wait_for_result()` 函数在将接收到的名称传递给错误处理器之前,会调用 `sanitize_remote_filename()` 对其进行处理: linux-utils/qrexec-lib/pack.c: 55 static void sanitize_remote_filename(char *untrusted_filename) 56 { 57 for (; *untrusted_filename; ++untrusted_filename) { 58 if (*untrusted_filename < ' ' || 59 *untrusted_filename > '~' || 60 *untrusted_filename == '"') 61 *untrusted_filename = '_'; 62 } 63 } 64 65 void wait_for_result(void) 66 { ... 98 /* sanitize the remote filename */ 99 sanitize_remote_filename(last_filename); 100 101 errno = hdr.error_code; 102 if (hdr.error_code != 0) { 103 switch (hdr.error_code) { 104 case EEXIST: 105 call_error_handler("A file named \"%s\" already exists in QubesIncoming dir", last_filename); 106 break; ... 2. 然后,`call_error_handler()` 调用 dom0 版本的错误报告函数 -- `gui_fatal()` -> `display_error()`,后者使用 `system()` 启动实际的错误对话框: core-admin-linux/file-copy-vm/qfile-dom0-agent.c: 15 void display_error(const char *fmt, va_list args) { 16 char *dialog_cmd; 17 char buf[1024]; 18 struct stat st_buf; 19 int ret; 20 21 (void) vsnprintf(buf, sizeof(buf), fmt, args); 22 ret = stat("/usr/bin/kdialog", &st_buf); 23 #define KDIALOG_CMD "kdialog --title 'File copy/move error' --sorry " 24 #define ZENITY_CMD "zenity --title 'File copy/move error' --warning --text " 25 if (asprintf(&dialog_cmd, "%s '%s: %s (error type: %s)'", 26 ret==0 ? KDIALOG_CMD : ZENITY_CMD, 27 program_invocation_short_name, buf, strerror(errno)) < 0) { 28 fprintf(stderr, "Failed to allocate memory for error message :(\n"); 29 return; 30 } 31 #undef KDIALOG_CMD 32 #undef ZENITY_CMD 33 fprintf(stderr, "%s\n", buf); 34 system(dialog_cmd); 35 } 36 37 _Noreturn void gui_fatal(const char *fmt, ...) { 38 va_list args; 39 va_start(args, fmt); 40 display_error(fmt, args); 41 va_end(args); 42 exit(1); 43 } 问题在于 `sanitize_remote_filename()` 仅移除了非 ASCII 字符(和双引号),但保留了 shell 元字符。然后,`system()` 执行构建的命令,其中包含攻击者控制的名称(通过 shell 执行)。 请注意,`qvm-copy-to-vm` 的 VM 变体不受影响,因为其错误报告函数版本不使用 `system()`: core-agent-linux/qubes-rpc/gui-fatal.c: 16 static void produce_message(const char *type, const char *fmt, va_list args) 17 { ... 31 if (progress_type && !strcmp(progress_type, "gui")) 32 { 33 switch (fork()) 34 { 35 case -1: 36 exit(1); // what else 37 case 0: 38 if (geteuid() == 0) { 39 if (setuid(getuid()) != 0) { 40 perror("setuid failed, not calling zenity/kdialog"); 41 exit(1); 42 } 43 } 44 fix_display(); 45 execlp("/usr/bin/zenity", "zenity", "--error", "--text", dialog_msg, NULL); 46 execlp("/usr/bin/kdialog", "kdialog", "--sorry", dialog_msg, NULL); 47 exit(1); 48 default:; 49 } 50 } 51 free(dialog_msg); 52 } 53 54 void gui_fatal(const char *fmt, ...) 55 { 56 va_list args; 57 va_start(args, fmt); 58 produce_message("Fatal error", fmt, args); 59 va_end(args); 60 exit(1); 61 } 受影响的系统 ----------------- 所有 Qubes OS 版本均受影响。 修补 --------- 以下软件包包含解决此公告中描述漏洞的安全更新: 对于 Qubes 4.3,在 dom0 中: - qubes-core-dom0-linux,版本 4.3.22 此软件包将在社区进行短期测试后,从安全测试仓库迁移到当前(稳定)仓库。[2] 一旦可用,应通过 Qubes 更新工具或其命令行等效工具安装此软件包。[1] 致谢 -------- 此漏洞由 Tim C. 发现。 参考 ----------- [1] https://doc.qubes-os.org/en/latest/user/how-to-guides/how-to-update.html [2] https://doc.qubes-os.org/en/latest/user/downloading-installing-upgrading/testing.html -- Qubes 安全团队 https://www.qubes-os.org/security/ ``` **来源:**qsb\-118\-2026\.txt (https://github.com/QubesOS/qubes-secpack/blob/f65082c8211a421ed15a59219d6e54e93289fafb/QSBs/qsb-118-2026.txt) ## Marek Marczykowski\-Górecki (https://www.qubes-os.org/team/#marek-marczykowski-g%C3%B3recki) 的 PGP 签名 ``` -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEELRdx/k12ftx2sIn61lWk8hgw4GoFAmqSIHAACgkQ1lWk8hgw 4GoFoQ/+PavdhVipF8/C2uLvBrYcdUmPA8FraC89p4DLzAoh2EUOerSjzPSqyTwJ S50jPNVHYiP6GaHsHoBNuRd8S9IN1GhyHfSRabjgcV/TfhXLXk8LrPVegq2IRMY6 FzkbBdpIUNn0gILeBJXyDhF50weRvrg7SZuwmjYvKUPHb4mA6wHEw01cuj54wVYW iL/byB7ULnvlQWnsvKSYmSM3u+b9gOz2+jinNh2qRNg3pP3MUv1gQMFKH9CN5wE1 BiPn1bIn5v9V5RcG4nB6qgtqSE1JgB5a9KYJ3gNhGKA0N3Mnf+wS3LfWeU+0xmjW PtWjMF+d1ZppT3yEeQj1jyyAemmwkB5zl+c/6FcEX8zvWGO2aYT/xe5yTbW7kVsM js+FiF4opVMRx3t85WfbkN6Pu0F/bNP0OsE2IJ2G7T6v9gfzb4RfuLYdb01p9Mw2 RBZVP+tcQb7gtXdysapkLsIO+ST8AcewocokiPF3st+QeB6v/3pl+aab2NojXoUk UzoJvRRd3e/KtAV1k1EAtajG5O8HFerW9LaULOGs6nPbVDBRLhJp0nlec5ZuRbpX jaJGgXzD/QntiNiWH1iaB7NxeZJPzKGg8O7MPUvQV4Cn02uoE5J5EY8XZrGhNPVl D4HHrQb+dMrwImEAGovHMdqVPJIiTGRFm5umwpKK8NRVWGjpsu8= =fHjz -----END PGP SIGNATURE----- ``` **来源:**qsb\-118\-2026\.txt\.sig\.marmarek (https://github.com/QubesOS/qubes-secpack/blob/f65082c8211a421ed15a59219d6e54e93289fafb/QSBs/qsb-118-2026.txt.sig.marmarek) ## Simon Gaiser \(aka HW42\) (https://www.qubes-os.org/team/#simon-gaiser-aka-hw42) 的 PGP 签名 ``` -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE6hjn8EDEHdrv6aoPSsGN4REuFJAFAmqSRk0ACgkQSsGN4REu FJC8wQ//UOa2EdMZpIDLaYropqMHyt7cVlm3Ad4zpgqmteWOUSS2z6Y3DLA2b0Ng xVDsmgJcoxqMt0tbzU9awSB/v41CKPQlXnevEFucwZWgeoQIhnZwr7c6zo2unngv wc2eMMsIL/7QX2DPotoieshryTUB6kbb1hKwiXojWOJKTwVvQPRZmU6hWLAXtg7G F4Ar/XMm2DR+KstIHFpvP+IWdS41+SWjIgjJJraUl5BE7mDF51M8vR4IvVM9Td8w bb1ENAFO2W/ZnYnqGJpMmzWVhDzxjkikH9TT3CZmdulXa7ggK2V2EgBDJ681XtW+ jOC9f5OJjoVHc5LtPsAMZxL3sGbfOBfogK5Fwpi6lmzjcG3oCB6MMvEkveZRaSiO H8vPl4H1dEIUKSA1LGZWEgY8RjuX0N4pnNOLzbn86tMpqYLtNBqGZ2/r8WkJSfXS fYWyVAtF9kcy8scb4lYlsdfD7gZ8wH7dl/iUKikiS3NyFdAlYvb0OZd6c7BZwD2C +YLHlo03he9WE1GbLoPPzqTN8VnunJ9eyyCs56SsHL5CYLfLnT95kMssAd+uJypo 7QZj3+xz7i2kaqK4osEL+5WUR47DyJEgKP8bMPeCV5ZZFC85eVKAn4BzYULx6tff wVin+t9uZ2kwur7IyG+8Bb1PUgr+vATsVW1QcrfcRT6ujY4VDDs= =1/K/ -----END PGP SIGNATURE----- ``` **来源:**qsb\-118\-2026\.txt\.sig\.simon (https://github.com/QubesOS/qubes-secpack/blob/f65082c8211a421ed15a59219d6e54e93289fafb/QSBs/qsb-118-2026.txt.sig.simon) ## 此公告的目的是什么? 此公告的目的是告知 Qubes 社区,新的 Qubes 安全公告(QSB)已发布。 ## 什么是 Qubes 安全公告(QSB)? Qubes 安全公告(QSB)(https://www.qubes-os.org/security/qsb/) 是由 Qubes 安全团队 (https://doc.qubes-os.org/en/latest/project-security/security.html#qubes-security-team) 发布的安全公告。QSB 通常提供对最近发现的软件漏洞的摘要和影响分析,包括修补这些漏洞的详细信息。 ## 为什么我应该关注 QSB? QSB 告诉你必须采取什么行动来保护自己免受最近发现的安全漏洞的影响。在大多数情况下,安全漏洞通过正常更新 (https://doc.qubes-os.org/en/latest/user/how-to-guides/how-to-update.html) 来解决。然而,在某些情况下,需要特殊的用户操作。在所有情况下,所需的操作都在 QSB 中详细说明。 ## QSB 附带的 PGP 签名是什么? PGP (https://en.wikipedia.org/wiki/Pretty_Good_Privacy) 签名是根据 OpenPGP (https://en.wikipedia.org/wiki/Pretty_Good_Privacy#OpenPGP) 标准进行的加密数字签名 (https://en.wikipedia.org/wiki/Digital_signature)。PGP 签名可以通过 GNU Privacy Guard \(GPG\) (https://gnupg.org/) 等程序进行加密验证。Qubes 安全团队对所有 QSB 进行加密签名,以便 Qubes 用户有可靠的方法检查 QSB 是否真实。确保 QSB 真实性的唯一方法是验证其 PGP 签名。 ## 为什么我应该关心 QSB 是否真实? 伪造的 QSB 可能会欺骗你采取对 Qubes OS 系统安全性产生不利影响的操作,例如安装恶意软件或进行使系统易受攻击的配置更改。伪造的 QSB 可能会对 Qubes OS 或 Qubes OS 项目的安全性散布恐惧、不确定性和怀疑。 ## 如何验证 QSB 上的 PGP 签名? 以下命令行说明假设系统是已安装 `git` 和 `gpg` 的 Linux 系统。(有关 Windows 和 Mac 选项,请参阅 OpenPGP 软件 (https://doc.qubes-os.org/en/latest/project-security/verifying-signatures.html#openpgp-software)。) 1. 获取 Qubes 主签名密钥(QMSK),例如:`` $ gpg --fetch-keys https://keys.qubes-os.org/keys/qubes-master-signing-key.asc gpg: directory '/home/user/.gnupg' created gpg: keybox '/home/user/.gnupg/pubring.kbx' created gpg: requesting key from 'https://keys.qubes-os.org/keys/qubes-master-signing-key.asc' gpg: /home/user/.gnupg/trustdb.gpg: trustdb created gpg: key DDFA1A3E36879494: public key "Qubes Master Signing Key" imported gpg: Total number processed: 1 gpg: imported: 1 `` (有关获取 QMSK 的更多方法,请参阅如何导入和验证 Qubes 主签名密钥 (https://doc.qubes-os.org/en/latest/project-security/verifying-signatures.html#how-to-import-and-authenticate-the-qubes-master-signing-key)。) 2. 查看刚导入的 PGP 密钥的指纹。(注意:`gpg>` 表示 GnuPG 程序内部的提示。在提示时输入其后显示的内容。)`` $ gpg --edit-key 0x427F11FD0FAA4B080123F01CDDFA1A3E36879494 gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. pub rsa4096/DDFA1A3E36879494 created: 2010-04-01 expires: never usage: SC trust: unknown validity: unknown [ unknown] (1). Qubes Master Signing Key gpg> fpr pub rsa4096/DDFA1A3E36879494 2010-04-01 Qubes Master Signing Key Primary key fingerprint: 427F 11FD 0FAA 4B08 0123 F01C DDFA 1A3E 3687 9494 `` 3. **重要提示:** 此时,你仍然不知道刚导入的密钥是真实的 QMSK 还是伪造品。为了让整个流程提供有意义的安全利益,你*必须*通过带外方式验证 QMSK。**不要跳过此步骤!** 标准方法是从*多个独立来源以多种不同方式*获取 QMSK 指纹,并检查它们是否与刚导入的密钥匹配。有关更多信息,请参阅如何导入和验证 Qubes 主签名密钥 (https://doc.qubes-os.org/en/latest/project-security/verifying-signatures.html#how-to-import-and-authenticate-the-qubes-master-signing-key)。**提示:** 在带外验证 QMSK 后,请将 QMSK 指纹记录在安全的地方(或多处),以便将来不必重复此步骤。 4. 一旦确认你拥有了真实的 QMSK,将其信任级别设置为 5(“最终”),然后使用 `q` 退出 GnuPG。`` gpg> trust pub rsa4096/DDFA1A3E36879494 created: 2010-04-01 expires: never usage: SC trust: unknown validity: unknown [ unknown] (1). Qubes Master Signing Key Please decide how far you trust this user to correctly verify other users' keys (by looking at passports, checking fingerprints from different sources, etc.) 1 = I don't know or won't say 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully 5 = I trust ultimately m = back to the main menu Your decision? 5 Do you really want to set this key to ultimate trust? (y/N) y pub rsa4096/DDFA1A3E36879494 created: 2010-04-01 expires: never usage: SC trust: ultimate validity: unknown [ unknown] (1). Qubes Master Signing Key Please note that the shown key validity is not necessarily correct unless you restart the program. gpg> q `` 5. 使用 Git 克隆 qubes-secpack 仓库。`` $ git clone https://github.com/QubesOS/qubes-secpack.git Cloning into 'qubes-secpack'... remote: Enumerating objects: 4065, done. remote: Counting objects: 100% (1474/1474), done. remote: Compressing objects: 100% (742/742), done. remote: Total 4065 (delta 743), reused 1413 (delta 731), pack-reused 2591 Receiving objects: 100% (4065/4065), 1.64 MiB | 2.53 MiB/s, done. Resolving deltas: 100% (1910/1910), done. `` 6. 导入包含的 PGP 密钥。(请参阅我们的 PGP 密钥策略 (https://doc.qubes-os.org/en/latest/project-security/security-pack.html#pgp-key-policies) 以获取有关这些密钥的重要信息。)`` $ gpg --import qubes-secpack/keys/*/* gpg: key 063938BA42CFA724: public key "Marek Marczykowski-Górecki (Qubes OS signing key)" imported gpg: qubes-secpack/keys/core-devs/retired: read error: Is a directory gpg: no valid OpenPGP data found. gpg: key 8C05216CE09C093C: 1 signature not checked due to a missing key gpg: key 8C05216CE09C093C: public key "HW42 (

相似文章

在 KDE Plasma 中突破沙箱的任意代码执行

Lobsters Hottest

KDE Plasma 中存在一个漏洞,允许沙箱化应用(例如 Flatpak)通过“打开新窗口”操作逃逸并在主机上执行任意代码,同时冒充其他应用。已提供概念验证。

Zapscape - KVM/x86 客户机到宿主机逃逸

Lobsters Hottest

Zapscape(CVE-2026-64561)是一个 KVM/x86 影子 MMU 释放后使用漏洞,允许客户机虚拟机逃逸到宿主机并以内核权限执行代码。已发布的 PoC 演示了针对 Linux 7.1.3 上 AMD SVM/NPT 的完整客户机到宿主机逃逸,对多租户公共云构成严重威胁。

I found a KVM guest-to-host heap corruption bug and someone else got there first

Lobsters Hottest

Blog post detailing the discovery of CVE-2026-53360, a heap out-of-bounds read/write in KVM's SEV-SNP Page State Change handler that lets a malicious guest corrupt host kernel memory. The author discusses the bug, his incorrect fix, the better fix from a duplicate reporter, and provides a CTF challenge.

objdump -g 中的任意代码执行

Lobsters Hottest

objdump -g 中存在一个安全漏洞,由于 FR30 重定位处理程序缺少边界检查,通过精心构造的 FR30 目标文件可实现任意代码执行,单个漏洞利用即可绕过 ASLR 及其他缓解措施。

CVE-2026-31431: Copy Fail

Lobsters Hottest

CVE-2026-31431(Copy Fail)是Linux内核中的一个本地提权漏洞,影响自2017年以来的所有主流发行版,允许非特权用户通过AF_ALG加密子系统对任何可读文件的页缓存进行确定性的4字节写入,从而获得root shell访问权限。