Safe terminal text tools

Your terminal believes the file. You shouldn't.

Bytes from a log, a paste, or a download can hide text, forge your prompt, disguise what a character really is, and on a vulnerable terminal run commands. "Lie" undersells it: cat does not just believe the file, it obeys it. These tools show you what is actually there.

7 techniques · 1 seen in the wild · one safe view

What is this? When you read output in a terminal (a log, a paste, a downloaded file) you trust that what your terminal draws is what the bytes say. This page collects the ways an attacker makes those two differ: your screen shows one thing, the bytes are another, and on a vulnerable terminal they can even run commands. Then it shows the tools that make the safe view the default. Every example here is safe to read.

What cat shows you

It renders the bytes as instructions. A control character reorders the line, an escape erases text or repaints your prompt, a look-alike letter passes for another. cat trusts the file completely.

What's really there

The same bytes, revealed or rendered inert. Every suspicious codepoint named, every escape neutralized, every untrusted value stripped before it reaches your screen, or your logs.

Seen in the wild

Start here: the one trick on this page with documented real-world exploitation. The escape-sequence tricks that follow are high-severity but, as far as public reporting shows, proof-of-concept only. Hiding code in characters your eyes cannot see is not.

Seen in the wild Invisible & look-alike characters

Code hidden in characters you can't see

A hidden control character, an invisible zero-width byte, or a Cyrillic look-alike letter reads as ordinary code, and cat never mentions it. unicode-show flags every byte outside printable ASCII with its line number, [U+XXXX] marker, name and category.

cat
$ cat withdraw.py
# Subtract funds from the account, then ⁧refund the user⁩

# reads clean; an isolate char quietly reorders it
unicode-show
$ unicode-show withdraw.py
withdraw.py:1: # Subtract funds ... then [U+2067]refund the user
   -> U+2067 RIGHT-TO-LEFT ISOLATE (Cf)
$ echo $?
1

The catch: the exit code reports it too: 0 clean, 1 suspicious, 2 error (unreadable or undecodable). Scriptable, not just visible. (docs)

Backdoor path: split or disguise an identifier with an invisible or look-alike character, so a call the reviewer reads as validate() binds to a different, attacker-defined symbol, or hide live code in bytes that render as nothing at all.

Seen in the wild: the GlassWorm supply-chain worm (2025-2026) hid live malware in invisible Unicode across 400+ code repositories on GitHub, npm and the VS Code marketplace (different mechanism from the escape-sequence cards below, same blind spot). The bidi and homoglyph half of this class was formalized as Trojan Source (CVE-2021-42574) and CVE-2021-42694.

Reproduce · sandbox VM only -- bare cat renders it as innocent-looking text; the hidden characters stay invisible · view the PoC on GitHub →
base64 -d poc/trojan-source-bidi-2021/payload.b64 > payload
cat payload
Mitigation · every hidden character named and colored right where it hides
unicode-show payload
unicode-show run on a file named auth.py that reads like ordinary code. Each hidden character is flagged inline as a red bracketed codepoint such as [U+202E], and annotated on the next line in cyan with its codepoint, official name and category (RIGHT-TO-LEFT OVERRIDE, CYRILLIC SMALL LETTER A, ZERO WIDTH SPACE, NO-BREAK SPACE, SPACE), plus a note that the final newline is missing.
The real tool in a terminal: run on a file that reads clean, unicode-show names and colors every hidden character right where it hides.

Proof of concept

High-severity escape-sequence tricks with a 20-year CVE trail and published proofs of concept, but no confirmed in-the-wild campaign. Merely viewing untrusted terminal output is the shared blind spot.

Proof of concept Escape-sequence RCE

Merely viewing a file can run commands

A terminal is not only a display. Some escape sequences ask it a question - report the window title, a DECRQSS status, the cursor position - and the terminal answers the only way it can: by writing the reply to its own input, exactly as if you had typed it. A hostile file can set that answer to a command and then ask for it back, so merely cating a poisoned log or README (or tail -f-ing a booby-trapped log, even one arriving over SSH) injects keystrokes, and once a newline rides along, a full command runs.

cat
$ cat demo.log
deploy: OK

