CVE-2026-72847
broot Terminal Escape Sequence Injection via Unsanitized File and Directory Names in the Tree View
broot renders each file and directory name in its interactive tree view exactly as read from the filesystem. Names are converted with a plain to_string_lossy() call in src/tree_build/builder.rs and in TreeLine::unprune in src/tree/tree_line.rs, and no control-character filtering exists anywhere in the code, even though the doc comment on the TreeLine name field states that some characters may have been stripped. Any local user who can create a file can therefore place an escape sequence in its name and have it written unmodified to the terminal of anyone who browses that directory, between broot's own styling codes. A reported proof of concept used an OSC 52 clipboard-write sequence and captured the raw bytes broot wrote to its pty, confirming the sequence reaches the terminal unstripped. What an injected OSC or CSI sequence can then do depends on the terminal emulator in use. Browsing a directory is broot's primary function and carries no expectation that the content is trusted.
Attack profile
How easy it is to exploit
- Attack vector
- Local
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- Passive
What an attacker can affect
- Confidentiality
- Low
- Integrity
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
2.4
broot Terminal Escape Sequence Injection via Unsanitized File and Directory Names in the Tree View
broot renders each file and directory name in its interactive tree view exactly as read from the filesystem. Names are converted with a plain to_string_lossy() call in src/tree_build/builder.rs and in TreeLine::unprune in src/tree/tree_line.rs, and no control-character filtering exists anywhere in the code, even though the doc comment on the TreeLine name field states that some characters may have been stripped. Any local user who can create a file can therefore place an escape sequence in its name and have it written unmodified to the terminal of anyone who browses that directory, between broot's own styling codes. A reported proof of concept used an OSC 52 clipboard-write sequence and captured the raw bytes broot wrote to its pty, confirming the sequence reaches the terminal unstripped. What an injected OSC or CSI sequence can then do depends on the terminal emulator in use. Browsing a directory is broot's primary function and carries no expectation that the content is trusted.
- Record
CVE-2026-72847- CVSS 4.0
- 2.4 Low
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N - CVSS 3.1
- 4.6 Medium
CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-150
- Updated
- 2026-11-02
EUVDEUVD-2026-63488
2.4
broot renders each file and directory name in its interactive tree view exactly as read from the filesystem. Names are converted with a plain to_string_lossy() call in src/tree_build/builder.rs and in TreeLine::unprune in src/tree/tree_line.rs, and no control-character filtering exists anywhere in the code, even though the doc comment on the TreeLine name field states that some characters may have been stripped. Any local user who can create a file can therefore place an escape sequence in its name and have it written unmodified to the terminal of anyone who browses that directory, between broot's own styling codes. A reported proof of concept used an OSC 52 clipboard-write sequence and captured the raw bytes broot wrote to its pty, confirming the sequence reaches the terminal unstripped. What an injected OSC or CSI sequence can then do depends on the terminal emulator in use. Browsing a directory is broot's primary function and carries no expectation that the content is trusted.
- Record
EUVD-2026-63488- CVSS 4.0
- 2.4 Low
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-8v8c-hvqj-mqw8
2.4
broot renders each file and directory name in its interactive tree view exactly as read from the...
broot renders each file and directory name in its interactive tree view exactly as read from the filesystem. Names are converted with a plain to_string_lossy() call in src/tree_build/builder.rs and in TreeLine::unprune in src/tree/tree_line.rs, and no control-character filtering exists anywhere in the code, even though the doc comment on the TreeLine name field states that some characters may have been stripped. Any local user who can create a file can therefore place an escape sequence in its name and have it written unmodified to the terminal of anyone who browses that directory, between broot's own styling codes. A reported proof of concept used an OSC 52 clipboard-write sequence and captured the raw bytes broot wrote to its pty, confirming the sequence reaches the terminal unstripped. What an injected OSC or CSI sequence can then do depends on the terminal emulator in use. Browsing a directory is broot's primary function and carries no expectation that the content is trusted.
- Record
GHSA-8v8c-hvqj-mqw8- CVSS 4.0
- 2.4 Low
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 4.6 Medium
CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-150
- Updated
- 2026-11-02
NVD
2.4
broot renders each file and directory name in its interactive tree view exactly as read from the filesystem. Names are converted with a plain to_string_lossy() call in src/tree_build/builder.rs and in TreeLine::unprune in src/tree/tree_line.rs, and no control-character filtering exists anywhere in the code, even though the doc comment on the TreeLine name field states that some characters may have been stripped. Any local user who can create a file can therefore place an escape sequence in its name and have it written unmodified to the terminal of anyone who browses that directory, between broot's own styling codes. A reported proof of concept used an OSC 52 clipboard-write sequence and captured the raw bytes broot wrote to its pty, confirming the sequence reaches the terminal unstripped. What an injected OSC or CSI sequence can then do depends on the terminal emulator in use. Browsing a directory is broot's primary function and carries no expectation that the content is trusted.
- Record
CVE-2026-72847- CVSS 4.0
- 2.4 Low
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 4.6 Medium
CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-150
- Updated
- 2026-11-02
OSV
2.4
broot Terminal Escape Sequence Injection via Unsanitized File and Directory Names in the Tree View
broot renders each file and directory name in its interactive tree view exactly as read from the filesystem. Names are converted with a plain to_string_lossy() call in src/tree_build/builder.rs and in TreeLine::unprune in src/tree/tree_line.rs, and no control-character filtering exists anywhere in the code, even though the doc comment on the TreeLine name field states that some characters may have been stripped. Any local user who can create a file can therefore place an escape sequence in its name and have it written unmodified to the terminal of anyone who browses that directory, between broot's own styling codes. A reported proof of concept used an OSC 52 clipboard-write sequence and captured the raw bytes broot wrote to its pty, confirming the sequence reaches the terminal unstripped. What an injected OSC or CSI sequence can then do depends on the terminal emulator in use. Browsing a directory is broot's primary function and carries no expectation that the content is trusted.
- Record
CVE-2026-72847- CVSS 4.0
- 2.4 Low
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N - Weakness
- CWE-150
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-72847
2.4
broot renders each file and directory name in its interactive tree view exactly as read from the filesystem. Names are converted with a plain to_string_lossy() call in src/tree_build/builder.rs and in TreeLine::unprune in src/tree/tree_line.rs, and no control-character filtering exists anywhere in the code, even though the doc comment on the TreeLine name field states that some characters may have been stripped. Any local user who can create a file can therefore place an escape sequence in its name and have it written unmodified to the terminal of anyone who browses that directory, between broot's own styling codes. A reported proof of concept used an OSC 52 clipboard-write sequence and captured the raw bytes broot wrote to its pty, confirming the sequence reaches the terminal unstripped. What an injected OSC or CSI sequence can then do depends on the terminal emulator in use. Browsing a directory is broot's primary function and carries no expectation that the content is trusted.
- Record
DEBIAN-CVE-2026-72847- CVSS 4.0
- 2.4 Low
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-72847
2.4
broot renders each file and directory name in its interactive tree view exactly as read from the filesystem. Names are converted with a plain to_string_lossy() call in src/tree_build/builder.rs and in TreeLine::unprune in src/tree/tree_line.rs, and no control-character filtering exists anywhere in the code, even though the doc comment on the TreeLine name field states that some characters may have been stripped. Any local user who can create a file can therefore place an escape sequence in its name and have it written unmodified to the terminal of anyone who browses that directory, between broot's own styling codes. A reported proof of concept used an OSC 52 clipboard-write sequence and captured the raw bytes broot wrote to its pty, confirming the sequence reaches the terminal unstripped. What an injected OSC or CSI sequence can then do depends on the terminal emulator in use. Browsing a directory is broot's primary function and carries no expectation that the content is trusted.
- Record
UBUNTU-CVE-2026-72847- CVSS 4.0
- 2.4 Low
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N - CVSS 3.1
- 4.6 Medium
CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N - Updated
- 2026-11-02
OSVopenSUSE-SU-2026:21675-1 No score
Security update for broot
This update for broot fixes the following issues:
Changes in broot:
-
v1.59.0 (CVE-2026-72847 boo#1275994)
- new shell_command verb attribute: run a command through a shell (sh -c / cmd /C) so &&, ; and pipes work, without leaving broot - Fix #1145
- fix invalid official Mac binary (duplicate linked dylib) with new build chain - Fix #1194
- Sixel graphics support for image preview, auto-detected: works in iterm2, Windows Terminal 1.22+ and Sixel-capable Unix terminals (foot, mlterm, xterm built with Sixel, recent WezTerm). Kitty remains the preferred protocol when available. Note: this requires broot to be compiled with sixel feature (eg cargo install broot --features sixel) - Fix #568
- High-Res images in Rio terminal (detect it to enable the Kitty image protocol) - Fix #1179
- fix iTerm2 3.6.10 and later not displaying Hi-Res images, the version being compared as text
- fix content-exact match line number off-by-one when the match starts at the first byte of a line (broot jumped to the line above)
- new :no_action internal, doing nothing, which can be used to disable a key - Fix #328
- fix: detect a duplicate broot server name instead of silently overtaking the running server - Fix #1065
- fix preview transformers extension matching not working with double extensions such as .tar.gz - Fix #1195
- strip escape sequences from displayed names to prevent OSC injections - Fix #1188
- fall back to numeric uid/gid instead of ???? when the user or group name can't be resolved, which is always the case on statically linked musl builds - Fix #1075
- fix panic on a content regex matching the empty string at the end of a line ending with a control char (eg cr/$/ on a CRLF file)
- fix Windows paths (containing backslashes) being mangled by the launcher's eval when using :cd and similar; also fixes escaping of paths containing a single quote - Fix #1100
- fix br failing on Windows/PowerShell when the temp path contains a space (e.g. a space in the Windows username) - Fix #788
- JPEG XL images are no longer previewed: the decoder had out-of-bounds bugs and the fix needs a more recent rustc (if you need it, tell me and I'll try to make it opt-in)
- rustc minimal version changed from 1.83 to 1.85, and edition 2024
-
v1.58.0
- change the way possible verb completions are listed, making it more readable when there are more than what fits the screen
- fix argument of :select and :show being ignored in a --cmd sequence - Fix 1176
-
v1.57.0
- help: verb 'keys' and 'description' columns now searchable - Fix #1163
- fix :print_path / :print_relative_path adding a trailing empty line when printing a multi-item staging area - Fix #1062
- Skin: attributes (bold, underlined, etc.) of the "selected_line" entry now applied - Fix #1156
- if no Wezterm version is found, broot now assumes it's recent enough to support kitty protocol for image - Fix #509
-
v1.56.4
- fix compilation on non unix platforms (1.56.3 isn't available on those systems)
-
v1.56.3
- fix control characters sometimes remaining in the terminal after broot exit
- nushell: rename br module to avoid conflict in last nushell version - Fix #1138
- :open_stay on the staging area opens every staged file through the system opener - Fix #444
-
v1.56.2
- {file-root-relative} argument - Fix #1142
- fix :clear_stage (or other operations closing the stage panel) often closing broot - Fix #1143
-
v1.56.1
- fix a typo in a verb in default conf
-
v1.56.0
- impacted_panel verb argument, allows the effect of a verb to be on another panel (eg to scroll the preview panel without removing the focus from the tree) - Fix #1119
- focus_panel_left and focus_panel_right internals - Fix #1115
- Major Feature: merge staged files to issue a single command: when a verb argument has a space-separated or comma-separated flag, a single external command is run even when the selection is multiple - Fix #465 The default verbs.json file has an example…
- Record
openSUSE-SU-2026:21675-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
rust-brootDebian:13 |
All versions, plus listed versions 1.46.3-21.47.0-11.47.0-21.47.0-31.48.0-1 Show 23 moreShow less1.49.1-11.49.1-21.50.0-11.51.0-11.51.0-21.52.0-11.53.0-11.53.0-21.54.0-11.54.0-21.54.0-31.54.0-41.55.0-11.56.2+dfsg-11.56.2+dfsg-21.56.4+dfsg-11.57.0+dfsg-11.57.0+dfsg-21.57.0+dfsg-31.57.0+ds-11.57.0+ds-21.57.0+ds-31.60.2+ds-1 |
None known |
rust-brootDebian:14 |
All versions, plus listed versions 1.46.3-21.47.0-11.47.0-21.47.0-31.48.0-1 Show 23 moreShow less1.49.1-11.49.1-21.50.0-11.51.0-11.51.0-21.52.0-11.53.0-11.53.0-21.54.0-11.54.0-21.54.0-31.54.0-41.55.0-11.56.2+dfsg-11.56.2+dfsg-21.56.4+dfsg-11.57.0+dfsg-11.57.0+dfsg-21.57.0+dfsg-31.57.0+ds-11.57.0+ds-21.57.0+ds-31.60.2+ds-1 |
None known |
rust-brootUbuntu:26.10 |
All versions, plus listed versions 1.55.0-11.57.0+dfsg-31.57.0+ds-2 |
None known |
rust-brootUbuntu:26.04:LTS |
All versions, plus listed versions 1.47.0-21.51.0-11.52.0-11.53.0-11.53.0-2 Show 5 moreShow less1.54.0-11.54.0-21.54.0-31.54.0-41.55.0-1 |
None known |
brootopenSUSE:Leap 16.0 |
before 1.59.0-bp160.1.1 | 1.59.0-bp160.1.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-72847 is a low vulnerability (CVSS 2.4) in Canop Broot, published August 20, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.15%, the 3rd percentile. Fixed in broot 1.59.0-bp160.1.1.
References
github.com/Canop/broot/issues/1188
github.com/Canop/broot/commit/4ba40f7d47af78457c7656f15eba71d63d97fce5
github.com/Canop/broot/commit/0717a94b3c0efa19c7bbcfe0fb49a2374752a168
github.com/Canop/broot/blob/v1.58.0/src/tree/tree_line.rs
github.com/Canop/broot/blob/v1.58.0/src/tree_build/builder.rs
github.com/Canop/broot
Show 9 moreShow less
vulncheck.com/advisories/broot-terminal-escape-sequence-injection-via-unsanitized-file-and-directory-names-in-the-tree-view
nvd.nist.gov/vuln/detail/CVE-2026-72847
github.com/advisories/GHSA-8v8c-hvqj-mqw8
github.com/CVEProject/cvelistV5/tree/main/cves/2026/72xxx/CVE-2026-72847.json
security-tracker.debian.org/tracker/CVE-2026-72847
ubuntu.com/security/CVE-2026-72847
cve.org/CVERecord?id=CVE-2026-72847
bugzilla.suse.com/1275994
suse.com/security/cve/CVE-2026-72847
Left out here: the rest of 1 source description. The JSON record has them.