Skip to main content

kitty EUVDEUVD-2026-87063

| CVE-2026-80430 MEDIUM
Improper Link Resolution Before File Access (CWE-59)
2026-09-25 Secur0 GHSA-phg7-mgrc-j9pj
4.6
CVSS 4.0 · Vendor: Secur0
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Attacker controls terminal output stream
  2. Delivery
    Emit drag-and-drop protocol with duplicate-named symlink+dir entries
  3. Exploit
    mkdirat fails EEXIST and is ignored, path resolution follows symlink
  4. Execution
    Victim initiates drag, dirfd escapes staging directory
  5. Impact
    Create 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

kitty 0.47.0 <0.49.0

Affected Packages

euvd kitty fix: 0.49.0

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

Vendor (Secur0) PRIMARY 4.6 MEDIUM
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
vuln.today AI 3.3 LOW

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.

3.1 AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N
4.0 AV:L/AC:L/AT:N/PR:N/UI:A/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (Secur0).

CVSS VectorVendor: Secur0

Attack Vector
Local
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
Active
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
Low
Subsequent system: Availability
None

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

EPSS Score
0.2%
Top 96% exploitable
Prevalence
Medium
popular GPU terminal emulator among developers, but niche versus ubiquitous shells
Data Quality
6 sources
Confidence: High

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Defer
Exploitation
None
System Exposure· derived
Small
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

23
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +23
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.

More in Kitty

View all
CVE-2023-48795 MEDIUM POC
5.9 Dec 18

The SSH transport protocol with certain OpenSSH extensions, found in OpenSSH before 9.6 and other products, allows remot

CVE-2016-2563 CRITICAL POC
9.8 Apr 07

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

CVE-2020-35605 CRITICAL POC
9.8 Dec 21

The Graphics Protocol feature in graphics.c in kitty before 0.19.3 allows remote attackers to execute arbitrary code bec

CVE-2024-23749 HIGH POC
7.8 Feb 09

KiTTY versions 0.76.1.13 and before is vulnerable to command injection via the filename variable, occurs due to insuffic

CVE-2024-25004 HIGH POC
7.8 Feb 09

KiTTY versions 0.76.1.13 and before is vulnerable to a stack-based buffer overflow via the username, occurs due to insuf

CVE-2024-25003 HIGH POC
7.8 Feb 09

KiTTY versions 0.76.1.13 and before is vulnerable to a stack-based buffer overflow via the hostname, occurs due to insuf

CVE-2022-41322 HIGH POC
7.8 Sep 23

In Kitty before 0.26.2, insufficient validation in the desktop notification escape sequence can lead to arbitrary code e

CVE-2026-33642 CRITICAL
9.8 May 19

Heap memory corruption in Kitty cross-platform GPU terminal emulator (versions 0.46.2 and below) allows remote attackers

CVE-2026-33633 HIGH
8.8 May 19

Heap buffer overflow in Kitty terminal versions 0.46.2 and below allows any process able to write to the terminal's stan

CVE-2025-43929 MEDIUM POC
4.1 Apr 20

open_actions.py in kitty before 0.41.0 does not ask for user confirmation before running a local executable file that ma

CVE-2026-42851 HIGH
7.8 Jun 12

Remote code execution in Kitty terminal emulator versions prior to 0.47.0 allows any process or remote peer that can wri

CVE-2026-42850 HIGH
7.4 Jun 12

Command injection in Kitty cross-platform GPU terminal emulator versions prior to 0.47.0 allows remote attackers to exec

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy