Как избежать атак escape-последовательности в терминалах?

29

Читая подробности о CVE-2009-4487 (что касается опасности escape-последовательностей в лог-файлах), я немного удивлен.

Цитировать CVE-2009-4487 :

nginx 0.7.64 записывает данные в файл журнала без очистки непечатаемых символов, что может позволить удалённым злоумышленникам изменить заголовок окна или выполнить произвольные команды или перезаписать файлы через HTTP-запрос, содержащий escape-последовательность для эмулятора терминала.

Понятно, что дело не в дыре в безопасности в nginx, а в эмуляторах терминала.

Конечно, возможно, что catзагрузка файла журнала в терминал происходит только случайно, но grepиспользование файла журнала является довольно распространенным явлением. lessвозможно, дезинфицирует escape-последовательности, но кто знает, какие команды оболочки не изменяют escape-последовательности ...

Я склонен согласиться с ответом лака :

Целесообразность терминального ответа-побега в целом ставилась под сомнение через регулярные промежутки времени, но все же ни одна из основных программ эмуляции терминала не сочла нужным отказаться от этих последовательностей, вероятно, в ошибочной попытке совместимости с более не используемой технологией 1970-х годов. [..] Вместо того, чтобы обвинять любые и все программы, которые пишут лог-файлы, было бы намного более продуктивно, с точки зрения безопасности, заставить программы эмуляции терминала перестать делать глупости и, таким образом, однажды исправить эту и другие проблемы безопасности. и для всех.

Таким образом мои вопросы:

Как я могу защитить свой xterm, чтобы больше нельзя было выполнять команды или перезаписывать файлы через escape-последовательности?

Какие эмуляторы терминала для X защищены от этой атаки?

maxschlepzig
источник
4
Многие escape-последовательности делают законные вещи (переименовывают / изменяют размер / и т. Д. Xterm). Но может ли кто-нибудь определить escape-последовательности, которые выполняют команды или перезаписывают файлы ?
Крубо
Аналогичная проблема, связанная с атаками paste-control-chars-from-web-browser на Security SE: как я могу защитить себя от такого рода злоупотреблений буфером обмена? tl; dr: если вы используете терминал на базе xterm / vte, выпущенный после 2013/2015, вы защищены от этого, поскольку по умолчанию они отфильтровывают управляющие символы.
maxschlepzig

Ответы:

27

Терминалы 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 RxyF3
  • Команды управления окнами 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.

Жиль "ТАК - перестань быть злым"
источник
2
«Можно было бы полностью полагаться на эти вызовы ioctl». Но что, если между приложением и терминалом действительно есть последовательный кабель?
mmv-ru
5

Это не так просто; У многих людей есть код для установки xtermзаголовка как части приглашения или чего-то подобного, и по очень веским причинам (как shutdownможет сказать любой, кто не на той машине из неправильного окна терминала!). Поэтому для правильного исправления необходимо ввести контексты безопасности и тем самым серьезно усложнить взаимодействие между оболочками и эмуляторами терминалов, а также, возможно, и точечными файлами людей. Или вы можете использовать низкую арендную плату для очистки всего, что может отображаться в терминале; это в значительной степени сводится к экранированию управляющих символов, что, вероятно, следует сделать в любом случае, просто чтобы выделить их (поскольку в файле журнала они могут указывать на того, кто пытается ввести шелл-код).

(Кроме того, punycode - более серьезный пример того же рода проблемы - и тем не менее он стал официальным стандартом. Иногда безопасность сводится к смягчению небезопасных конструкций, которые находятся вне контроля.)

geekosaur
источник
1
Термин x может позволить изменить заголовок с помощью escape-последовательностей, но не позволяет перезаписывать файлы и выполнять произвольные команды с помощью escape-последовательностей. Это было бы шагом вперед, не так ли?
maxschlepzig
1
Прямые способы сделать это были отключены в течение многих лет. Косвенные пути все еще остаются, хотя они, по крайней мере, требуют дополнительного шага (например, атака социальной инженерии, чтобы заставить пользователя вызвать перепрограммированную функциональную клавишу). Но строка заголовка была специально названа в CVE, предположительно как часть атаки, которая вводит пользователя в заблуждение, когда он что-то делает не в том месте. Самое большое современное беспокойство - это то, что можно запрограммировать так, чтобы он отправлял произвольный текст в оболочку, и ответные реакции, позволяющие злоумышленнику выяснить, для чего можно сделать эмулятор терминала ...
geekosaur
... но это, темпы Varnish, почти наверняка все еще используются в больших коммерческих средах, где программное обеспечение минимально портировано, и для внесения соответствующих изменений требуется гораздо больше, чем просто потянув зубы.
geekosaur