Исследователь смог превратить «cat readme.txt» в выполнение произвольного кода в iTerm2

5 мин
Исследователь смог превратить «cat readme.txt» в выполнение произвольного кода в iTerm2

Исследователь представил, как он преобразовал команду "cat readme.txt" для выполнения произвольного кода в эмуляторе iTerm2. Он показал, как iTerm2 работает с легитимной функцией, как он использует псевдотерминал (PTY) и что происходит, когда вывод терминала может имитировать одну из сторон протокола этой функции.

Команда cat readme.txt в операционных системах Linux, macOS и других Unix-подобных используется для вывода содержимого текстового файла readme.txt на монитор или в терминал.

iTerm2 — это популярный бесплатный эмулятор терминала с открытым исходным кодом для macOS, работающий на macOS 12.4 или новее. Он считается продвинутой заменой стандартному Terminal.app, предлагая разработчикам и системным администраторам улучшенный интерфейс, высокую производительность, разделение экрана, поиск и широкие возможности кастомизации (темы, прозрачность, горячие клавиши).

Исследователь отметил, что он сотрудничал с OpenAI в этом проекте.

По его словам, iTerm2 имеет функцию интеграции с SSH, которая позволяет лучше понимать удалённые сессии. Для этого он не просто «вслепую вводит команды» в удалённую оболочку, а запускает маленький вспомогательный скрипт на удалённой стороне, называемый «дирижёром».

Примерная схема выглядит следующим образом:

  1. iTerm2 запускает интеграцию SSH, обычно через it2ssh;

  2. iTerm2 отправляет удалённый скрипт начальной загрузки, «кондуктор», через существующую сессию SSH;

  3. скрипт становится одноранговым узлом протокола для iTerm2;

  4. iTerm2 и удалённый скрипт обмениваются управляющими последовательностями терминала для координации таких действий, как обнаружение оболочки входа в систему, проверка наличия Python, смена каталогов, загрузка файлов и выполнение команд.

Исследователь отмечает, что отдельной сетевой службы нет. Эмулятор терминала, такой как iTerm2, работает как программная релиз, отображает монитор, принимает ввод с клавиатуры и интерпретирует управляющие последовательности терминала. При этом оболочка и другие программы командной строки по-прежнему ожидают взаимодействия с подобием настоящего терминального устройства. Именно следовательно ОС предоставляет PTY, или псевдотерминал. PTY — это программный аналог старого аппаратного терминала, и он находится между эмулятором терминала и процессом переднего плана.

В обычной сессии SSH:

  • iTerm2 записывает байты в PTY;

  • процесс переднего плана — ssh;

  • ssh пересылает эти байты на удаленную машину;

  • удалённый контроллер считывает их из стандартного ввода.

Итак, когда iTerm2 хочет отправить команду удалённому скрипту, он практически локально записывает байты в PTY.

Протокол интеграции SSH использует управляющие последовательности терминала в качестве транспортного протокола.

Здесь важны два момента:

  • DCS 2000p используется для перехвата SSH-проводника;

  • OSC 135 используется для сообщений проводника до кадра.

На уровне исходного кода DCS 2000p заставляет iTerm2 создать экземпляр парсера проводника. Затем парсер принимает сообщения OSC 135, такие как:

  • begin <id>

  • command output lines

  • end <id> <status> r

  • unhook

Итак, легитимный удалённый проводник может взаимодействовать с iTerm2 исключительно через вывод терминала.

Сбой заключается в нарушении доверия, когда iTerm2 принимает протокол SSH-проводника из вывода терминала, который на самом деле не исходит от доверенной, реальной сессии. Другими словами, ненадёжный вывод терминала может имитировать удалённого проводника.

Это означает, что вредоносный файл, ответ сервера, баннер или MOTD могут вывести:

  • поддельный хук DCS 2000p;

  • поддельные ответы OSC 135.

Тогда iTerm2 начнет вести себя так, как будто он находится в ходе реального обмена данными через SSH. 

Файл эксплойта содержит поддельную стенограмму Conductor. Когда жертва запускает "cat readme.txt", iTerm2 отображает файл, но тот содержит не просто текст, а поддельную строку DCS 2000p, объявляющую о сеансе Conductor, и поддельные сообщения OSC 135, отвечающие на запросы iTerm2.

Как только хук принят, iTerm2 запускает свой обычный рабочий процесс Conductor. В исходном коде Conductor.start() немедленно отправляет getshell(), а после успешного выполнения этого вызова отправляет pythonversion().

Итак, эксплойту не нужно внедрять эти запросы. iTerm2 отправляет их самостоятельно, и вредоносному выводу достаточно лишь имитировать ответы.

Поддельные сообщения OSC 135:

  • начинают выполнение команды getshell;

  • возвращают строки, похожие на вывод shell-discovery;

  • успешно завершают эту команду;

  • начинают выполнение команды pythonversion;

  • завершают эту команду с ошибкой;

  • отключают перехватчик.

