Vulnerabilidad de ejecución arbitraria de código que rompe el sandbox en KDE Plasma
(blog.kimiblock.top)- Un PoC confirmó que, debido al comportamiento de gestión de ventanas de KDE Plasma, una app en sandbox puede ejecutar un binario arbitrario del host a partir de una acción de clic del usuario
- La causa principal es que KWin confía en el app_id proporcionado por la app y dejó una ruta de ejecución basada en
/proc/PID/cmdlinesin verificar la coincidencia real con el archivo.desktop - El PoC reproduce un flujo donde
/usr/bin/kcalcse ejecuta fuera del sandbox combinando un host Arch Linux, una app Flatpak y uneglgears_waylandmodificado de Mesa - Si el usuario elige Open New Window en el ícono de la barra de tareas o hace clic central, el proceso objetivo se inicia expuesto dentro del cgroup
app.slicey en el espacio de nombres de montaje del host - Para mitigar el problema, se debe verificar el ID de la app a partir del contexto de seguridad del sandbox,
XdpAppInfoy los control groups, y bloquear la apertura de nuevas ventanas cuando no coincidan con un archivo.desktop
Flujo de escape del sandbox mostrado por el PoC
- Una app maliciosa en sandbox puede hacerse pasar por otra app y ejecutar un binario arbitrario en el host en el momento en que el usuario invoque Open New Window
- Aunque el PoC se reprodujo con Flatpak, se concluye que también podría aplicarse a otros sandboxes independientemente de si admiten contexto de seguridad
- La configuración del experimento fue la siguiente
- Host Arch Linux
- Dependencias de compilación
wget,unzip,meson - App Flatpak sin permisos
io.github.johannesboehler2.BmiCalculator - Como no es fácil compilar dentro del sandbox, solo se pasó a Flatpak la ruta del binario malicioso
- Binario objetivo designado
/usr/bin/kcalc
- Al ejecutar el binario malicioso, en la barra de tareas aparece el ícono de KCalc
- Cuando el usuario hace clic derecho y selecciona Open New Window,
/usr/bin/kcalcse inicia fuera del sandbox- La ubicación de ejecución es el cgroup
app.slice - El espacio de nombres de montaje es el del host
- Como resultado, se ejecuta completamente expuesto
- La ubicación de ejecución es el cgroup
Proceso de descubrimiento y pistas
- Mientras se probaban sandboxes portables en KDE Plasma con una máquina virtual QEMU, algunas ventanas no quedaban asociadas con su archivo
.desktopcorrespondiente y aparecían en la barra de tareas con un ícono genérico de Wayland - Este fenómeno fue reportado como KWin trusts on Apps fully for app_id, y deriva en un problema donde una app puede hacerse pasar por otra
- Después, al hacer clic central por error en la barra de tareas, se invocó Open New Window como comportamiento predeterminado
- La nueva ventana sí se ejecutó, pero no usó las credenciales de inicio de sesión guardadas ni la configuración modificada, y al revisar juntos el PID en la KWin Debug Console y la información de control groups y rootfs en procfs quedó en evidencia el escape del sandbox
Cómo funciona la vulnerabilidad
- Incluso si KWin no logra vincular una ventana con su archivo
.desktopreal, sigue existiendo una ruta para encontrar elargv0a ejecutar - Los experimentos confirmaron que era correcta la hipótesis de que el valor se lee a través de
/proc/PID/cmdline - El problema no se limita a ejecutar fuera del sandbox una instancia existente de la aplicación
- Todos los procesos, incluidos los procesos sin privilegios, pueden cambiar
argv0- El espacio de nombres de montaje también podría usarse, pero se considera menos flexible
- La combinación entre la falta de protección del app_id provisto por la app y la lectura insegura de
/proc/PID/cmdlinehace posible la ejecución arbitraria de código en el host
Demo y escenarios de ataque reales
- El código de demostración fue escrito por GalaxySnail y utiliza
eglgears-waylandde Mesa - El flujo de la demo es el siguiente
- Clonar el repositorio
mesa-demos-argv0 - Modificar el comando indicado dentro de la función
maindesrc/egl/opengl/eglgears.cpor el comando deseado - Compilar con
meson setup build && meson compile -C build - Ejecutar
./build/src/egl/opengl/eglgears_wayland - Hacer clic central en el ícono de la barra de tareas o elegir Open New Window en el menú contextual
- Se inicia el binario malicioso especificado
- Clonar el repositorio
- En un ataque real, sería posible crear un script de shell bajo
$HOME$HOMEnormalmente también existe en la misma ruta en el host- La app maliciosa puede reemplazar
argv0de forma silenciosa por un binario creado o descargado - Si el usuario hace clic en Open New Window o pulsa por accidente el clic central sobre el ícono de la app, se puede tomar control completo de la sesión
Dirección propuesta para la corrección
- Para bloquear este exploit, KDE Plasma no debe confiar sin más en el ID proporcionado por la app
- Se propone obtener el ID de la app desde las siguientes rutas
- El security context del sandbox
XdpAppInfo- Los control groups
- Si una ventana determinada no coincide con un archivo
.desktop, no se debe permitir Open New Window - No se ha recibido una actualización por parte del correo de seguridad de KDE
Cronología de la divulgación
- En el correo original se etiquetó incorrectamente arbitrary code execution como RCE
- Todos los eventos están en UTC+8 y en formato de 24 horas
- 1 de abril de 2026, 23:51: se envió el primer correo a
security@kde.org - 2 de abril de 2026, 00:15: David Edmundson respondió confirmando la recepción del reporte
- 2 de abril de 2026, 00:24: David Edmundson respondió que creía que esa función usaba
Exec=del archivo.desktopy que no podría utilizarse para ejecución arbitraria de código - 2 de abril de 2026, 11:59: con ayuda de GalaxySnail se confirmó que funcionaba otro PoC que no dependía del archivo
.desktop - 2 de abril de 2026, 18:26: se envió un correo de seguimiento a
security@kde.orgcon el archivo del exploit y la explicación, pero no se recibió respuesta - 2 de mayo de 2026, 11:59: se confirmó que el exploit no había sido corregido en Plasma 6.7 Beta
- 2 de julio de 2026, 18:30: al superar el período de espera de 90 días con el exploit todavía activo, se procedió a la divulgación pública
- Como no hubo parche, no llegó respuesta al seguimiento y ya había pasado el período habitual de espera de 90 días, se decidió publicar para generar conciencia
- Se aclara que no se busca criticar a los desarrolladores de KDE; aunque los proyectos OSS han sufrido recientemente por el spam y también existen límites humanos de capacidad de respuesta, el proceso puede mejorar
1 comentarios
Opiniones en Lobste.rs
Es un modelo mucho mejor para el sandboxing de apps de escritorio que el montón de enfoques improvisados que hoy se han ido apilando en Linux para intentar hacer lo mismo. El lanzador entrega un conjunto inicial de capacidades basado en metadatos, es decir, descriptores de archivo, y la app no puede acceder a nada fuera de eso, mientras que un powerbox concede permisos adicionales para abrir o guardar otros archivos
Suele encajar en entornos donde algún proceso divino orquesta servicios, como en los servicios de Kubernetes, pero no queda bien en el escritorio. Uno quiere entrar desde espacio de usuario a un cgroup/namespace con menos privilegios, pero hay que pasar por rituales como un daemon root o
setuid, y eso al final introduce riesgo de escalada de privilegiosSCM_RIGHTS+ Wayland + D-Bus como piezas baseSi entrecierras los ojos, sí se alcanza a ver la silueta de un escritorio seguro
Pero las implementaciones reales en general son demasiado permisivas, o demasiado rígidas, o están medio rotas. No parece haber nadie tan preocupado por la seguridad de escritorio de extremo a extremo como sí lo están por asegurar cargas de trabajo de servidor. Por eso gVisor y Firecracker funcionan bien, pero en Flatpak cuesta hasta ejecutar una app básica de Gtk+ sin romper las fuentes, y todos los compositores de Wayland tienen que volver a implementar la mitad de la base de un escritorio confiable
Da más pena todavía si se piensa que Android ha logrado bastante bien ser una distribución de Linux lo bastante reforzada como para ejecutar código no confiable, y que iOS y macOS han mostrado que el sandboxing de apps orientadas al usuario también puede ser suficientemente cómodo de usar. Simplemente hagan lo que ellos hacen. ¿Por qué demonios algo dentro del gestor de ventanas está leyendo
/proc/{pid}/cmdline?Esto no es en absoluto una crítica al investigador
Seguramente habría sido mucho más fácil de entender si uno estuviera más familiarizado con la estructura interna de KDE o Flatpak