CVE-2026-95834: Use-After-Free in Kitty Terminal Emulator
Executive Summary
CVE-2026-95834 is a use-after-free vulnerability affecting Kitty terminal emulator versions 0.47.0 through 0.48.x. The flaw exists in the drag-and-drop protocol handler and can be exploited to achieve arbitrary code execution within the terminal process. Users of affected versions should upgrade to Kitty 0.49.0 or later immediately. This vulnerability poses a significant risk in environments where untrusted applications interact with the terminal or where users may drag files from potentially malicious sources.
Immediate Action Required: Upgrade to Kitty 0.49.0 or later to eliminate this risk.
Vulnerability Overview
What is CVE-2026-95834?
CVE-2026-95834 is a use-after-free memory vulnerability discovered in the Kitty terminal emulator’s drag-and-drop functionality. The vulnerability stems from improper pointer management in the drag_remote_file_data() function, which maintains a reference to memory that can be freed without proper notification to the caller. This allows subsequent operations to dereference freed memory, leading to undefined behavior and potential arbitrary code execution.
The vulnerability is particularly concerning because drag-and-drop operations are common user interactions, making exploitation relatively straightforward for an attacker who can control the source of dragged content.
Affected Versions and Products
Product: Kitty Terminal Emulator
Vulnerable Versions:
- 0.47.0 through 0.48.x (inclusive)
Fixed Version:
- 0.49.0 and later
Kitty is a GPU-based terminal emulator written in C and Python, popular among developers and power users for its performance and feature set. The vulnerability affects all installations of the affected versions across Linux, macOS, and other supported platforms.
Severity and CVSS Impact
| Metric | Rating |
|---|---|
| Severity | High |
| Attack Vector | Local/Network |
| Attack Complexity | Low |
| Privileges Required | None |
| User Interaction | Required |
| Impact | Arbitrary Code Execution |
The vulnerability allows an attacker to execute arbitrary code with the privileges of the user running Kitty. While user interaction is required (initiating a drag-and-drop operation), the low complexity of exploitation and high impact make this a critical security issue.
Technical Breakdown
The Use-After-Free Flaw Explained
A use-after-free vulnerability occurs when a program continues to reference memory after it has been deallocated. In the context of CVE-2026-95834, the vulnerability manifests in the following sequence:
- A pointer to a
DragRemoteItemstructure is created and stored - The pointer references data within an array managed by another component
- An error condition is triggered during drag-and-drop processing
- The error handler frees the array without notifying the original caller
- The caller continues to use the now-invalid pointer
- Subsequent memory operations read from or write to freed memory
This pattern allows attackers to:
- Read sensitive data from freed memory regions
- Write arbitrary data to freed memory regions
- Achieve code execution by corrupting function pointers or other critical data structures
How the dragremotefile_data() Function Fails
The drag_remote_file_data() function is responsible for handling remote file data during drag-and-drop operations. The function’s vulnerability lies in its pointer management:
Function Flow:
├── Obtain pointer to DragRemoteItem in array
├── Call helper functions (toplevel_data_for_drag, subdir_data_for_drag)
│ └── These may trigger error conditions
├── Error handler invokes cancel_drag()
│ └── Which calls drag_free_offer()
│ └── Frees the array containing DragRemoteItem
└── Caller continues using now-invalid pointer
The critical issue is that the error handling path (abrt() macro) does not properly signal to the caller that the underlying data has been freed. The function continues execution with a dangling pointer, leading to undefined behavior.
Memory Management Error Chain
The vulnerability follows this error chain:
- Initial State: Array of
DragRemoteItemstructures exists in memory - Pointer Creation: Function obtains pointer to specific item in array
- Helper Function Call:
toplevel_data_for_drag()orsubdir_data_for_drag()is invoked - Error Trigger: Helper function encounters error condition
- Error Macro:
abrt()macro is executed - Memory Deallocation:
cancel_drag()→drag_free_offer()frees the entire array - Use-After-Free: Original function continues with invalid pointer reference
- Exploitation: Attacker manipulates freed memory to achieve code execution
Why Error Handling Fails
The root cause of this vulnerability is a design flaw in the error handling mechanism:
- No Return Value: The error handler does not return control to the caller in a way that prevents further pointer use
- Implicit State Change: Memory deallocation occurs implicitly within error handling, not explicitly communicated
- Lack of Validation: No checks exist to verify pointer validity after error conditions
- Missing Null Assignment: The pointer is not set to NULL after the underlying data is freed
This represents a common pattern in C code where error handling and resource management are decoupled, creating opportunities for use-after-free conditions.
Real-World Attack Scenarios
Malicious File Transfer Exploitation
Scenario: An attacker crafts a malicious drag-and-drop operation to trigger the use-after-free vulnerability.
Attack Steps:
- Attacker creates a specially crafted file or application that initiates drag-and-drop operations
- User drags the file into a Kitty terminal window
- The drag-and-drop handler processes the operation, triggering the error condition
- The use-after-free condition is exploited to corrupt memory
- Attacker’s payload overwrites function pointers or other critical data
- Arbitrary code execution occurs within the Kitty process context
Real-World Context: This could occur when:
- A user downloads a malicious file and drags it into Kitty
- A compromised application initiates drag-and-drop operations
- An attacker controls a file manager or desktop environment component
Denial of Service Through Repeated Triggers
Scenario: An attacker repeatedly triggers the vulnerability to destabilize the terminal.
Attack Steps:
- Attacker identifies the specific drag-and-drop sequence that triggers the error condition
- Attacker creates an automated process that repeatedly initiates this sequence
- Each trigger causes memory corruption and potential crashes
- Terminal becomes unstable or unresponsive
- User experience is degraded, potentially causing data loss
Impact: While less severe than code execution, DoS attacks can:
- Interrupt critical work
- Cause loss of unsaved data
- Force system restarts
- Disrupt automated processes running in the terminal
Who Is Most at Risk?
High-Risk Users:
- Developers and system administrators who frequently use drag-and-drop for file transfers
- Users in multi-user environments where untrusted applications may interact with the terminal
- Organizations using Kitty in containerized or virtualized environments where isolation may be limited
- Users who download and open files from untrusted sources without proper validation
Lower-Risk Users:
- Users who primarily use keyboard-based navigation
- Users in isolated, single-user environments
- Users who have already upgraded to version 0.49.0 or later
Detection and Identification
Static Code Analysis Indicators
Security teams can identify this vulnerability through static analysis by searching for:
Pattern 1: Unvalidated Pointer Usage After Error Paths
// Vulnerable pattern
DragRemoteItem *item = get_item_from_array();
if (helper_function_may_error(item)) {
// Error handler may free array
// But item pointer is still used below
}
use_pointer(item); // Potential use-after-free
Pattern 2: Missing Null Checks After Error Conditions
// Vulnerable pattern
pointer = get_pointer();
if (error_condition()) {
// Memory freed here
}
// No validation that pointer is still valid
dereference(pointer);
Code Review Checklist:
- [ ] Identify all error paths in
drag_remote_file_data() - [ ] Verify that error handlers properly notify callers of state changes
- [ ] Check for pointer validation after error conditions
- [ ] Confirm that freed memory is not subsequently accessed
- [ ] Review
abrt()macro implementation and its side effects
Runtime Monitoring and Anomaly Detection
Detection Methods:
- Memory Sanitizers: Use AddressSanitizer (ASan) or Valgrind to detect use-after-free conditions
# Compile with ASan enabled
CFLAGS="-fsanitize=address" make
- Crash Analysis: Monitor for segmentation faults or memory access violations
- Unexpected crashes during drag-and-drop operations
- Crashes with memory corruption signatures
- Crashes in memory management code paths
- System Call Monitoring: Track suspicious system calls that may indicate exploitation
- Unusual
mmap()ormprotect()calls - Attempts to execute code from heap memory
- Unexpected process spawning from terminal
- Behavioral Indicators:
- Terminal process consuming excessive memory
- Repeated crashes in short time intervals
- Unusual CPU usage during drag-and-drop operations
How to Check Your Kitty Version
Method 1: Command Line
kitty --version
Method 2: Within Kitty Terminal
Press Ctrl+Shift+F1 to open the debug console and check version information.
Method 3: Package Manager
# Ubuntu/Debian
apt show kitty | grep Version
# macOS with Homebrew
brew info kitty
# Arch Linux
pacman -Q kitty
Interpretation:
- Vulnerable: Versions 0.47.0 through 0.48.x
- Patched: Version 0.49.0 or later
- Action Required: If vulnerable version detected, proceed to mitigation section
Mitigation and Remediation
Immediate: Upgrade to Kitty 0.49.0 or Later
This is the primary and most effective mitigation.
Upgrade Instructions:
Ubuntu/Debian:
sudo apt update
sudo apt install --only-upgrade kitty
macOS with Homebrew:
brew upgrade kitty
Arch Linux:
sudo pacman -S kitty
From Source:
git clone https://github.com/kovidgoyal/kitty.git
cd kitty
git checkout v0.49.0 # or later
python3 setup.py build
sudo python3 setup.py install
Verification After Upgrade:
kitty --version
# Should display 0.49.0 or higher
Post-Upgrade Checklist:
- [ ] Verify new version is running
- [ ] Test drag-and-drop functionality
- [ ] Confirm no configuration issues
- [ ] Review release notes for any breaking changes

