Читая подробности о CVE-2009-4487 (что касается опасности escape-последовательностей в лог-файлах), я немного удивлен.
Цитировать CVE-2009-4487 :
nginx 0.7.64 записывает данные в файл журнала без очистки непечатаемых символов, что может позволить удалённым злоумышленникам изменить заголовок окна или выполнить произвольные команды или перезаписать файлы через HTTP-запрос, содержащий escape-последовательность для эмулятора терминала.
Понятно, что дело не в дыре в безопасности в nginx, а в эмуляторах терминала.
Конечно, возможно, что cat
загрузка файла журнала в терминал происходит только случайно, но grep
использование файла журнала является довольно распространенным явлением. less
возможно, дезинфицирует escape-последовательности, но кто знает, какие команды оболочки не изменяют escape-последовательности ...
Я склонен согласиться с ответом лака :
Целесообразность терминального ответа-побега в целом ставилась под сомнение через регулярные промежутки времени, но все же ни одна из основных программ эмуляции терминала не сочла нужным отказаться от этих последовательностей, вероятно, в ошибочной попытке совместимости с более не используемой технологией 1970-х годов. [..] Вместо того, чтобы обвинять любые и все программы, которые пишут лог-файлы, было бы намного более продуктивно, с точки зрения безопасности, заставить программы эмуляции терминала перестать делать глупости и, таким образом, однажды исправить эту и другие проблемы безопасности. и для всех.
Таким образом мои вопросы:
Как я могу защитить свой xterm, чтобы больше нельзя было выполнять команды или перезаписывать файлы через escape-последовательности?
Какие эмуляторы терминала для X защищены от этой атаки?
Ответы:
Терминалы VT100 (которые все эмуляторы современных терминалов эмулируют в некоторой степени) поддерживают ряд проблемных команд, но современные эмуляторы или дистрибутивы отключают более проблемные и менее полезные. Вот неполный список потенциально опасных escape-последовательностей (не считая тех, которые просто делают отображение каким-то образом нечитаемым):
ENQ
(Ctrl+E
). Это вставляет текст в терминал, как если бы пользователь его набрал. Однако этот текст не находится под контролем злоумышленника: это собственное имя терминала, обычно что-то вродеxterm
илиscreen
. В моей системе (Debian squeeze) xterm возвращает пустую строку по умолчанию (это контролируетсяanswerbackString
ресурсом).ESC [ c
и друзья. Терминал отвечаетESC [ … c
(где…
может содержать только цифры и знаки препинания ASCII). Это способ запроса некоторых возможностей терминала, в основном устаревших, но, возможно, используемых старыми приложениями. Опять же, ответ терминала неотличим от пользовательского ввода, но он не находится под контролем атакующего. Последовательность управления может выглядеть как функциональная клавиша, но только если пользователь имеет необычную конфигурацию (ни одна из обычных настроек, с которыми я столкнулся, не имеет допустимой управляющей последовательности функциональной клавиши, которая является префиксом отклика терминала).ESC P
).DECUDK
(установить пользовательские ключи) на типичном эмуляторе терминала.DECRQSS
(Строка состояния запроса) - это еще одна команда, на которую терминал отвечает escape-последовательностью, на этот раз начинающейся с\eP
; это может быть проблематично, так как\eP
является допустимым ключом ( Alt+ Shift+ P).ESC P + p …
иESC P + q …
, чтобы получить и установить строки termcap. Из описания это может быть использовано, по крайней мере, для изменения эффекта функциональных клавиш.ESC [ … n
(Отчет о состоянии устройства). Терминал отвечает escape-последовательностью. Большинство из этих escape-последовательностей не соответствуют escape-последовательностям функциональных клавиш. Один из них выглядит проблематичным: отчетESC [ 6 n
имеет форму, где и представляют собой последовательности цифр, и это может выглядеть с некоторыми модификаторами.ESC [ x ; y R
x
y
F3ESC [ … t
.ESC [ 2 0 t
и,ESC [ 2 1 t
соответственно, метка значка и заголовок окна терминала, и злоумышленник может выбрать их.allowWindowOps
ресурса или выборочно черезdisallowedWindowOps
ресурс. Gnome-терминал под Ubuntu 10.04 по умолчанию реализует даже ответные реакции заголовков. Я не проверял другие терминалы или версии.ESC ] digit ; title ESC \
ESC k title ESC \
Я нахожу ответ Лакина неискренним. Такое ощущение, что он либо пытается свалить вину, либо в нацистском режиме безопасности (любое соображение безопасности, подлинное или нет, оправдывает «черную игру»).
Многие из ответных ответов являются полезными функциями: приложение должно знать такие вещи, как положение курсора и размер окна. Установка заголовка окна также очень полезна. Можно было бы полностью полагаться на их
ioctl
вызовы, однако это потребовало бы дополнительного кода и утилит для выполнения этихioctl
вызовов и преобразования их в текст в стиле Unix, передавая дескрипторы файлов. Изменение этих интерфейсов сейчас будет большой работой, но с небольшой выгодой.Текстовые файлы не должны содержать непечатаемых символов, таких как управляющие символы. Файлы журнала, как правило, должны быть текстовыми файлами. Файлы журнала не должны содержать управляющих символов.
Если вас беспокоит, что файл может содержать escape-последовательности, откройте его в редакторе или просмотрите его
less
без параметра-r
или-R
, или просмотрите егоcat -v
.источник
Это не так просто; У многих людей есть код для установки
xterm
заголовка как части приглашения или чего-то подобного, и по очень веским причинам (какshutdown
может сказать любой, кто не на той машине из неправильного окна терминала!). Поэтому для правильного исправления необходимо ввести контексты безопасности и тем самым серьезно усложнить взаимодействие между оболочками и эмуляторами терминалов, а также, возможно, и точечными файлами людей. Или вы можете использовать низкую арендную плату для очистки всего, что может отображаться в терминале; это в значительной степени сводится к экранированию управляющих символов, что, вероятно, следует сделать в любом случае, просто чтобы выделить их (поскольку в файле журнала они могут указывать на того, кто пытается ввести шелл-код).(Кроме того, punycode - более серьезный пример того же рода проблемы - и тем не менее он стал официальным стандартом. Иногда безопасность сводится к смягчению небезопасных конструкций, которые находятся вне контроля.)
источник