Терминалы VT100 (которые все эмуляторы современных терминалов эмулируют в некоторой степени) поддерживают ряд проблемных команд, но современные эмуляторы или дистрибутивы отключают более проблемные и менее полезные. Вот неполный список потенциально опасных escape-последовательностей (не считая тех, которые просто делают отображение каким-то образом нечитаемым):
- Произвольные команды файла журнала в rxvt и Eterm, о которых сообщил HD Moore . Это действительно серьезные ошибки, к счастью, исправленные.
- Команда answerback, также известная как Return Terminal Status, вызывается
ENQ
( Ctrl+E
). Это вставляет текст в терминал, как если бы пользователь его набрал. Однако этот текст не находится под контролем злоумышленника: это собственное имя терминала, обычно что-то вроде xterm
или screen
. В моей системе (Debian squeeze) xterm возвращает пустую строку по умолчанию (это контролируется answerbackString
ресурсом).
- Команды отправки устройства
ESC [ c
и друзья. Терминал отвечает ESC [ … c
(где …
может содержать только цифры и знаки препинания ASCII). Это способ запроса некоторых возможностей терминала, в основном устаревших, но, возможно, используемых старыми приложениями. Опять же, ответ терминала неотличим от пользовательского ввода, но он не находится под контролем атакующего. Последовательность управления может выглядеть как функциональная клавиша, но только если пользователь имеет необычную конфигурацию (ни одна из обычных настроек, с которыми я столкнулся, не имеет допустимой управляющей последовательности функциональной клавиши, которая является префиксом отклика терминала).
- Различные функции управления устройством (DCS сбрасывается, начиная с
ESC P
).
- Я не знаю, какой вред можно нанести
DECUDK
(установить пользовательские ключи) на типичном эмуляторе терминала.
DECRQSS
(Строка состояния запроса) - это еще одна команда, на которую терминал отвечает escape-последовательностью, на этот раз начинающейся с \eP
; это может быть проблематично, так как \eP
является допустимым ключом ( Alt+ Shift+ P).
- Xterm имеет еще две экспериментальные функции:
ESC P + p …
и ESC P + q …
, чтобы получить и установить строки termcap. Из описания это может быть использовано, по крайней мере, для изменения эффекта функциональных клавиш.
- Несколько команд отчета о состоянии:
ESC [ … n
(Отчет о состоянии устройства). Терминал отвечает escape-последовательностью. Большинство из этих escape-последовательностей не соответствуют escape-последовательностям функциональных клавиш. Один из них выглядит проблематичным: отчет ESC [ 6 n
имеет форму, где и представляют собой последовательности цифр, и это может выглядеть с некоторыми модификаторами.ESC [ x ; y R
x
y
F3
- Команды управления окнами
ESC [ … t
.
- Некоторые из них позволяют изменить размер окна xterm, сделать его пиктограмму и т. Д., Что является разрушительным.
- Некоторые из них заставляют терминал отвечать либо escape-последовательностью. Большинство из этих escape-последовательностей выглядят с низким уровнем риска, однако есть две опасные команды: ответы на них
ESC [ 2 0 t
и, ESC [ 2 1 t
соответственно, метка значка и заголовок окна терминала, и злоумышленник может выбрать их.
- По крайней мере, в Debian squeeze xterm по умолчанию игнорирует эти команды; они могут быть включены путем установки
allowWindowOps
ресурса или выборочно через disallowedWindowOps
ресурс. Gnome-терминал под Ubuntu 10.04 по умолчанию реализует даже ответные реакции заголовков. Я не проверял другие терминалы или версии.
- Команды для установки заголовка терминала или имени иконки. Под xterm и большинством других X-терминалов они есть . Под экраном, последовательность побег . Я считаю, что беспокойство по поводу этих команд переоценено. Хотя они допускают некоторое количество вреда, любая веб-страница имеет такую же проблему. Работа с окном, основанным исключительно на его названии, а не на его классе, сродни открытию файла, имя которого было дано вам ненадежной стороной, или не цитированию расширения переменной в сценарии оболочки, или похлопыванию бешеной собаки по носу. - не жалуйся, если тебя укусят.
ESC ] digit ; title ESC \
ESC k title ESC \
Я нахожу ответ Лакина неискренним. Такое ощущение, что он либо пытается свалить вину, либо в нацистском режиме безопасности (любое соображение безопасности, подлинное или нет, оправдывает «черную игру»).
Целесообразность терминального ответа-побега в целом подвергается сомнению через регулярные промежутки времени, но все же ни одна из основных программ эмуляции терминала не сочла нужным отказаться от этих последовательностей, вероятно, в ошибочной попытке совместимости с более не используемой технологией 1970-х годов. (…)
Вместо того, чтобы обвинять любые и все программы, которые пишут файлы журналов, было бы намного более продуктивно, с точки зрения безопасности, заставить программы эмуляции терминала перестать делать глупости и, таким образом, исправить эту и другие проблемы безопасности один раз и для всех.
Многие из ответных ответов являются полезными функциями: приложение должно знать такие вещи, как положение курсора и размер окна. Установка заголовка окна также очень полезна. Можно было бы полностью полагаться на их ioctl
вызовы, однако это потребовало бы дополнительного кода и утилит для выполнения этих ioctl
вызовов и преобразования их в текст в стиле Unix, передавая дескрипторы файлов. Изменение этих интерфейсов сейчас будет большой работой, но с небольшой выгодой.
Текстовые файлы не должны содержать непечатаемых символов, таких как управляющие символы. Файлы журнала, как правило, должны быть текстовыми файлами. Файлы журнала не должны содержать управляющих символов.
Если вас беспокоит, что файл может содержать escape-последовательности, откройте его в редакторе или просмотрите его less
без параметра -r
или -R
, или просмотрите его cat -v
.