Saltar al contenido
cve-2026-95835 ·
Media · 25 de septiembre de 2026

Comprobación de propiedad faltante en el objeto de memoria compartida nombrado por el código de escape askpass de kitty

S0
Secur0 CNA
cve-2026-95835

Descripción

Falta de autorización (CWE-862) en handle_remote_askpass() (kitty/window.py), en el manejador del código de escape de askpass, en kitty desde 0.25.0 y anterior a 0.49.0, que permite a un usuario local distinto del que ejecuta el terminal obtener el texto tecleado en un aviso que muestra el propio kitty, porque el manejador abre el objeto de memoria compartida POSIX cuyo nombre figura en el código de escape, extrae de él una definición de aviso y escribe de vuelta la respuesta del usuario en un objeto con ese mismo nombre, sin comprobar en ningún momento que el objeto pertenezca al usuario que ejecuta kitty ni que sus permisos excluyan a otros usuarios.

El consumidor equivalente de esa misma clase SharedMemory en el kitten de ssh realiza exactamente esa comprobación; la ruta de askpass no la hacía.

Al manejador se llega mediante una cadena de control de dispositivo, procesada desde el flujo de bytes de la ventana y sin control de autenticación alguno. Un segundo usuario local no puede escribir en el pseudoterminal de la víctima, que pertenece a ésta y no es escribible por otros, de modo que el ataque tiene un paso de entrega: el atacante debe conseguir que el terminal de la víctima muestre bytes de su elección. Un fichero que el atacante pueda escribir y la víctima lea, un registro compartido que la víctima siga, o un nombre de fichero manipulado mostrado en un listado de directorio sirven para ello.

Cuando el espacio de nombres de memoria compartida POSIX es común a ambos usuarios, el atacante crea un objeto con permisos que permiten a la víctima leerlo y escribirlo, hace que el kitty de la víctima dibuje un aviso elegido por él, incluido un aviso de contraseña enmascarada, y lee después el secreto tecleado desde ese mismo objeto. En un sistema Linux habitual /dev/shm, que respalda la memoria compartida POSIX, es un único tmpfs escribible por todos y compartido por todos los usuarios de la máquina.

Además, el texto del aviso se entrega a la pantalla sin sanear caracteres de control, por lo que puede sobrescribir la línea de advertencia que kitty imprime encima. La respuesta se escribe reabriendo un objeto con ese nombre en el momento en que el usuario responde, y no a través del descriptor que ya se tenía, por lo que el objeto en el que se escribe no tiene que ser el que se leyó.

El aviso lo dibuja kitty en su propia ventana, con el mismo aspecto que una petición de contraseña legítima de un programa lanzado por el usuario, de modo que la víctima no tiene ninguna señal visual de que el texto que teclea va a parar a otra cuenta.

Tipo de vulnerabilidad (CWE)

  • CWE-862: Falta de autorización

Versiones afectadas

kitty desde 0.25.0 y anterior a 0.49.0. El manejador del código de escape de askpass y su uso del objeto de memoria compartida están presentes por primera vez en v0.25.0; las versiones anteriores no contienen el código afectado. Están afectadas todas las versiones desde v0.25.0 hasta v0.48.2, ambas incluidas. Estado por defecto: no afectado.

Sólo los sistemas en los que ambos usuarios comparten un espacio de nombres de memoria compartida POSIX están expuestos al caso entre usuarios. Una sesión confinada en su propio espacio de nombres de montaje con su propio /dev/shm, como en un contenedor, no lo está. Conviene señalar que PrivateTmp= de systemd no proporciona esto: aísla /tmp y /var/tmp, no /dev/shm.

Puntuación (CVSS 4.0)

Media (5.6)

CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:A/VC:H/VI:L/VA:N/SC:H/SI:N/SA:N

Los privilegios requeridos son Bajos porque el atacante necesita una cuenta local ordinaria en la misma máquina, sin privilegio alguno sobre la cuenta de la víctima. Los requisitos de ataque son Presentes porque el ataque depende de condiciones ajenas al control del atacante: ambos usuarios deben compartir un espacio de nombres de memoria compartida, y el atacante debe lograr que el terminal de la víctima muestre bytes suyos. La integridad del sistema vulnerable es Baja porque el atacante controla el texto que kitty dibuja como aviso propio, incluidos caracteres de control que sobrescriben la línea de advertencia situada encima. La interacción del usuario es Activa porque la víctima tiene que teclear una respuesta en el aviso. El requisito de que se muestren los bytes del atacante se contabiliza en los requisitos de ataque y no en la interacción del usuario, porque esa métrica ya recoge el hecho de teclear; en CVE-2026-95832, donde el atacante es lo que escribe en el terminal y lo único que hace la víctima es mostrar el texto, esa misma visualización constituye la interacción del usuario y se puntúa como Pasiva. La pérdida de confidencialidad recae tanto sobre el terminal como sobre el sistema subsiguiente: el secreto tecleado es del usuario, no de kitty, y habitualmente da acceso a algo que está más allá del terminal.

Solución

Actualizar a kitty 0.49.0 o posterior.

Parche

Commit 32819190, que añade SharedMemory.verify_owner_and_mode() y lo invoca antes de que el manejador de askpass extraiga del objeto una definición de aviso, igualando la comprobación que ya realizaba el kitten de ssh y trasladando esa comprobación en línea al método compartido. La comprobación exige que el modo sea exactamente 0600, por lo que también se rechaza un objeto en 0400 o 0660. El commit además desvincula el nombre en cuanto se abre el objeto, de modo que nadie más pueda abrirlo mientras kitty lo utiliza, y conserva ese único descriptor para la respuesta en lugar de reabrir el objeto por su nombre cuando el usuario responde, lo que cierra la ventana entre la lectura y la escritura. También pasa el texto del aviso, la lista de opciones y la cadena del indicador por sanitize_control_codes(), que elimina ESC y con ello impide el movimiento de cursor que sobrescribía la línea de advertencia, conservando en cambio los saltos de línea. Los fallos de apertura o de análisis se registran ahora y la solicitud se descarta.

Créditos

  • Gabriel Machado Tavares - descubridor
  • Cristian Fernández Cornejo - analista
  • Xoán M. Otero Jorge - analista
  • Secur0 CNA - coordinador
  • Kovid Goyal - desarrollador de la corrección Origen del descubrimiento: Externo

Registro oficial: CVE-2026-95835

Avisos relacionados

  • CVE-2026-95832 - Severidad crítica
  • CVE-2026-95834 - Severidad media