CVE-2026-95834: Use after free в протоколе drag and drop терминала kitty
В терминале kitty версий с 0.47.0 до 0.49.0 обнаружена уязвимость use after free в пути источника перетаскивания протокола drag and drop. Любая программа, выводящая данные в терминал, может вызвать обращение к освобождённой памяти, что приводит к неопределённому поведению процесса терминала. Критичность — средняя (CVSS 4.6).
Подробности
Уязвимость CVE-2026-95834 имеет оценку CVSS 4.6 (MEDIUM) и относится к пути источника перетаскивания (drag source path) протокола drag and drop. Проблема сосредоточена в функции drag_remote_file_data() в файле kitty/dnd.c. Функция сохраняет указатель DragRemoteItem на элемент массива, которым она не владеет, затем вызывает toplevel_data_for_drag() или subdir_data_for_drag() и продолжает использовать этот указатель. Указанные вспомогательные функции, а также вызываемые ими add_payload() и populate_dir_entries(), сообщают об ошибках через макрос abrt(), который раскрывается в вызов cancel_drag() с последующим обычным return. В свою очередь cancel_drag() вызывает drag_free_offer(), освобождающую массив, на который ссылается указатель. Поскольку вспомогательные функции возвращают void, вызывающая сторона не получает сигнала о том, что произошёл демонтаж (teardown), и продолжает работу: вызывает all_children_complete() по освобождённому указателю, разыменовывает его, а затем выполняет запись через него. Это разыменование защищено локальным флагом, который устанавливается, когда запрос не несёт полезной нагрузки и не объявляет о дальнейших данных — то же условие выбирает финализирующий блок add_payload(), поэтому ошибочные пути в этом блоке до него доходят: создание, завершившееся неудачей из-за уже существующей записи с тем же именем (клиент может объявить две записи с одним именем, а операции создания используют O_CREAT с O_EXCL и symlinkat()), ошибка mkdirat() кроме EEXIST, а также пути выделения записи каталога. Обе ветви доходят до этого места. В ветви верхнего уровня указатель вызывающей стороны никогда не обнуляется, поэтому очистка собственных указателей структуры-владельца во время демонтажа не помогает. В ветви подкаталога subdir_data_for_drag() устанавливает указатель вызывающей стороны в NULL при входе и присваивает его только после собственного последнего ошибочного пути, поэтому его собственные прерывания оставляют у вызывающей стороны NULL и блокируются проверкой на NULL. Однако затем он вызывает add_payload() с уже установленным указателем, и прерывание там оставляет вызывающую сторону с освобождённым дочерним узлом внутри дерева элементов, который drag_free_offer() освобождает рекурсивно. Результат — неопределённое поведение в процессе терминала.Что делать
Рекомендуется обновить kitty до версии 0.49.0 или более поздней, где уязвимость устранена. Если обновление невозможно, следует ограничить запуск недоверенных программ в окне kitty и избегать сценариев, провоцирующих прерывание передачи drag and drop. Поскольку активация возможна из потока байтов любой программы в окне, компенсирующие митигации на уровне конфигурации терминала ограничены — приоритетным является установка исправленной версии. Итог: CVE-2026-95834 — локально достижимая уязвимость use after free в kitty, способная привести к неопределённому поведению процесса терминала. Критичность средняя, но простота достижимости из обычного вывода программы делает обновление до версии 0.49.0 обязательным.Источник: CVE Project (cvelistV5)
