Skip to main content
← Vulnerabilities

Path traversal in `rio-vt` Kitty graphics protocol handler allows out-of-bounds file delete (and read)

Affects rio-vt before 0.5.29, reachable through its public Kitty graphics parse API under the conditions described in the advisory. CVSS and vendor ratings are not given. Fixed in 0.5.29.

Written by anthropic/claude-haiku-5.5 from the sources below. Verify against them.

Exploited
No known exploitation
Fix
Fixed in 0.5.29
Who is exposed
Specific setups only

Do first: Check whether your setup matches what the bug needs. A directory whose path contains the marker must already exist on the target and be referenceable by the attacker. The attacker's payload is an a=t,t=t Kitty graphics command using the temp-file transmission medium. The code is reachable through the public parse API of rio-vt.

Published
Last modified
15/100
Specific setups only
None on Exploit-DB, Metasploit or GitHub

Summary

The `rio-vt` terminal library, and terminal emulators built on it such as the Rio terminal, are affected. Untrusted output rendered by the terminal can delete files outside its temporary directory and read their contents.

Read the original description

The Kitty graphics protocol handler in rio-vt builds a filesystem path from an attacker-controlled APC escape sequence and, for the temp-file medium, only checks that the path *contains the substring* "tty-graphics-protocol" before it opens, reads, and remove_files it. There is no .. rejection and no canonicalization, so a path containing the marker substring plus .. escapes the terminal's temp directory (path traversal, CWE-22/CWE-23).

Because a terminal renders whatever arrives on the PTY (ssh output, a cat'd file, CI logs), untrusted output can delete a file outside the temp area and cause its bytes to be read back in.

Details

The sink is create_graphic_data() in src/ansi/kitty_graphics_protocol.rs, in the TransmissionMedium::TempFile branch, reachable through the public API rio_vt::ansi::kitty_graphics_protocol::parse. The path is the base64 APC payload of an a=t,t=t command, and the guard is:

let path = Path::new(path_str);
if !path.is_file() { return Err(GraphicError::FileNotFound); }       // literal path, resolves `..`
// reject /proc/ /sys/ /dev/ (lowercased substring)
if cmd.medium == TransmissionMedium::TempFile
    && !path_str.contains("tty-graphics-protocol") {                 // SUBSTRING, not a component
    return Err(GraphicError::InvalidData);
}
// ...
let mut file = File::open(path)...;          // reads file bytes
if cmd.medium == TransmissionMedium::TempFile {
    let _ = std::fs::remove_file(path);      // deletes the file
}

This affects any terminal emulator or application built on rio-vt (e.g. the Rio terminal) that renders attacker-influenced output: an out-of-bounds file is deleted, and its contents are read into the process.

The fix

Fixed in rio-vt 0.5.29 (Rio 0.5.29) by PR #1998. For the temp-file medium the parent directory is resolved with canonicalize before any check, the resolved entry must lie inside a temp directory (temp_dir(), /tmp or /dev/shm) and contain the marker, and the delete goes through unlinkat on a handle to the validated directory, so neither .. nor a swapped symlink can redirect it. Path checks for the file medium also run on the file actually opened.

cve.now Index

15cve.now Index 15 of 100 · methodology v3
  • Exploitation?/40Unknown. No CISA SSVC exploitation rating yet
  • Exposure5/25Specific setups only
  • Reach10/20Affects crates.io packages
  • Severity?/10Unknown. No CVSS score or vendor rating
  • No patch0/5No signal

What would change the score

  • Would score about 65 if added to CISA KEV
  • Would score about 60 if CISA's SSVC rates exploitation active
  • Would score about 25 if CISA's SSVC rates it automatable

What to do

  • Check whether your setup matches what the bug needs.

    A directory whose path contains the marker must already exist on the target and be referenceable by the attacker. The attacker's payload is an a=t,t=t Kitty graphics command using the temp-file transmission medium. The code is reachable through the public parse API of rio-vt.
  • Upgrade to a fixed version: 0.5.29.

Timeline

  1. Advisory published1 day
  2. Record last updated
  3. First seen by cve.now

Affected versions

  • rio-vtcrates.io

    From 0.0.0-0 · fixed in 0.5.29

Evidence 4

  1. Advisory
  2. Advisory
  3. Repository
  4. Link

Corrections

None so far.

Something wrong on this page? Report an error. Every fix is listed here.

Questions about RUSTSEC-2026-0430

Is RUSTSEC-2026-0430 being exploited?

It is not in CISA's Known Exploited Vulnerabilities catalog, and CISA's SSVC assessment does not mark exploitation as active. That does not mean it has not been attacked: vendors and researchers can report attacks before CISA lists them. No public exploit code is tracked.Source: cve.now feed data

What does this mean?

Crafted Kitty graphics commands can use a path containing a marker to make the handler delete a file outside the terminal's temp area. The same flaw can also make the handler read that file's contents into the process.Source: github.com

Which versions are affected by RUSTSEC-2026-0430?

rio-vt (crates.io): from 0.0.0-0 before 0.5.29.Source: cve.now feed data

Am I affected, and how do I check?

Versions of rio-vt before 0.5.29 are affected. The bug needs a directory whose path contains the marker to already exist on the target and be referenceable, and it is reached through the public rio_vt::ansi::kitty_graphics_protocol::parse API. To check a project, look at the rio-vt version in its lock file or dependency tree.Source: github.com

How do I fix RUSTSEC-2026-0430?

Upgrade rio-vt to 0.5.29 or later, which is the fixed release (Rio 0.5.29 includes it). The advisory lists no workaround.Source: github.com