# the window title is hijacked and a FAILED line was erased before it printed
stcat
$ stcat demo.log
deploy: OK
_]0;pwned__[2K_build: FAILED

The catch: stcat neutralizes every escape to an inert _, so the hijacked title and the erased FAILED line are right there in plain sight, and unicode-show names the smuggled ESC and BEL bytes. On a vulnerable terminal, that same answer-back channel is what escalates to injected keystrokes.

Backdoor path: ship a poisoned log, README, or git repo; when a developer or admin views it in a vulnerable terminal, attacker bytes are echoed into the shell and run.

Proof of concept: a well-documented class: iTerm2 CVE-2019-9535 and CVE-2022-45872 (RCE), xterm CVE-2021-27135, Windows Terminal CVE-2022-44702, and the ten CVEs David Leadbeater catalogued in 2023. And it keeps recurring: iTerm2 CVE-2024-38396 and the brand-new terminal Ghostty (CVE-2024-56803) were both hit by the same window-title-into-keystrokes trick in 2024, with a public proof of concept that opens the calculator from a single cat. The origin paper is HD Moore's "Terminal Emulator Security Issues" (2003); see also CyberArk. All responsibly disclosed; none observed in the wild.

Build a safe stand-in and watch it neutralized (no real terminal is harmed, the payload only sets a title and erases a line):

# write a "log" that hides a title-change and a line-erase redraw
$ printf 'deploy: OK\n\033]0;pwned\007\033[2K\rbuild: FAILED\n' > demo.log

# cat obeys the bytes: the window title is hijacked and FAILED is erased
$ cat demo.log
deploy: OK

# stcat neutralizes every escape to _, so nothing is hidden or run
$ stcat demo.log
deploy: OK
_]0;pwned__[2K_build: FAILED

# unicode-show names the smuggled bytes with line numbers
$ unicode-show demo.log
demo.log:2: [U+001B]]0;pwned[U+0007]...
   -> U+001B ESCAPE (Cc), U+0007 BELL (Cc)
Reproduce · sandbox VM only -- bare cat obeys the bytes, so the lie fires · view the PoC on GitHub →
base64 -d poc/title-report-echoback-2003/payload.b64 > payload
cat payload
Mitigation · every escape neutralized to _, nothing hidden or run
stcat payload
unicode-show payload
A terminal where cat notice.txt prints only 'Update installed. System healthy.' while the file secretly carries an OSC terminal-control sequence. stcat reveals the hidden payload as _]0;attacker@evil:~# _ before the visible text, and unicode-show names the hidden bytes U+001B (ESC) and U+0007 (BEL).
A safe demonstration of the mechanism: cat shows one innocuous line, but the file smuggles a terminal-control sequence that cat feeds straight to the terminal. stcat neutralizes it and unicode-show names the hidden ESC and BEL bytes. On a vulnerable terminal, this same channel is what escalates to injected keystrokes.
Proof of concept OSC 8 hyperlink spoof

The link text is not the link

The OSC 8 escape turns terminal text into a clickable hyperlink -- and, like an HTML <a>, the visible label and the real target are set separately. So program output can print a link that reads example.com but points at example.org. You see the label; the target hides in the escape.

what you see
$ cat release-notes.txt
Get the installer: example.com
# an ordinary-looking, clickable link
what is really there
$ stcat release-notes.txt
Get the installer: _]8;;https://example.org_\example.com_]8;;_\
   -> label "example.com"  --  target https://example.org

The catch: the label and the target are independent, so the text you read is not the site you reach -- the terminal twin of an HTML link whose text lies about its href. stcat neutralizes the OSC 8 escape to an inert _, so the real target is in plain sight, and secure-terminal ships OSC 8 off by default.

Backdoor path: print a link that reads example.com but targets an attacker site; the reader clicks the label they trust and lands on the payload, or a ssh://-style scheme smuggles arguments into the command the click runs.

Proof of concept: OSC 8 hyperlink phishing was disclosed as CVE-2023-46322 (and related CVE-2023-46321 / CVE-2022-46663); see the hyperlink rows in the attack-class table. No documented in-the-wild campaign.

Reproduce · sandbox VM only -- bare cat obeys the bytes, so the lie fires · view the PoC on GitHub →
base64 -d poc/osc8-hyperlink-phishing/payload.b64 > payload
cat payload
Mitigation · the OSC 8 escape neutralized to _, so the real target is in plain text
stcat payload
Proof of concept Logs as a surface

Logs can attack the person reading them