Short-Term: Restrict Drag-and-Drop Operations
If immediate upgrade is not possible, implement these temporary controls:
Configuration File Modification:
Edit ~/.config/kitty/kitty.conf:
# Disable drag-and-drop functionality
enable_drag_and_drop no
Limitations of This Approach:
- Reduces functionality and user experience
- Does not eliminate the vulnerability, only reduces exposure
- Should be considered temporary only
Alternative Workarounds:
- Use keyboard shortcuts instead of drag-and-drop for file operations
- Copy file paths and paste them into the terminal
- Use command-line tools like
scporrsyncfor file transfers - Avoid dragging files from untrusted sources
Alternative Terminal Solutions
If upgrade timeline is extended, consider temporary alternatives:
| Terminal | Platform | Status |
|---|---|---|
| GNOME Terminal | Linux | Not affected |
| xterm | Linux/Unix | Not affected |
| iTerm2 | macOS | Not affected |
| Windows Terminal | Windows | Not affected |
| Alacritty | Cross-platform | Not affected |
Migration Considerations:
- Backup Kitty configuration files
- Test alternative terminal with your workflow
- Plan migration timeline
- Return to Kitty once patched
Prevention Best Practices
Input Validation for Drag-and-Drop
For Developers:
Implement strict validation of drag-and-drop operations:
// Improved error handling pattern
int validate_drag_operation(DragRemoteItem *item) {
if (item == NULL) {
return -1; // Invalid input
}
if (!is_valid_pointer(item)) {
return -1; // Pointer validation failed
}
return 0; // Valid
}
// Safe pointer usage
DragRemoteItem *item = get_item_from_array();
if (validate_drag_operation(item) != 0) {
handle_error();
return; // Exit early, don't use invalid pointer
}
// Proceed with validated pointer
process_drag_data(item);
Best Practices:
- Validate all pointers before use
- Implement bounds checking for array access
- Use defensive programming techniques
- Add assertions for pointer validity
Improved Error Handling Patterns
Recommended Pattern:
// Improved error handling with proper state management
typedef struct {
DragRemoteItem *item;
bool is_valid;
} DragContext;
DragContext *create_drag_context(DragRemoteItem *item) {
DragContext *ctx = malloc(sizeof(DragContext));
ctx->item = item;
ctx->is_valid = true;
return ctx;
}
void invalidate_drag_context(DragContext *ctx) {
ctx->is_valid = false;
ctx->item = NULL;
}
int process_drag_with_error_handling(DragContext *ctx) {
if (!ctx->is_valid) {
return -1; // Context already invalidated
}
int result = helper_function(ctx->item);
if (result < 0) {
invalidate_drag_context(ctx);
return -1;
}
return 0;
}
Key Improvements:
- Explicit state tracking
- Clear error signaling
- Prevention of use-after-free
- Easier debugging and maintenance
Staying Updated with Security Patches
For Users:
- Enable Automatic Updates
# Ubuntu/Debian
sudo apt install unattended-upgrades
- Subscribe to Security Notifications
- GitHub watch: https://github.com/kovidgoyal/kitty/releases
- Security mailing lists
- Distribution security advisories
- Regular Update Schedule
- Check for updates monthly
- Apply security patches within 30 days
- Test updates in non-critical environment first
- Vulnerability Tracking
- Monitor CVE databases
- Use vulnerability scanning tools
- Maintain software inventory
For Organizations:
- Patch Management Policy
- Define update timelines
- Establish testing procedures
- Document approval processes
- Automated Scanning
- Deploy vulnerability scanners
- Monitor for known CVEs
- Generate compliance reports
- Security Training
- Educate users about risks
- Promote secure practices
- Encourage timely updates
Frequently Asked Questions
What is a use-after-free vulnerability?
A use-after-free vulnerability occurs when a program continues to reference memory after it has been freed (deallocated). This can allow attackers to:
- Read sensitive data from freed memory regions that may contain secrets or other information
- Write arbitrary data to freed memory, potentially corrupting program state
- Execute arbitrary code by overwriting function pointers or other critical data structures
Use-after-free vulnerabilities are particularly dangerous because they can lead to complete system compromise with relatively simple exploitation techniques.
Which Kitty versions are vulnerable?
Vulnerable Versions:
- 0.47.0 through 0.48.x (inclusive)
Fixed Versions:
- 0.49.0 and later
To check your version, run:
kitty --version
If you see version 0.47.0 through 0.48.x, you must upgrade immediately.
Can this vulnerability be exploited remotely?
Direct Remote Exploitation: Limited. The vulnerability requires user interaction (drag-and-drop operation) on the local system.
Indirect Remote Exploitation: Possible through:
- Malicious files downloaded from the internet
- Compromised applications that initiate drag-and-drop operations
- Network-based file managers or desktop environment components
- Automated scripts that trigger drag-and-drop operations
An attacker cannot directly exploit this vulnerability over the network without user interaction or control of a local application.
What happens if I cannot upgrade immediately?
Temporary Mitigation Steps:
- Disable drag-and-drop functionality:
# Edit ~/.config/kitty/kitty.conf
enable_drag_and_drop no
- Avoid untrusted sources:
- Don’t drag files from unknown sources
- Be cautious with downloaded files
- Validate file sources before interaction
- Use alternative methods:
- Copy file paths and paste them
- Use command-line tools for file operations
- Employ keyboard shortcuts instead of drag-and-drop
- Switch terminals temporarily:
- Use GNOME Terminal, xterm, or iTerm2
- Plan migration back to Kitty after patching
- Establish upgrade timeline:
- Schedule upgrade within 30 days
- Test in non-critical environment first
- Document any configuration changes
How do I know if I’ve been exploited?
Indicators of Potential Exploitation:
- Terminal Crashes
- Unexpected segmentation faults
- Crashes during drag-and-drop operations
- Repeated crashes in short intervals
- System Logs
# Check system logs for memory errors
journalctl -xe | grep -i "memory\|segfault"
dmesg | grep -i "segfault"
- Process Behavior
- Unexpected child processes spawned from Kitty
- Unusual network connections from terminal
- Excessive memory consumption
- High CPU usage without explanation
- File System Changes
- Unexpected files created in home directory
- Modified system files
- New cron jobs or scheduled tasks
- Security Tools
- Antivirus/malware detection alerts
- Intrusion detection system (IDS) alerts
- File integrity monitoring (FIM) alerts
Response Actions:
- Immediately upgrade to patched version
- Review system logs for suspicious activity
- Run security scans
- Monitor system for further anomalies
- Consider full system audit if compromise suspected
Does this affect other terminal emulators?
No. CVE-2026-95834 is specific to Kitty terminal emulator and does not affect other terminal applications.
Unaffected Terminals:
- GNOME Terminal
- xterm
- iTerm2
- Windows Terminal
- Alacritty
- Konsole
- Terminator
- Other terminal emulators
The vulnerability is rooted in Kitty’s specific implementation of drag-and-drop functionality and does not exist in other terminal emulators’ codebases.
References
Official Sources:
Technical Resources:
Security Advisories:
Related CVEs:
- CVE-2024-XXXXX (Other Kitty vulnerabilities)
- CWE-416 (Use After Free – General)
Document Information:
- Last Updated: 2024
- Classification: Security Advisory
- Severity: High
- Status: Active
For questions or additional information, contact your security team or refer to the official Kitty project documentation.