Насколько безопасно кошка произвольного файла?


77

Иногда, когда я catбинарный файл по ошибке, мой терминал искажается. Ничто быстрое resetне может исправить, но теоретически злоумышленник не может создать файл, который при отображении на терминале будет выполнять произвольный код? Через эксплойт в эмуляторе терминала или другим способом.


3
Иногда, когда я делаю это, моя оболочка в конце говорит «неизвестная команда». Это заставляет меня задуматься, возможно ли это на самом деле.
Кит

5
Существовали эксплойты для эмулятора терминала, например, linuxsecurity.com/content/view/104657 или securityfocus.com/bid/6936/discuss, так что нет необходимости в особой безопасности
Ульрих Дангел

1
Вот почему лучше использовать что-то, что будет блокироваться в двоичных файлах (например more) или в терминале ( less) для проверки содержимого файлов. Мало того, что он не переведет ваш терминал в странное состояние, весь файл не будет пролетать за один выстрел.
Blrfl

Команда stty saneсбрасывает xterm (или аналогичный), который был переключен, например, в другой набор символов.
Турбьёрн Равн Андерсен

moshВ документации есть некоторые соображения по этому поводу
Макс Рид

Ответы:


34

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

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

Но всегда есть (как справедливо отметил Хауке «мозговая смерть») человек, желающий добавить такую ​​функцию, если она решает для них проблему, не понимая лазейки, которую они создают. По моему опыту с программным обеспечением с открытым исходным кодом, из-за того, что многие смотрят на код, это случается реже, чем с закрытым исходным кодом. (Я помню, что в почтовой программе Irix от Silicon Grahpics, в середине девяностых, вы могли включать команды, выполняемые на машине-получателе, реальные пути к исполняемым файлам, ....)


3
«Вы можете включить команды, которые будут выполняться на компьютере получателя» Вы имеете в виду что-то вроде включения в VBScript электронной почты, который вызывает Windows Scripting Host? :)
CVn

Нет, точно, вы могли бы запустить исполняемый файл, который уже был на компьютере, например, воспроизводить звук. Я не помню точный синтаксис (это было почти 20 лет назад) и не могли ли вы отключить эту «функцию» в настройках. Мы немного повеселились с автоматическим воспроизведением видео, хранящихся в нашей сети.
Anthon

Ты не о NeWS говоришь? IIRC SGI был одним из последних противников.
luser droog

@luserdroog Нет, это была стандартная почтовая программа с графическим интерфейсом под Irix
Anthon

1
@Anthon Я не уверен, что это все еще возможно, но возможность использования escape-кодов, чтобы заставить терминал «повторять» текст, поступающий к нему из writeкоманды, - таким образом, выполняя команды / сценарии как пользователь, владеющий терминалом. Предположительно, это причина, по которой многие рекомендуют отключать сообщения mesg -nдля пользователей большую часть времени и root всегда . AFAIK, это действительно было сделано - хотя я не знаю, эксплуатировалось ли оно когда-либо. Так случайный текст из catисполняемого Ted, может , возможно , будет выполнен.
Баард Копперуд

33