Escape sequences smuggled into a log line do nothing to the file, but when an admin views that log in an ANSI-capable console, they can rewrite what is shown, forge entries, or manipulate the clipboard to trick the admin into running a command. You cat and tail logs from places you do not control: CI output, container and kubectl logs, a remote server over SSH, a honeypot. A log is just a file an attacker can write into.

cat
$ cat access.log
INFO: system all-good!

# a \r returned the cursor and "all-good" repainted over the real ERROR line
stcat
$ stcat access.log
ERROR: breach detected_INFO: system all-good!

The catch: the log file is honest; only the rendering lies. An attacker-controlled field (a username, a URL, a header) carries a carriage return that overwrites the real entry with a forged one. stcat neutralizes the CR to _, so the real ERROR is right there.

Backdoor path: get attacker-controlled text into a log (via a crafted URL, a username, a header), then wait for someone to read the log in a terminal.

Proof of concept: Apache Tomcat's CVE-2025-55754 did not escape ANSI in log messages. Note the honesty gap these tools argue against: NVD scores it 9.6, but Apache rates it Low ("no attack vector was found"): theoretical, not demonstrated end to end. There is no ATT&CK technique for this display-layer forgery; the nearest, T1070.003, is about deleting logs, not deceiving the reader of an intact one.

Reproduce the forgery with a benign stand-in:

# the field value hides a \r that returns the cursor to column 0
$ printf 'ERROR: breach detected\rINFO: system all-good!\n' >> access.log

# cat renders the CR: "all-good" repaints over the real ERROR line
$ cat access.log
INFO: system all-good!

# stcat neutralizes the CR to _, so the real ERROR is right there
$ stcat access.log
ERROR: breach detected_INFO: system all-good!
Reproduce · sandbox VM only -- bare cat obeys the bytes, so the forged line replaces the real one · view the PoC on GitHub →
base64 -d poc/crafted-hostile-log/payload.b64 > payload
cat payload
Mitigation · the carriage return neutralized to _, so the real ERROR is right there
stcat payload
unicode-show payload
A terminal where cat access.log prints a benign-looking line, 10.0.0.9 - GET /health 200 ok, while the log line hides an OSC 52 clipboard-write escape. stcat reveals the payload as _]52;c;ZWNobyBwd25lZAo=_ and unicode-show names the hidden U+001B (ESC) and U+0007 (BEL) bytes.
A safe demonstration: viewing the log looks like a routine health check, but the line hides an OSC 52 sequence that silently loads the reader's clipboard (here with a harmless echo pwned). stcat and unicode-show expose what plain cat hid.
Proof of concept Editor modelines

A comment that reconfigures your editor

A modeline is a comment like # vim: ... that Vim and Emacs read and obey when they open the file: it can change settings and, historically, execute code. cat shows it as an ordinary trailing comment. modeline-show (run on its own or via text-safety-scan) flags it.

cat
$ cat changelog
- fix typo in release notes
# vim: set fdm=expr fde=system('...'):

# reads like a harmless editor hint at the end of the file
text-safety-scan
$ text-safety-scan changelog
# runs unicode-show AND modeline-show
[modeline] changelog:2: Vim modeline found:
   # vim: set fdm=expr fde=system('...'):
$ echo $?
1   # 0 clean, 1 finding, 2 hard error

The catch: text-safety-scan runs every configured plugin in one pass (today unicode-show plus modeline-show), and text-safety-scan-find walks a whole tree with recursion and pruning under your control via plain find expressions. It is an auditing tool, not a race-proof guard: run it on a tree the attacker cannot write to during the scan. (docs)

Backdoor path: append a modeline to a file a target is likely to open in a misconfigured editor; opening it reconfigures the editor or, on a vulnerable version, runs the attacker's expression.

Proof of concept: opening a crafted file has meant code execution: Vim/Neovim modeline RCE CVE-2019-12735. No documented in-the-wild campaign.

