Escritura fuera de límites en el protocolo de tamaño de texto de kitty permite la finalización del proceso de la terminal
Descripción
Escritura fuera de límites (CWE-787) en screen_handle_multicell_command() (kitty/screen.c), en la rama de anchura natural del protocolo de dimensionado de texto, en kitty desde 0.40.0 y anterior a 0.49.0, que permite a un programa que escribe en el terminal escribir más allá del final de un búfer de tamaño fijo, porque la función añade cada punto de código de un clúster de grafemas mediante lc.chars[lc.count++] = ch sin comprobación alguna de capacidad, mientras que lc se declara mediante la macro RAII_ListOfChars (kitty/text-cache.h) como un array char_type de cuatro elementos situado en el marco de pila de la función, de modo que una secuencia de escape OSC 66 cuya carga contenga un clúster de grafemas de más de cuatro puntos de código escribe más allá de ese búfer, un valor de 32 bits por cada punto de código adicional, en el orden en que aparecen. Esto da lugar a la terminación del proceso de kitty y, por tanto, de todas sus ventanas, pestañas y procesos hijo.
La condición que protege la adición cambió durante el rango afectado sin que ello alterase el defecto. Desde 0.40.0 hasta 0.41.1 la adición se toma cuando el punto de código es un carácter combinante y el clúster no está vacío. A partir de 0.42.0 se toma cuando grapheme_segmentation_step() indica que el punto de código continúa la celda actual, o cuando el punto de código tiene anchura cero y el clúster no está vacío. En ambas formas, cualquier secuencia de puntos de código combinantes o de anchura cero que siga a un carácter base alcanza una adición que no realiza comprobación de límites. Los valores escritos son valores escalares Unicode decodificados de la carga. Dos filtros acotan ese rango antes de la adición: decode_utf8_safe_string() descarta los puntos de código C0 y C1, y el bucle omite los puntos de código que char_props_for() marca como inválidos. Las escrituras son estrictamente secuenciales desde el final del búfer hacia arriba.
Cuando la misma carga contiene una secuencia anterior que provoca un vaciado intermedio a través de handle_variable_width_multicell_command(), esa función invoca ensure_space_for_chars(), que traslada el búfer de la pila a una reserva en el montículo. Las adiciones posteriores a ese vaciado desbordan la reserva del montículo en lugar del marco de pila.
kitty es un terminal de proceso único, por lo que el efecto de la terminación del proceso no queda circunscrito a la ventana que recibió la secuencia de escape.
Tipo de vulnerabilidad (CWE)
- CWE-787: Escritura fuera de límites
Versiones afectadas
kitty desde 0.40.0 y anterior a 0.49.0. screen_handle_multicell_command() se introdujo en el commit 540e030f y se publicó por primera vez en v0.40.0; v0.39.1 y anteriores no contienen la función. La adición sin comprobación está presente desde esa primera versión, en la rama de caracteres combinantes hasta v0.41.1 y en la condición refactorizada a partir de v0.42.0. Están afectadas todas las versiones desde v0.40.0 hasta v0.48.2, ambas incluidas. Estado por defecto: no afectado.
Puntuación (CVSS 4.0)
Media (6.8)
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
La puntuación refleja el impacto establecido en el momento de la publicación. Este aviso no afirma nada, en ningún sentido, sobre la posibilidad de desarrollar la escritura fuera de límites hasta el secuestro del flujo de control o la ejecución de código.
Se ha remitido a Secur0 una prueba de concepto que reporta ejecución de código a partir de esta escritura fuera de límites, y está en revisión. Este aviso y el registro CVE correspondiente se actualizarán si dicha revisión modifica la valoración.
Solución
Actualizar a kitty 0.49.0 o posterior.
Parche
Commit 7d2fbaad, que inserta ensure_space_for_chars(&lc, lc.count + 1) antes de la adición, ampliando el búfer según sea necesario. La llamada cubre tanto el caso de la pila como el del montículo, ya que ambos pasan por la misma sentencia de adición.
Créditos
- C4sh3R - 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-80431
Avisos relacionados
- CVE-2026-80430 - Severidad media
- CVE-2026-80432 - Severidad media