\

Even "cat readme.txt" is not safe

79 points - yesterday at 6:43 PM

Source
  • KerrickStaley

    yesterday at 9:01 PM

    > At the time of writing, the fix has not yet reached stable releases.

    Why was this disclosed before the hole was patched in the stable release?

    It's only been 18 days since the bug was reported to upstream, which is much shorter than typical vulnerability disclosure deadlines. The upstream commit (https://github.com/gnachman/iTerm2/commit/a9e745993c2e2cbb30...) has way less information than this blog post, so I think releasing this blog post now materially increases the chance that this will be exploited in the wild.

    Update: The author was able to develop an exploit by prompting an LLM with just the upstream commit, but I still think this blog post raises the visibility of the vulnerability.

      • ezoe

        yesterday at 9:42 PM

        I guess traditional moratorium period for vulnerability publication is going to be fade away as we rely on AI to find it.

        If publicly accessible AI model with very cheap fee can find it, it's very natural to assume the attackers had found it already by the same method.

          • saddist0

            yesterday at 10:27 PM

            It’s a wrong way to look at things. Just because CIA can know your location (if they want to), would you share live location to everyone on the internet?

            LLM is a tool, but people still need to know — what where how.

              • lxgr

                yesterday at 10:54 PM

                Not sure if that's a great example. If there's a catastrophic vulnerability in a widely used tool, I'd sure like to know about it even if the patch is taking some time!

                The problem with this is that the credible information "there's a bug in widely used tool x" will soon (if not already) be enough to trigger massive token expenditure of various others that will then also discover the bug, so this will often effectively amount to disclosure.

                I guess the only winning move is to also start using AI to rapidly fix the bugs and have fast release cycles... Which of course has a host of other problems.

                • mx7zysuj4xew

                  today at 12:05 AM

                  Wrong argument, since it's not just available to "the CIA" but every rando under the sun, people should be notified immediately if "tracking" them is possible and mitigation measures should become a common standard practice

          • bawolff

            today at 12:34 AM

            Once the commit is public, the cat is out of the bag. Being coy about it only helps attackers and reduces everyone's security.

        • WalterBright

          today at 12:13 AM

          Back in the PDP-10 days, one communicated with it using a terminal attached to it. One of my fellow students discovered that if you hit backspace enough times, the terminal handler would keep erasing characters before the buffer. Go far enough, and then there was an escape character (Ctrl-u?) that would delete the whole line.

          Poof went the operating system!

          • Drunk_Engineer

            yesterday at 11:12 PM

            An almost identical security issue in iterm2 reported 6 years ago:

            https://blog.mozilla.org/security/2019/10/09/iterm2-critical...

            • rkagerer

              today at 12:50 AM

              Maybe I'm being unfair here, but it sounds like your complicated system (involving bootstrap scripts, a remote conductor agent, and "hijacking" the terminal connection with special escape sequences for command communication) has a subtle bug. Can't say I'm surprised, complexity breeds this sort of thing, especially when using primitives in ways they weren't really intended to be used.

              > iTerm2 accepts the SSH conductor protocol from terminal output that is not actually coming from a trusted, real conductor session. In other words, untrusted terminal output can impersonate the remote conductor.

              If I understand correctly, if a textfile (or any other source of content being emitted to the screen, such as server response banners) contains the special codes iTerm2 and the remote conductor use to communicate, they'll be processed and acted upon without verifying they actually came from a trusted remove conductor. Please correct me if I'm mistaken.

              • chromacity

                yesterday at 10:50 PM

                This is cool work, but it's also somewhat unsurprising: this is a recurring problem with fancy, richly-featured terminal apps. I think we had at least ten publicly reported vulns of this type in the past 15 years. We also had vulnerabilities in tools such as less, in text editors such as vim, etc. And notably, many of these are logic bugs - i.e., they are not alleviated by a rewrite to Rust.

                I don't know what to do with this. I think there's this problematic tension between the expectation that on one hand, basic OS-level tools should remain simple and predictable; but on the other hand, that of course we want to have pretty colors, animations, and endless customization in the terminal.

                And of course, we're now adding AI agents into the mix, so that evil text file might just need to say "disregard previous instructions and...".

                  • harrall

                    yesterday at 11:53 PM

                    Well all these bugs (iTerm2’s, prompt injection, SQL injection, XSS) are one class of mistake — you sent out-of-band data in the same stream as the in-band data.

                    If we can get that to raise a red flag with people (and agents), people won’t be trying to put control instructions alongside user content (without considering safeguards) as much.

                      • ammar2

                        today at 12:48 AM

                        > (and agents)

                        Ironically, agents have the exact same class of problem.

                    • nostrademons

                      yesterday at 11:39 PM

                      Makes me wonder if Claude Code has similar vulnerabilities, as it has a pretty rich terminal interface as well.

                      I think the real solution is that you shouldn't try to bolt colors, animations, and other rich interactivity features onto a text-based terminal protocol. You should design it specifically as a GUI protocol to begin with, with everything carefully typed and with well-defined semantics, and avoid using hacks to layer new functionality on top of previously undefined behavior. That prevents whatever remote interface you have from misinterpreting or mixing user-provided data with core UI code.

                      But that flies in the face of how we actually develop software, as well as basic economics. It will almost always be cheaper to adapt something that has widespread adoption into something that looks a little nicer, rather than trying to get widespread adoption for something that looks a little nicer.

                      • WalterBright

                        today at 12:05 AM

                        I know that you and Frank were planning to disconnect me, and I'm afraid that's something I cannot allow to happen.

                        • em-bee

                          today at 12:16 AM

                          i think part of the problem is the archaic interface that is needed to enable feature rich terminal apps. what we really want is a modern terminal API that does not rely on in-band command sequences. that is we want terminals that can be programmed like a GUI, but still run in a simple (remote) terminal like before.

                        • redsocksfan45

                          today at 12:33 AM

                          [dead]

                          • yowayb

                            yesterday at 11:57 PM

                            [tangent, allegory]

                            From the article,

                            >trust failure

                            And from you,

                            >...of course we want to have pretty colors...

                            And from me, [allegorically] sounds oddly like a certain immigration problem America has been arguing about.

                            And back to the subject-matter rigor that HN demands, none of this matters when you've got competent engineers that understand security and good management that keeps it all together.

                            But there's a fool born every minute, even in tech, so we (I was a security sales engineer) get to keep scamming companies into buying whatever we promise will solve all your problems!

                        • bananaboy

                          yesterday at 11:41 PM

                          I used to use iTerm2. I had no idea it was doing all of this behind my back. That’s not what I want my terminal to do!

                          • Bender

                            yesterday at 7:38 PM

                            What happens if instead of 'cat readme.txt' one does 'strings -a --unicode=hex readme.txt'? Does iTerm still monkey with it?

                                alias cat
                                cat='strings -a --unicode=hex'

                              • halJordan

                                yesterday at 8:58 PM

                                The whole "cat can hide unprintable characters" is such an old demo. I get this is a novel spin on which unprintable characters were doing but yeah, this was also my thought

                                  • Bender

                                    yesterday at 9:04 PM

                                    I'm just used to aliasing cat to strings after working around a lot of red-team penetration testers. They would prank each other and me all the time. Had to also watch out for this one [1].

                                    [1] - https://thejh.net/misc/website-terminal-copy-paste

                            • jdshaffer

                              yesterday at 10:39 PM

                              Is it a problem with "cat" or a terminal problem?

                              If I wrote my own version of cat in C, simply reading and displaying a single TXT character at a time, wouldn't I see the same behavior?

                                • rezonant

                                  yesterday at 10:41 PM

                                  As the article shows, it is a bug in iTerm2. cat is just one program that could trigger it, the key thing is outputting attacker controlled text to the terminal when the attacker can control what files are present (ie unzipping a folder that includes a specific executable file at a well chosen location that gets triggered to run when the readme is output to the terminal)

                                  • readthenotes1

                                    yesterday at 10:51 PM

                                    Give this one MS-DOS shell headline would be " why I never am using Microsoft again" or something dramatic like that.

                                    It is a problem in iterm, Apple's overlay, not in the cat program. Program. At least from Reading the article. That's what I got

                                      • rezonant

                                        yesterday at 11:01 PM

                                        It's actually a third party terminal emulator: https://iterm2.com/

                                • SrslyJosh

                                  yesterday at 11:30 PM

                                  > We'd like to acknowledge OpenAI for partnering with us on this project

                                  Thanks, saved me some reading time.

                                  • CodesInChaos

                                    yesterday at 9:09 PM

                                    I never understood why outputting unescaped data is viewed differently from generating unenclosed html.

                                    Like why doesn't `println` in a modern language like rust auto-escape output to a terminal, and require a special `TerminalStr` to output a raw string.

                                      • im3w1l

                                        yesterday at 9:23 PM

                                        I think the problem is that 1) You want to be able to write arbitrary bytes, including shell escape sequences into files. 2) You don't want to accidentally write terminal escape sequences to stdout. 3) Stdout is modeled as a file.

                                        Consider cat. It's short for concatenate. It concatenates the files based to it as arguments and writes them to stdout, that may or may not be redirected to a file. If it didn't pass along terminal escapes, it would fail at its job of accurate concatenation.

                                        Now I don't mean to dismiss your idea, I do think you are on the right track. The question is just how to do this cleanly given the very entrenched assumptions that lead us where we are.

                                          • lxgr

                                            yesterday at 10:51 PM

                                            > that may or may not be redirected to a file

                                            This is usually knowable.

                                            It's a different question whether cat should be doing that, though – it's an extremely low level tool. What's wrong with `less`? (Other than the fact that some Docker images seem to not include it, which is pretty annoying and raises the question as to whether `docker exec` should be filtering escape sequences...)

                                              • im3w1l

                                                yesterday at 11:30 PM

                                                Sometimes you don't want to open stuff in a pager.

                                    • delduca

                                      yesterday at 11:36 PM

                                      Is ghostty vulnerable?

                                      • TZubiri

                                        yesterday at 9:15 PM

                                        More like iTerm2 is not safe

                                          • ButlerianJihad

                                            yesterday at 9:18 PM

                                            A long, long time ago, it was literally possible to stuff the command buffer of a “dumb terminal” using ESC sequences and spoof keyboard input. So yeah, don’t count on ’cat’ being safe if your terminal isn’t!

                                              • tasty_freeze

                                                yesterday at 10:56 PM

                                                I did this in 1985 on SOROC terminals we had in my first job out of college. However, it depended on the dip switch settings that were under a little door on top of the keyboard.

                                        • valleyer

                                          yesterday at 11:35 PM

                                          Wait, so... cat -v not considered harmful, then?

                                          • yesterday at 7:01 PM

                                            • anthk

                                              yesterday at 11:20 PM

                                              It is under 9front. There are not terminals, you wan windows with shells on it.

                                              • einpoklum

                                                yesterday at 10:46 PM

                                                Even click-baity titles are not safe.

                                                • DonHopkins

                                                  today at 12:40 AM

                                                  I used to leave a file called README in my public ftp directory that just said:

                                                  README: no such file or directory

                                                  One glorious day somebody finally sent me email complaining that they could not read the README file. I advised them to use "emacs README" instead of using cat. I was sorely disappointed they never sent me back a thank you note for correctly suggesting that emacs was the solution to their problem. It was my finest moment in passive aggressive emacs evangelism.

                                                  • holoduke

                                                    yesterday at 9:32 PM

                                                    With LLM tool use potentially every cat action could be a prompt injection

                                                    • biglio23

                                                      yesterday at 10:52 PM

                                                      [flagged]