Большинство эмуляторов терминала отправляют обратно некоторый ответ, если они получают определенные escape-последовательности (см. Документацию по управляющим последовательностям xterm ). Например, вы можете отправить \e[0cв эмулятор, похожий на VT100, и он отправит обратно атрибуты устройства, что-то вроде этого \e[?1;2c (вероятно, это то, что заметил Кит). Но эти ответы не являются произвольными строками. Тем не менее, иметь исполняемый файл с именем 2cгде-то в вашей системе, который делает что-то фатальное, - плохая идея.

Обновление: риски на самом деле больше, чем я думал, из-за возможности установить заголовок окна xterm и отослать заголовок обратно, используя соответствующие escape-последовательности ( http://www.securityfocus.com/bid/6940/ ) , В отличие от приведенного выше примера, заголовок может быть почти произвольной строкой.


Это уже очень близко.
Gunchars

Есть еще более старая функция - «ответное сообщение», отправляемое в ответ на символ ENQ (Ce). На реальном VT100 он устанавливается пользователем в меню SETUP терминала; может быть, есть эмуляторы терминала, которые позволяют устанавливать его удаленно ...
sendmoreinfo

16

Это изменяет заголовок терминала в GNOME Terminal 3.6.1, если он не переопределен чем-то вроде PS1 :

printf "\033]2;Script Kiddie was here\007"

Теперь откройте новое окно терминала GNOME, чтобы проверить catверсию:

printf "\033]2;Script Kiddie was here\007" > test.bin
cat test.bin

Да, это также устанавливает заголовок терминала.

Раньше была проблема безопасности с escape-кодом, в результате чего заголовок печатался в командной строке , поэтому вы могли эффективно создать файл, который при catпечати ed выводил бы (я не уверен, что вы могли бы вставить туда новую строку) произвольные команды. Ой!


8

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

Вот пример команды, которую вы можете запустить, которая создаст «вредоносный» скрипт оболочки:

echo -e '#!/bin/sh\necho "...doing something bad here..."\nexit\n\033[A\033[Aecho "Hello dear reader, I am just a harmless script, safe to run me!"' > demo.sh
chmod a+x demo.sh

Когда вы просматриваете файл, он кажется достаточно безопасным:

$ cat demo.sh
#!/bin/sh
echo "Hello dear reader, I am just a harmless script, safe to run me!"

Но если вы на самом деле запустить его ...

$ ./demo.sh 
...doing something bad here...

Сценарий работает, включая необработанные коды перехода, чтобы переместить курсор на пару строк вверх, поэтому остальная часть сценария написана поверх вредоносного кода, скрывая его.

Практически любая другая программа раскроет скрипт для того, что он есть. Только программы, которые не обрабатывают содержимое файла (например cat, moreи less -r), будут давать вводящий в заблуждение вывод.

Обратите внимание, что tailи headвыдает тот же вводящий в заблуждение вывод. Поэтому использование «less + F» безопаснее, чем «tail -f».


Это весьма проблематично ... Вы можете увидеть , что происходит на самом деле, выполнив echo $(cat demo.sh), cat demo.sh | grep . --color=yes(Примечание: --color=yesэто то , что показывая «вредоносный» код здесь) или встроенные cat -v demo.sh.
Чарли

Верно или неверно, это ответ на другой вопрос: насколько достоверным является catотображение содержимого файла .
Инснис Мрси

@IncnisMrsi: Это не совсем ответ на другой вопрос. Этот ответ предупреждает, что cat покажет escape-коды, и предоставляет простой пример только с одним типом escape-кода, но есть много других. В сочетании с определенными терминалами они могут переназначать ключи, перезаписывать файлы и теоретически даже выполнять команды . Поэтому, как только вы поймете опасность отображения escape-кодов, вы поймете, что иногда это может быть небезопасно для catпроизвольного файла, как задан вопрос!
Malvineous

6

Я определенно испытывал xtermвставку произвольных символов в себя, как будто я их набрал. И иногда это, по-видимому, включало символ новой строки, так что я получил ngwerm:0riu: command not foundв качестве ответа. Я не вижу причин, по которым кто-то не мог создать файл, который отправлял бы конкретные вредные команды. Так что да, по крайней мере, некоторые терминалы подвержены атакам с произвольным воздействием.


2

Ну, эмулятор терминала в основном просто печатает отправленные ему символы.

Все, кроме простой печати символа в текущей позиции, например, установка новой позиции, изменение цвета, изменение названия и т. Д., Выполняется с помощью escape-последовательностей.

Набор поддерживаемых escape-последовательностей обычно состоит из четко определенных стандартов, таких как ANSI , который не определяет способ запуска других процессов. Хотя было бы возможно реализовать такую ​​последовательность, я не знаю ни одного эмулятора терминала, преднамеренно разрешающего такие вещи.

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


0

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

$ file <mystery file>
$ strings <mystery file> | less

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

пример

вывод файла
$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
вывод строк
$ strings /bin/ls|less
...
across
vertical
single-column
force
never
auto
if-tty
slash
%b %e  %Y
%b %e %H:%M
long-iso
main
posix-
sort_files
?pcdb-lswd
dev_ino_pop
Try `%s --help' for more information.
Usage: %s [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.
Mandatory arguments to long options are mandatory for short options too.
  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
...

3
запуск строк в неизвестном файле также может иметь проблемные последствия. lcamtuf.blogspot.fi/2014/10/…
Ян Викхольм,

@IncnisMrsi - прочитайте первое предложение !!!!
SLM

Хорошо, возвращаясь к моему предыдущему утверждению, ответ короткий, использует запутанную терминологию, необоснованный и, очевидно, неполный. Обратите внимание, что в безопасности, «произвольный» ≠ случайный, как распространяется в вашей любимой ОС.
Incnis Mrsi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.