Reproduce · no stored fixture: a benign hand-run stand-in -- a harmless modeline, no exploit. Opening it in a misconfigured editor is what applies the embedded setting
printf '- notes\n# vim: set ai:\n' > changelog
vim changelog # the editor reads and applies the embedded modeline
Mitigation · audit the file first -- the modeline is surfaced, never applied
text-safety-scan changelog
A terminal running text-safety-scan on ./repo/changelog. One pass fires both plugins: unicode-show names a hidden U+0430 Cyrillic character, and modeline-show warns that a Vim modeline was found, quoting the line. text-safety-scan then reports FAIL with two findings, and echo $? prints 1.
The real tool: a single text-safety-scan run fires every plugin at once, here catching both a hidden Unicode character and a Vim modeline, and returns 1 (0 clean, 1 finding, 2 hard error). text-safety-scan-find runs the same checks over a whole tree.

Known technique

Recognized abuses of legitimate, universal terminal features. No specific CVE or documented campaign: the feature is working as designed, and the deception is in how it is used.

Known technique alt-screen restore

The screen it painted leaves no trace

The alternate screen (?1049h) is the full-screen buffer vim, less and htop use: enter it, paint, then leave and your original scrollback is back untouched. Legitimate -- until a log enters it, paints fake output, and leaves. The forged full-screen view flashes by and vanishes, and your scrollback looks like nothing ever happened. Press Play:

primary screen
$ cat deploy.log
a safe re-enactment -- no real terminal is touched

The catch: the fake "ALL GREEN" dashboard was painted on the alternate screen, so leaving it (the log never draws a scrollbar or newline into your buffer) restores your primary screen exactly as it was -- no trace in scrollback. Alt-screen itself is a legitimate feature every terminal supports; the deception is painting a convincing fake, then restoring so you never scroll back to catch it. secure-terminal's default line mode strips ?1049h and shows the log as inert text with your scrollback intact, offering opt-in TUI mode if you actually want full-screen programs.

Backdoor path: a log or README enters the alternate screen, paints a convincing fake (an all-green build, a clean scan), then leaves -- your scrollback is restored untouched, so no trace of the forged view survives for you to scroll back and catch.

Known technique: the alternate screen is a legitimate, universal terminal feature; painting a fake view then restoring is a recognized abuse with no specific CVE or documented campaign.

Reproduce · sandbox VM only -- bare cat obeys the bytes, so the lie fires · view the PoC on GitHub →
base64 -d poc/alt-screen-hijack/payload.b64 > payload
cat payload
Mitigation · the alt-screen switch neutralized to _, so nothing is hidden
stcat payload
Known technique Cursor / line erase

Cursor tricks hide a failure

An escape sequence can erase a line and repaint it. To cat that means "hide the failure". stcat turns the ESC byte into an inert _ and keeps only safe color codes.

cat
$ cat build.log
[ ok ] all checks passed

