Наскільки безпечно котувати довільний файл?


77

Іноді, коли я catпомилково перетворюю бінарний файл, мій термінал зникає. Нічого швидке resetне може виправити, але хіба зловмисник теоретично не міг створити файл, який, відображаючись у терміналі, виконав якийсь довільний код? За допомогою подвигу в емуляторі терміналу чи іншим способом.


3
Іноді, коли я це роблю, моя оболонка в кінці скаже "<сміття> невідома команда". Це змушує мене замислитися, чи це насправді можливо.
Кіт

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

1
Ось чому для використання вмісту файлів краще використовувати те, що буде працювати в бінарних файлах (наприклад more) або знає термінал ( less). Він не тільки не поставить ваш термінал у дивному стані, і весь файл не пролетить за один кадр.
Blrfl

stty saneКоманда скидає Xterm (або аналогічний) , який був включений в , наприклад , інший набір символів.
Thorbjørn Ravn Andersen

moshДокументація має деякі думки з цього приводу
Макс Рід

Відповіді:


34

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

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

Але завжди (як Хоке так справедливо позначає «мозковий розум») люди бажають додати таку особливість, якщо вона вирішить для них проблему, не розуміючи лазівки, яку вони створюють. На мій досвід роботи з програмним забезпеченням з відкритим кодом, це те, що через багато очей, які дивляться на код, це рідше відбувається, як із закритим кодом. (Я пам’ятаю, що в поштовій програмі на Ірисі Silicon Grahpics 'в середині дев’яностих років ви могли включати команди, які потрібно виконати на машині приймачів, реальні шляхи до виконуваних файлів, ....)


3
"Ви можете включити команди, які потрібно виконати на апараті приймачів". Ви маєте на увазі щось на зразок, зокрема, в VBScript електронної пошти, який викликає хост сценарію Windows? :)
CVn

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

Ви не говорите про NeWS, чи не так? IIRC SGI був одним з останніх торгів.
luser droog

@luserdroog Ні, це була стандартна поштова програма на основі GUI під Irix
Антон,

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

33

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

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


Це вже різання дуже близько.
Стрільці

Є ще старіша функція - "повідомлення у відповідь", надіслане у відповідь на символ ENQ (Ce). На реальному VT100 він встановлюється користувачем у меню SETUP терміналу; можливо, є емулятори терміналів, які дозволяють налаштувати його віддалено ...
sendmoreinfo

16

Це змінює назву терміналу в терміналі GNOME 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

Так, це також встановлює назву терміналу.

Раніше виникала проблема безпеки з кодом втечі, що призводить до того, що заголовок друкується в командному рядку , так що ви можете ефективно створити файл, який після catредагування буде надруковано (я не впевнений, чи можете ви там помістити новий рядок) довільні команди. Ой!


8

Хоча використання catможе не призвести до виконання коду, коди евакуації будуть оброблені, так що ви можете легко ввести в оману, вважаючи, що сценарій нешкідливий, оскільки він справді є шкідливим.

Ось приклад команди, яку ви можете запустити, яка створить "шкідливий" скрипт оболонки:

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також виробляють один і той же вихід вводить в оману. Тому використання "менше + F" безпечніше, ніж "хвіст -f".


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

Правда чи помилково, це відповідь на інше питання: наскільки надійним є catпоказ вмісту файлу .
Incnis Mrsi

@IncnisMrsi: Це дійсно не відповідь на інше питання. Ця відповідь попереджає, що кішка покаже коди евакуації та надає простий приклад із лише одним типом коду втечі, але є багато інших. У поєднанні з певними терміналами вони можуть перезавантажувати ключі, перезаписувати файли і теоретично навіть виконувати команди . Отже, як тільки ви зрозумієте небезпеку відображення кодів втечі, ви зрозумієте, що іноді це може бути небезпечно для catдовільного файлу, як це задається питання!
Malvineous

6

Я напевно відчув, як xtermвставити до себе довільні символи так, ніби я їх набрав. І іноді це, мабуть, включило персонаж нового рядка, так що я отримав ngwerm:0riu: command not foundвідповідь. Я не бачу причини, щоб хтось не міг створити файл, який би надсилав конкретні, шкідливі команди. Так так, принаймні деякі термінали сприйнятливі до атак з довільним впливом.


2

Ну, термінальний емулятор в основному просто роздруковує надіслані до нього символи.

Все, крім простого друку символу на поточній позиції, як-от встановлення нової позиції, зміна кольору, зміна заголовка тощо, робиться за допомогою послідовностей втечі.

Набір підтримуваних послідовностей евакуації зазвичай складається з чітко визначених стандартів, таких як 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.