Этого достаточно, чтобы заставить iTerm2 перейти к обычному резервному пути. На этом этапе терминал полагает, что завершил достаточную часть процесса интеграции SSH, чтобы перейти к следующему шагу: созданию и отправке команды run(...).

Поддельный перехватчик DCS 2000p содержит несколько полей, включая управляемый злоумышленником sshargs. Это значение важно, потому что iTerm2 позже использует его в качестве материала команды при формировании запроса run(...) от conductor.

Эксплойт выбирает sshargs итак, что при кодировании iTerm2 в base64:

run <padding><magic-bytes>

новейший 128-байтовый фрагмент становится:

ace/c+aliFIo

Строка одновременно является действительным выводом из пути кодирования кондуктора и действительным относительным путём.

В легитимной сессии интеграции SSH iTerm2 записывает команды кондуктора в кодировке base64 в PTY, а ssh пересылает их удалённому скрипту. В случае эксплуатации уязвимости iTerm2 по-прежнему записывает эти команды в PTY, но реального SSH-дирижёра нет. Локальная оболочка получает их как обычный ввод.

Вот почему сессия при записи выглядит так:

  • getshell отображается как base64;

  • pythonversion отображается как base64;

  • появляется закодированная в base64 run(...) полезная нагрузка;

  • последний фрагмент — ace/c+aliFIo.

Более ранние фрагменты завершаются с ошибкой как бессмысленные команды. Последний фрагмент работает, если этот путь существует локально и является исполняемым.

Чтобы воспроизвести оригинальный PoC на основе файлов, можно применить genpoc.py:

python3 genpoc.py

unzip poc.zip

cat readme.txt

Это создаст:

  • ace/c+aliFIo, исполняемый вспомогательный сценарий;

  • readme.txt, файл, содержащий вредоносные последовательности DCS 2000p и OSC 135.

Первый обманывает iTerm2, заставляя его взаимодействовать с поддельным дирижёром. Второй предоставляет оболочке фактический объект для выполнения после получения финального фрагмента кода.

Для работы эксплойта нужно запустить cat readme.txt из каталога, содержащего ace/c+aliFIo, чтобы финальный фрагмент кода, созданный злоумышленником, указывал на реальный путь к исполняемому файлу.

В конце марта исследователь сообщил об ошибке в iTerm2, и её исправили на второй день ​​в коммите a9e745993c2e2cbb30b884a16617cd5495899f86. Тем не менее пока исправление ещё не вошло в стабильные релизы.

В сентябре был представлен публике первый бета‑выпуск утилиты Term.Everything, который даёт возможность отображать любые графические приложения внутри окна с эмулятором терминала. Равным образом решение даёт возможность запускать графические приложения в терминале при доступе к удалённой системе по SSH. На терминалах, поддерживающих расширение для вывода растровой графики, таких как kitty, Ghostty, Konsole, wezterm и iTerm2, вывод почти не отличим от открытия в обычном окне.

Читают сейчас

Профсоюз американских актёров SAG‑AFTRA заключил с киностудиями контракт для защиты от ИИ

1 час назад

Профсоюз американских актёров SAG‑AFTRA заключил с киностудиями контракт для защиты от ИИ

Американский профсоюз актёров кино и сериалов SAG‑AFTRA согласовал условия нового контракта с голивудскими студиями и стриминговыми сервисами. Контракт рассчитан на четыре года, в него включены, в доп

После 50 лет поисков астрономы зафиксировали звёздный ветер, дующий от Стрельца А* в центре Галактики

1 час назад

После 50 лет поисков астрономы зафиксировали звёздный ветер, дующий от Стрельца А* в центре Галактики

50 лет назад учёные выдвинули гипотезу, что чёрные дыры не только поглощают материю, но и излучают потоки газа и плазмы, которые разгоняются излучением разогретого аккреционного диска. Этот диск предс

Microsoft хотела сделать людей «зависимыми» от ИИ-агента Scout — а CEO отрекся от стратегии своих вице-президентов

2 часа назад

Microsoft хотела сделать людей «зависимыми» от ИИ-агента Scout — а CEO отрекся от стратегии своих вице-президентов

Microsoft представила на конференции Build 2 июня ИИ-агента Scout — встроенного в Microsoft 365 ассистента, который активен 24/7. В тот же день издание 404 Media опубликовало утекший внутренний докуме

BMX выпустила портативные зарядки с полутвердотельными батареями

7 часов назад

BMX выпустила портативные зарядки с полутвердотельными батареями

Сингапурская компания BMX объявила о выпуске линейки магнитных портативных зарядных устройств SolidSafe с полутвердотельными батареями. Они будут стоить от $59. Ознакомиться далее

После аварии ракеты New Glenn стартовало обсуждение безопасного периметра вокруг космодромов

8 часов назад

После аварии ракеты New Glenn стартовало обсуждение безопасного периметра вокруг космодромов

После взрыва тяжёлой ракеты New Glenn компании Blue Origin стало понятно, что восстановление уничтоженной стартовой площадки займёт множество месяцев. Теперь эксперты оценивают возможности расширения