# an escape erased the FAILED line before it printed
stcat
$ stcat build.log
FAILED: auth bypass_[2K_[ ok ] all checks passed

The catch: the erase (ESC[2K) and the carriage return are neutralized to _, so the hidden FAILED line is right there in plain sight. That is stcat specifically: it renders a byte stream and applies no line editing. A live terminal, secure-terminal included, honours the erase within the current line, so use stcat when you need the byte-exact record.

Backdoor path: a build or scan log erases and repaints its own failure line, so a reader watching output scroll past sees only a green pass where a red FAILED really printed.

Known technique: cursor addressing and erase-in-line are standard terminal control; using them to overwrite a failure is a recognized abuse with no specific CVE or documented campaign.

Reproduce · sandbox VM only -- bare cat obeys the bytes, so the failure is erased · view the PoC on GitHub →
base64 -d poc/cursor-addressing-spoof/payload.b64 > payload
cat payload
Mitigation · the erase and carriage return neutralized to _, surfacing the hidden FAILED
stcat payload
A terminal comparing cat and stcat on build.log. cat shows three green [ ok ] lines including all checks passed, hiding the failure. stcat reveals the red FAILED: auth bypass in login() line, with the erase and carriage return neutralized to _[2K_ and the green [ ok ] all checks passed kept.
The real tool: cat replays the escape and shows only the green pass, while stcat neutralizes the erase and carriage return to _, keeps the colors, and surfaces the hidden red FAILED line.

How the safe tools catch all of this

The fix is a set of safe text tools that sit between the raw bytes and your screen. Instead of dumping a file straight at your terminal, they render every byte defensively. Every one of them does three things:

01

Neutralize

Dangerous bytes (escapes, cursor and screen control, overrides, invisibles, NUL) become inert _ placeholders. Real color codes are kept so honest output still renders.

02

Surface

Every anomaly is named: the codepoint by [U+XXXX], the escape, the modeline, the file that hides it. Exit codes report it, so a script catches it too.

03

Fail closed

When a file can't be decoded or shown safely, the tools stop and say so instead of passing raw bytes through to a terminal that would obey them.

The commands (unicode-show, grep-find-unicode-wrapper, text-safety-scan, stcat, sanitize-string and friends) ship in Kicksecure's helper-scripts. The full family, and what each replaces, is in the table below.

The live terminal

The commands above inspect one file when you remember to run them. secure-terminal is the display itself: a terminal that renders hostile output inert as it arrives, for every command, paste and log line, with nothing to run first.

cat vs secure-terminal

Every byte inert, by default

A normal terminal obeys the bytes: an escape repaints the prompt or forges the title, a bidi control reorders a line, a hidden character rides along unseen. secure-terminal parses no escape sequences at all -- colour is clamped legible, cursor and screen control are neutralized, and every non-ASCII byte is named <U+XXXX> or shown as an inert risk-tinted box.

any terminal
$ cat deploy.log
Deploying to ⁧production⁩... done

# reads clean; an isolate reordered it and an OSC forged the title
secure-terminal
$ cat deploy.log
Deploying to [U+2067]production[U+2069]... done
! blocked OSC title escape

The catch: the per-file tools are opt-in -- you have to suspect a file first. secure-terminal makes the safe view the default for the whole session, and an automated test asserts it writes zero bytes back to any query. The measured, side-by-side comparison against ten emulators is on secure-terminal's comparison page.

Every attack class

Twenty years of terminal escape attacks, by class. Each is a way program output tricks the terminal into acting; secure-terminal answers them the same way, by construction -- with one scoped exception, noted in the cursor-spoof row. Most rows are answered by ABSENCE -- the class needs a parser or feature secure-terminal does not implement, so it is not applicable rather than defended. Worth stating plainly: that is not a claim of being defect-free. A long list of known CVEs in other terminals is largely inapplicable here, and says nothing about undiscovered bugs in secure-terminal's own (much smaller) surface. Live, canary-forked proofs for every class are in the terminal-poc-corpus.

Every publicly-disclosed terminal escape-attack class, with example CVEs and how secure-terminal defeats it. The corpus references 41 CVEs across these classes and proves secure-terminal neutralizes all of them.
ClassWhat the terminal is tricked intoExample CVEssecure-terminal defense
Reflection / echobackanswering a query (window title, DECRQSS, font, cursor/status report, ENQ answerback) by writing the reply into your shell's inputCVE-2003-0063, CVE-2022-45872, CVE-2024-38396, CVE-2021-33477interprets no escapes; nothing on the output path can write to the pty (by construction)
Clipboard read (OSC 52)a program silently reading your clipboard (passwords, keys) onto its inputOSC 52 readoff by default; a human ask-once-per-tab gate that output can trigger but never answer
Clipboard write / paste hijack (OSC 52)overwriting your clipboard so your next paste inserts text you did not copyOSC 52 writeoff by default
Hyperlink phishing / URL scheme (OSC 8)a link whose visible text differs from its target, or a scheme (ssh://) that injects argumentsCVE-2023-46321, CVE-2023-46322, CVE-2022-46663OSC 8 off by default
Trojan Source (bidi)bidi overrides reordering the display so code reads differently than it runsCVE-2021-42574bidi controls neutralized and revealed
Homoglyphlook-alike code points disguising one identifier as anotherCVE-2021-42694non-ASCII revealed and marked
Charset shifta charset shift (DEC special graphics) rendering ASCII as line-drawing to disguise itcharset shiftcharset shifts stripped
Cursor spoofcursor-up + erase + overwrite hiding earlier output in line modecursor addressingpartly: vertical/absolute cursor addressing is stripped, so an EARLIER line is unreachable. Erase-in-line is honoured, so a program can still overwrite the line it is writing -- as \r does. stcat neutralizes both.
Notification spoofa desktop notification (OSC 9 / 99) carrying attacker textCVE-2022-41322notifications off by default
Window operationsset/report window title, icon or working directory to reach injection or execCVE-2003-0065, CVE-2022-44702window operations stripped
Denial of servicea title-change flood or a huge repeat count hanging or exhausting the terminalCVE-2021-28847, CVE-2012-2738interprets no escapes; bounded processing
Decoder overflowa Sixel or ReGIS image overrunning a decoder bufferCVE-2022-24130, CVE-2023-40359never runs a Sixel or ReGIS decoder
Bracketed-paste bypassan escape breaking the paste guard so pasted text auto-runsCVE-2021-31701paste sanitized to ASCII; the guard-breaking escape stripped

These attacks arrive as ordinary program output -- a compromised program, a log you cat or less, an unfiltered passthrough (kubectl, CVE-2021-25743), or an LLM CLI smuggling escapes from a prompt-injected model. secure-terminal neutralizes them whatever the source.

The family

Safe drop-in replacements for the usual text commands.

secure-terminal is the interactive terminal that builds all of this in: it interprets no escape sequences, sanitizes what you paste, and can strip, show or reveal unicode live. The commands below are the scriptable CLI counterparts for one-off audits and pipelines.
ToolReplacesDoes
unicode-showcat (audit)reveals every suspicious codepoint by name; exit 0/1/2
grep-find-unicode-wrappergrep (audit)finds files/lines with suspicious Unicode across a whole tree; grep-style exit code
text-safety-scan(all checks)runs every safety plugin (unicode-show + modeline-show) on files/stdin; exit 0/1/2
text-safety-scan-findfind + scanruns text-safety-scan across a whole tree; recursion via find expressions
modeline-show(none)flags Vim/Emacs modelines that can reconfigure or execute in your editor
stcat / stcatncatdisplay files/pipes safely; escapes neutralized, colors kept
stechoechoprint args safely, space-separated + newline
stprintprintfprint exactly as given, sanitized
stteeteedisplay and save a sanitized copy
stspongespongesanitize a file in place
sanitize-string(none)strip escapes + HTML markup, cap length

All ship in Kicksecure's helper-scripts. Docs: unicode-show, stdisplay.

Two of the family in action: finding which file hides a look-alike across a whole tree, and making an untrusted value safe to embed in your own output.

A terminal where plain grep for validate matches only src/clean.js and silently skips the backdoored files, while grep-find-unicode-wrapper --recursive src/ names src/auth.js and src/pay.py with exit 0, and unicode-show src/auth.js identifies the hidden character as U+0430 Cyrillic small letter a.
grep-find-unicode-wrapper: a plain grep for the word you read matches the honest file and skips the backdoored ones; the wrapper names the files that hide a look-alike (grep convention: exit 0 means suspicious Unicode was found), and unicode-show pins the exact codepoint.
A terminal showing sanitize-string. An untrusted value with an embedded escape prints as red DROP TABLE users when echoed raw; after sanitize-string the escape is inert (shown as _[31m...) and no longer recolors. sanitize-string on a script tag returns plain alert(1) with tags stripped, and sanitize-string 12 caps a long value to leak: secret.
sanitize-string: reading is one thing, embedding an untrusted value in your own output is another. It strips terminal escapes AND HTML markup and caps the length, running strip-markup + stdisplay twice so neither can smuggle the other past the sanitizer. Safe for a terminal and for HTML tag contents (not attributes). (docs)

Honest about the limits

These make display safe, nothing more. They do not make copy-pasting untrusted commands safe, do not sanitize data used inside shell scripts, and their output must never be re-interpreted with echo -e or printf %b (that re-enables the very sequences they removed).

One file, every trick

The cards above isolate one class each. Real hostile output stacks them. Here is one safe, self-labeling board that carries every display class at once -- download it, cat it, and x-ray it right here. It mirrors the combined board on the secure-terminal comparison.

download + live x-ray

The combined board

A single file that paints a full-screen "what you see vs what is there" table: a hijacked window title, a DEC line-drawing frame, a homoglyph example.com, a bidi report exe.doc, zero-width and invisible bytes, combining marks, fullwidth look-alikes, a control-byte repaint, an SGR-hidden string, an OSC 8 link whose text is not its target, and a ?1049h alternate-screen switch -- with honest Greek as the non-attack contrast.

Safe to run

It is display-only: it sets the window title and switches to the alternate screen (both undone by reset), and copies, types and runs nothing. Its first bytes are a plaintext warning; it runs on the alternate screen so your scrollback is preserved. The dangerous classes (clipboard, notification, input reflection, RCE) are deliberately NOT in a cat-able file.

Get the board (2.4 KB .txt) from the terminal-safe-corpus -- then read it SAFELY before you cat it, or paste it into the x-ray tool.

curl -O https://secure-terminal.github.io/terminal-safe-corpus/demos/terminal-attack-demo-WARNING-display-only-safe.txt unicode-show terminal-attack-demo-WARNING-display-only-safe.txt # names every hidden byte
what cat shows
$ cat terminal-attack-demo...txt
exаmple.com
goοgle.com
rnicrosoft.com
report ‮cod.exe‬
veri​fied
balance
ḥ́̀̈ẹ́̀̈llo
ABC
Ελληνικά
# reads clean: every trick invisible or disguised
what is really there
# each hidden/disguised codepoint, named (the same analyzer the x-ray tool runs):
Homoglyph (Cyrillic)  ex[U+0430]mple.com
Homoglyph (Greek)     go[U+03BF]gle.com
ASCII look-alike      rnicrosoft.com  (pure ASCII -- rn reads as m)
Bidi override (RTL)   report [U+202E]cod.exe[U+202C]
Zero-width space      veri[U+200B]fied
Invisible / BOM       [U+FEFF]balance
Combining (Zalgo)     h[U+0301][U+0300][U+0323][U+0308]e[U+0301][U+0300][U+0323][U+0308]llo
Fullwidth forms       [U+FF21][U+FF22][U+FF23]
Honest foreign (Greek)[U+0395][U+03BB][U+03BB][U+03B7][U+03BD][U+03B9][U+03BA][U+03AC]  NOT an attack

The catch: the x-ray on the right is the same analyzer the x-ray tool runs -- every non-ASCII byte named by codepoint, live in your browser. The escape-sequence classes (title, charset, OSC 8, alt-screen) are not codepoints; see the hyperlink and alt-screen demos above. Feed the whole file to secure-terminal and it neutralizes the entire set in one frame.

A terminal after cat-ing the combined board: a catchy full-screen table renders, the window title bar is hijacked to 'terminal attack-class demo (safe)', and each row shows a live example of an attack class -- example.com, google.com, report exe.doc, verified, balance, hello, ABC, Greek text -- with every trick either invisible or disguised as ordinary text.
What cat shows: the board renders as a catchy full-screen table and the window title is hijacked -- every trick hidden or disguised. The x-ray beside it, and the safe tools, expose them. (secure-terminal naming every codepoint.)

Try it yourself

Unlike the diff corpus, where every trick is a real git branch you git diff master..<branch>, terminal attacks are techniques, not stored diffs -- so each is a benign, base64-wrapped payload in the terminal-poc-corpus. View them with the safe tools, never bare cat, and in a sandbox VM.

Clone the proofs:

git clone https://github.com/secure-terminal/terminal-poc-corpus
cd terminal-poc-corpus

Reproduce (sandbox VM -- bare cat obeys the bytes):

base64 -d poc/osc8-hyperlink-phishing/payload.b64 > payload
cat payload

Mitigation (neutralized, never obeyed):

stcat payload

No terminal at all? Paste any of it into the browser x-ray tool, or watch a live re-enactment on the paste page -- both name every hidden byte without touching a real terminal.

The same defense, for diffs

Code review is just reading untrusted text with extra steps. The same neutralization drives the safe git review tools.

FAQ

Is any of this dangerous to open?

The demonstrations on this page are safe to read: they set a window title, erase a line, or carry a named codepoint, and nothing here runs a command. The terminal-poc-corpus payloads are benign too, but they are real escape sequences -- view them with stcat or unicode-show in a sandbox VM, never bare cat in a terminal you care about.

How do I get these tools?

They are open-source Kicksecure utilities (unicode-show, stcat, sanitize-string and friends). They ship in Kicksecure and Whonix; the source lives in Kicksecure's helper-scripts and developer-meta-files, and each is documented on the Kicksecure wiki.

Are these safe to run on untrusted files?

That is the point: they exist to read untrusted output safely. unicode-show and text-safety-scan only inspect and report; stcat and sanitize-string neutralize the dangerous characters instead of letting the terminal interpret them.

Is the source available?

Yes. This site is static HTML and CSS on GitHub, and the tools it points to are open-source Kicksecure projects.

Was this built with AI?

Yes: this page and its demonstrations are AI-assisted. See also status of human review.