Severity by source
AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:L
Network-delivered drag source with no kitty-side auth (PR:N); AC:H due to required case-collision race and case-sensitive FS; UI:R for the drag gesture; scope change with I:H/A:L file overwrite, no confidentiality loss.
Primary rating from Vendor (GitHub_M).
CVSS VectorNVD
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:L
Lifecycle Timeline
3DescriptionNVD
Kitty is a cross-platform GPU based terminal. In versions 0.47.0 and 0.47.1, kitten dnd can allow a malicious remote drag-and-drop source to overwrite or truncate arbitrary files writable by the local kitty user. Remote text/uri-list drops are staged in a temporary directory, but on case-sensitive filesystems duplicate remote basenames are not de-duplicated. An attacker can first create a staged symlink and then send a same-name regular-file entry. The regular-file write uses utils.CreateAt() / openat(O_RDWR|O_CREAT|O_TRUNC) without O_NOFOLLOW, so it follows the attacker-created symlink and writes outside the staging directory before final overwrite confirmation runs. This appears related in class to the file-transfer symlink advisory, but it is a different bug: it affects kitten dnd remote drag-and-drop staging, uses different vulnerable code (kittens/dnd/drop.go and tools/utils/file_at_fd.go), and reproduces on commit 4aa4a5c0567a92553a8c20a88a4352da637fca5d, after the file-transfer O_NOFOLLOW fix. Version 0.47.2 patches the issue.
AnalysisAI
Arbitrary file write in Kitty terminal versions 0.47.0 and 0.47.1 allows a remote drag-and-drop source to overwrite files writable by the local kitty user via a TOCTOU symlink race in kitten dnd staging. The flaw stems from openat() calls lacking O_NOFOLLOW when handling duplicate remote basenames on case-sensitive filesystems, letting an attacker-staged symlink redirect writes outside the staging directory. No public exploit identified at time of analysis, and EPSS is very low (0.03%), though user interaction via drag-and-drop is the gating factor.
Technical ContextAI
Kitty is a GPU-accelerated cross-platform terminal emulator (CPE cpe:2.3:a:kovidgoyal:kitty) whose 'kitten dnd' helper stages remote drag-and-drop payloads (text/uri-list MIME) in a temporary directory before final placement. The root cause is CWE-59 (Link Following): the vulnerable code in kittens/dnd/drop.go and tools/utils/file_at_fd.go calls utils.CreateAt() / openat(O_RDWR|O_CREAT|O_TRUNC) without the O_NOFOLLOW flag, so when two remote entries share a basename on case-sensitive filesystems they are not de-duplicated and the second write follows whatever symlink the first entry planted. Notably this is distinct from the earlier file-transfer symlink advisory - it reproduces on commit 4aa4a5c0567a92553a8c20a88a4352da637fca5d, after that prior O_NOFOLLOW fix was applied, indicating an incomplete remediation pattern across staging code paths.
RemediationAI
Vendor-released patch: upgrade to Kitty 0.47.2, which adds the missing O_NOFOLLOW semantics to the dnd staging open path; see https://github.com/kovidgoyal/kitty/security/advisories/GHSA-r892-cv7q-fw8x for the fix commit and details. Until upgrade is possible, disable or avoid using 'kitten dnd' for remote drag-and-drop sources (do not drag content from untrusted remote desktops, browsers backed by untrusted origins, or RDP/VNC sessions into kitty windows), with the side effect of losing remote drag-and-drop convenience. As a defense-in-depth measure, run kitty under a user account whose writable file set excludes sensitive shell startup files and SSH config (e.g., by relocating dotfiles or tightening permissions), accepting the side effect of breaking workflows that legitimately rewrite those files.
The SSH transport protocol with certain OpenSSH extensions, found in OpenSSH before 9.6 and other products, allows remot
Stack-based buffer overflow in the SCP command-line utility in PuTTY before 0.67 and KiTTY 0.66.6.3 and earlier allows r
The Graphics Protocol feature in graphics.c in kitty before 0.19.3 allows remote attackers to execute arbitrary code bec
KiTTY versions 0.76.1.13 and before is vulnerable to command injection via the filename variable, occurs due to insuffic
KiTTY versions 0.76.1.13 and before is vulnerable to a stack-based buffer overflow via the username, occurs due to insuf
KiTTY versions 0.76.1.13 and before is vulnerable to a stack-based buffer overflow via the hostname, occurs due to insuf
In Kitty before 0.26.2, insufficient validation in the desktop notification escape sequence can lead to arbitrary code e
Heap memory corruption in Kitty cross-platform GPU terminal emulator (versions 0.46.2 and below) allows remote attackers
Heap buffer overflow in Kitty terminal versions 0.46.2 and below allows any process able to write to the terminal's stan
open_actions.py in kitty before 0.41.0 does not ask for user confirmation before running a local executable file that ma
Remote code execution in Kitty terminal emulator versions prior to 0.47.0 allows any process or remote peer that can wri
Command injection in Kitty cross-platform GPU terminal emulator versions prior to 0.47.0 allows remote attackers to exec
Same weakness CWE-59 – Improper Link Resolution Before File Access
View allVendor StatusVendor
SUSE
Severity: ImportantShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-36578