Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAttacker controls terminal output stream
-
DeliveryEmit drag-and-drop protocol with duplicate-named symlink+dir entries
-
Exploitmkdirat fails EEXIST and is ignored, path resolution follows symlink
-
ExecutionVictim initiates drag, dirfd escapes staging directory
-
ImpactCreate attacker-named files/dirs anywhere user-writable
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Symlink resolution safety
|
| Exploitation Conditions | Requires kitty version 0.47.0 up to (not including) 0.49.0 with the drag-and-drop protocol in use. The attacker must be able to write to the terminal (control program output, escape sequences, or a file rendered to the screen), and the victim must actively initiate a drag-and-drop operation from the terminal (UI:A) - it is not triggered by output alone. The malicious drag source must declare two identically-named entries (a symlink followed by a directory), and the symlink target must be an existing directory writable by the user running kitty. Key limiting factors: local attack vector (no direct network exploitation of the process), mandatory user drag interaction, and O_CREAT|O_WRONLY|O_EXCL semantics that prevent overwriting any existing file - only brand-new files (mode 0644) and directories (mode 0755) can be created. |
| Impact | This is a genuine but low-to-moderate priority local integrity flaw, not a high-urgency remote threat. The vendor CVSS 4.0 base score is 4.6 (MEDIUM) with vector AV:L/AC:L/PR:N/UI:A/VC:N/VI:N/VA:N/SC:N/SI:L/SA:N - the attack vector is LOCAL and requires active user interaction (UI:A), and impact is limited to a low subsequent-system integrity effect (SI:L) with zero confidentiality or availability impact. No EPSS score, no CISA KEV listing, and no public exploit are present in the input, so there is no signal of active or automated exploitation. The single most important conflicting signal is the 'RCE' tag, which is NOT supported by the data: every impact metric for the vulnerable system is N (VC:N/VI:N/VA:N), and the description explicitly states files are created with O_CREAT|O_WRONLY|O_EXCL so existing files CANNOT be overwritten, only new files/directories created - that materially caps escalation to code execution. Treat the 'RCE' label as unverified/inflated. The realistic risk is an attacker who controls output written to the terminal (e.g., malicious program output, an SSH session, or a crafted file cat'd to the screen) planting attacker-named files/directories in user-writable locations when the victim performs a drag-and-drop, which could seed configuration or autostart-style files but cannot clobber existing ones. |
| Exploit ScenarioDerived | A user runs kitty (0.47.0-0.48.x) and views output from a malicious source - a compromised remote host over SSH, or a booby-trapped file printed to the terminal. That output drives the drag-and-drop protocol to declare two entries with the same name (a symlink to an arbitrary absolute directory, then a directory); when the victim initiates a drag from the terminal, kitty follows the symlink and writes attacker-controlled files/directories outside its staging area. No public exploit code is identified in the input, though the reporter (Secur0) published a technical write-up. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 25, 2026
Symlink traversal in the drag-and-drop remote staging path of kitty 0.47.0 up to (but not including) 0.49.0 lets a program that can write to the terminal create new files (mode 0644) and directories (mode 0755) at arbitrary absolute paths writable by the user running kitty, by declaring two identically named entries - the first a symlink to a chosen absolute path, the second a directory. Exploitation is local and requires the victim to actively initiate a drag-and-drop operation from the terminal (UI:A); the assessed vector is CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N (CVSS 4.0 base 4.6), so impact is limited to integrity of newly created paths, and O_CREAT|O_WRONLY|O_EXCL semantics prevent overwriting any pre-existing file. No public exploit code identified at time of analysis, and the vendor released a fix in 0.49.0 that refuses symlinked directory entries during remote drag staging.
RemediationAI
Upgrade to kitty 0.49.0, which is the vendor-released fix (release tag v0.49.0; patch commits 554908ed0b4d010cf9821c75449c7f7c79a6170a and 3c3133d3399257492347f535d8d191680803b25d) and which now denies drag sources that send identically named symlink/directory entries; users who build from source should ensure both commits are present, and downstream packagers should backport them rather than only bumping the version string. If an immediate upgrade is not possible, the exposure is bounded by the preconditions: only new files and directories can be created (O_CREAT|O_WRONLY|O_EXCL blocks overwriting existing files), so audit and remove unnecessary write permissions that the kitty user holds on sensitive directories such as ~/.config, ~/.ssh, autostart paths, and shell rc-file locations, and run kitty as an unprivileged user whose writable tree is minimized - the trade-off is that this degrades normal usability for any workflow that legitimately drags files out of those locations. Because the attacker must be able to write to the terminal and the victim must actively start a drag from terminal content, avoid initiating drag-and-drop from untrusted output or untrusted files rendered on screen, and avoid running untrusted programs in the same kitty window before dragging - the trade-off being loss of a legitimate feature and reduced convenience for mixed-trust sessions. There is no confirmed configuration switch in the provided data to disable remote drag-and-drop, so patching remains the primary and recommended control; see https://secur0.com/en/cna/cve-list/cve-2026-80430-kitty-dnd-symlink-traversal and the v0.49.0 changelog for details.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
kitty's drag-and-drop protocol stages remote drag-source items under a private temporary staging directory, and subdir_data_for_drag() previously resolved a descendant of the staged item tree by constructing a path string and calling safe_open(path, O_DIRECTORY | O_RDONLY, 0) instead of walking the tree one component at a time. Entry names were sanitised against path separators and dot components, but symlink targets were not validated: a malicious client could register two entries with the same name, the first a symlink whose target is an arbitrary absolute path and the second a directory. The mkdirat() for the directory then fails with EEXIST, which the code ignored, so the subsequent string-based open followed the symlink and returned a directory descriptor outside the staging directory. That descriptor was passed as the dirfd argument to add_payload() and reused for every further create operation on the item and its descendants, producing a classic CWE-59 (Improper Link Resolution Before File Access) path-traversal-by-symlink. The upstream fix replaces path-string construction with open_subdir_of_drag(), which starts from a directory kitty created itself and descends recursively using safe_openat(parent_fd, name, O_DIRECTORY | O_RDONLY | O_NOFOLLOW, 0), adds ELOOP/ENOTDIR errno reporting, and caps nesting at MAX_DRAG_DIR_DEPTH (128) to prevent unbounded recursion on a maliciously deep tree; toplevel_data_for_drag() likewise gains O_NOFOLLOW. Functionally, the new code refuses to traverse symlinks so every write stays within the temporary directory, and the changelog entry confirms drag sources sending identically named symlink/dir entries are now denied with an error.
Know when Kitty gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:N/SI:L/SA:N
Local vector via terminal output, no attacker privileges, but requires the victim to initiate a drag (UI:R); impact is limited new-file/dir creation without overwrite, so I:L and C:N/A:N.
Primary rating from Vendor (Secur0).
CVSS VectorVendor: Secur0
DescriptionCVE.org
Improper Link Resolution Before File Access in the drag source staging path of the drag and drop protocol in kitty from 0.47.0 before 0.49.0 allows a program writing to the terminal to create files and directories at paths outside the staging directory, because subdir_data_for_drag() in kitty/dnd.c resolves a descendant of the staged item tree by constructing a path string and opening it with safe_open(path, O_DIRECTORY | O_RDONLY, 0) rather than by walking the tree one component at a time, so a client that declares two entries with the same name, the first a symlink whose target is an arbitrary absolute path and the second a directory, causes mkdirat() to fail with EEXIST, which the code ignores, and causes the subsequent path resolution to follow the symlink and return a directory descriptor outside the staging directory, which is then passed as the dirfd argument to add_payload() and used for every further create operation on that item and its descendants. Entry names are sanitised against path separators and dot components, but symlink targets are not validated. Files are created with O_CREAT | O_WRONLY | O_EXCL at mode 0644, so existing files cannot be overwritten, and directories are created with mkdirat() at mode 0755, so the attacker can create intermediate directories that did not previously exist. This results in the creation of files and directories at any path writable by the user running kitty, provided the symlink target is an existing directory.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
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
EUVD-2026-87063
GHSA-phg7-mgrc-j9pj
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB