`

СПЕЦИАЛЬНЫЕ
ПАРТНЕРЫ
ПРОЕКТА

Архив номеров

Как изменилось финансирование ИТ-направления в вашей организации?

Best CIO

Определение наиболее профессиональных ИТ-управленцев, лидеров и экспертов в своих отраслях

Человек года

Кто внес наибольший вклад в развитие украинского ИТ-рынка.

Продукт года

Награды «Продукт года» еженедельника «Компьютерное обозрение» за наиболее выдающиеся ИТ-товары

 

Андрей Зубинский

«Уязвимость» №1 (комедия-триллер без элементов мистики и ужасов)

+1111
голосов

Оболочка командной строки bash – утилита фактически стандартная (в мире Unix клонов) и далеко не новая. Её разработка была начата в первой половине февраля 1988 года. Инсталляционная база её очень большая. Пусть не «громадная», но действительно Очень Большая. И тут, в 2014 году, внезапно, открывается ужасное – оказывается, в bash есть уязвимости, да ещё и «жуткие», допускающие инжектирование стороннего кода для исполнения. Пока ничего не скажу об этом «кошмаре», поговорим лучше немного о другом, более фундаментальном. Точнее, о фундаментально смешном баловстве, очень старом (ещё тех времён, когда никакой Linux и в проекте не было), но всё равно забавном.

Любой мало-мальски опытный пользователь, например, ОС Linux, знает о «wildcards» (даже не хочу приводить увечные попытки перевода термина на русский) – метасимволах, по-разному интерпретируемых командной оболочкой (дальше – shell, утомительно писать много лишних букв). «*» уж точно известно всем – этот метасимвол, например, в именах файлов, заменяет shell долгое описание «любое количество любых символов, включая вообще ничего». То есть, команда shell  «ls *» выдаст в поток вывода список всех видимых в текущем положении (в файловой системе) файлов, «ls *.c» - файлов с любыми именами, в которых есть два последних символа «.c». Пока нам этого и хватит, для дальнейшего.
Давайте попробуем заглянуть в «богатый внутренний мир» простой и совершенно законной (хоть и полностью бессмысленной) операции «ls * -al» с использованием утилиты strace: «strace ls * -al». Первая же строка результата показывает нам и чем заменяет shell символ «*», и результирующий вызов функции execve с переменным числом параметров:

«Уязвимость» №1 (комедия-триллер без элементов мистики и ужасов)

Эта функция предназначения для исполнения программ, и, по соглашению (а не по строгой её спецификации), первым аргументом является полное путевое имя программы, дальше следуют возможные параметры – в нашем случае это результат скрытой замены символа «*», наконец, строка «-al», перенесенная из текста команды. Этот последний параметр в сочетании с wildcards – очень полезный, потому что никакой разницы между явной передачей параметров и именем файла не наблюдается, ведь правда? Ну, да, параметры начинаются с символа «-», но значимых препятствий для шаловливых рук это не создаёт.

Создадим файл с именем «-rf» - «touch -- -rf». Проверим, что он появился – «ls -al». Есть такой файл. А теперь, после strace-наблюдения за выполнением глупой команды «ls * -al» подумаем, что будет, если мы вызовем в каталоге, содержащем файл с именем «–rf», команду «rm *». Логика работы команды «rm» и механизмов подстановки shell, по идее, должна привести к удалению всех файлов, каталоги же останутся нетронутыми (и об этом shell должна сообщить). Но. Если в списке файлов есть пустое ничто с красивым именем «-rf», шелл честно передаст в списке параметров вызова функции execve строку “-rf”, которая ничем не отличается от параметров команде rm, которая, в свою очередь, искренне воспримет всё ей переданное так, как способна понять, и вместо сохранившихся каталогов в результате удаления файлов командой «rm *» не останется ничего, кроме файла с именем «-rf». Этот фокус пещерных времён Unix принято называть «инжекцией через метасимволы» (wildcard injection), и он является одним из примеров широкого класса «инжекции в канал» (channel injection), при которой для изменения исполнения чего-то используется фундаментальный принцип «сборки» этого чего-то из частей в один «канал исполнения».

С помощью инжекции через метасимволы можно, например, красиво заставлять команду chown (изменение владельца и группы файла) делать совсем не то, что подразумевает вызывающий её, в первую очередь при рекурсивном изменении файлов. Подсказка проста и кроется в возможностях самой утилиты: есть в перечне её опций «--reference=имя_файла», где имя_файла – образец для подражания, то есть, владелец и группа этого файла и будут «распространены» по прочим вызовом функции «chown –R», причём… даже если желаемые пользователь и группа указаны в команде явно, образец для подражания эту попытку ручного управления «перевесит» (не удивляйтесь, всё логично, просто это такая логика). То есть, достаточно в забитом тысячами файлов каталоге всего двух, например, одного с именем «--reference=.zykdsga.zzz» (первая точка в имени образцового файла – сугубо для увеселения), и второго – «.zykdsga.zzz», чтобы любая выполненная системным администратором команда «chown –R желаемый_пользователь:желаемая_группа» изменила всё на… пользователя и группу файла .zykdsga.zzz. Совершенно аналогичен фокус с изменением битовых масок прав доступа командой chmod (у неё есть точно такая же опция «--reference»). А вот куда более насыщенная утилита tar, например, настолько насыщенная, что man-страницу по ней никто не дочитал до конца, поэтому она позволяет тем же приёмом сделать куда более весёлые вещи. Потому что в списке её параметров есть такие милые, которые начинаются с «--checkpoint». Первый задаёт через сколько обработанных блоков данных сообщать об этом важном событии, а вот второй, «--checkpoint-action=программа» позволяет запускать на исполнение в эти важные моменты какой-то файл. Какой угодно. И не только файл, а вообще описывать какой-то сложный вызов, это же Unix. Уже понятно? Делаем в каком-то каталоге два файла, с именами, например, «--checkpoint=2» и «--checkpoint-action=sh bomb.sh», ну и, само собой, третий файл – bomb.sh. И пусть себе лежат. Если системному администратору вздумается (или он будет стимулирован) выполнить команду tar в этом каталоге, невидимо для него наш прекрасный файл bomb.sh будет выполнен с… эскалацией привилегий до максимально возможного уровня. Гениальная это команда, tar, всегда её любил, как и прочие команды с нечеловеческой бездной параметров. Ну и так далее, смотрите все команды, где там у них в параметрах есть возможность задать исполнение чего-то, а дальше - инжекция через метасимволы, древний принцип, которым можно творить, выдумывать, пробовать (и не забывайте, метасимволов больше, чем только "*", там обширное поле для творчества). И уж если кто-то добрался до шелла, пусть без прав суперпользователя, и нашёл в файловой системе каталоги, где можно что-то записать, и это старый хитрый волк, понимающий толк в социальной инженерии, то оставить после себя всяких презабавных мин замедленного действия он может предостаточно, как и активировать их…

Так вот всё это к чему. Ну, отыскали в bash кроме кучи встроенных на уровне идеологии способов инжекции кода, ещё один, позволяющий из-за «ошибки» исполнять не только записанную в переменную окружения функцию bash (что само по себе прекрасная возможность что-нибудь кому-нибудь сломать), но и «по ходу дела» дописанный после формального завершения тела функции фрагмент (я взял слово «ошибка» в кавычки не случайно, скорее всего речь идёт даже не об ошибке, а о некотором таинственном «расширенном функционале» (как всегда, где я использую слово «функционал» не в математическом его смысле, там же использую и сарказм), потому что подобный эффект проявляется не только в bash, но и в zsh, например. Говорить, что это всерьёз что-то ухудшило, трудно. Если бы не одно «но». Нечеловеческими усилиями эта странность (которую "умудрялись не замечать" сто лет) оказалась потенциально угрожающей для всяких систем, использующих CGI (Common Gateway Interface), а их очень немало. Например, результаты попытки сканирования позволили прийти этому автору к выводу об уязвимости примерно одного хоста из пятидесяти.

Смешная история. И тем, что инжекция через метасимволы – вроде как очень забытый приём, и о нём слишком многие не помнят. И странностями утилит, открывающих простым приёмам широкие двери в куда угодно. И внезапными озарениями в области, где, по логике, очевидная особенность распространённых командных оболочек в сочетании с CGI должна была использоваться нехорошими злыми крякерами в своё время очень широко (есть у меня подозрение, что и использовалась, а теперь, по ряду многих причин, просто устарела и её «анонсировали публике»).

Откланиваюсь.

+1111
голосов

Напечатать Отправить другу

Читайте также

Для меня остается загадкой, с какого перепугу в 2014 году кто-то еще использует CGI (действительно, есть причины?), и насколько надо быть альтернативно одаренным, чтобы через CGI разрешать shell. Лучше сразу рутовый пароль на главной странице написать....

Или есть веские причины так подставляться?

Добрый день. Из личного опыта - когда работал в телекоме, частенько в недорогих коробках в роли ПО был кастрированный Linux. А в роли сервисов, которые вызывались из Web интерфейса - как раз многострадальные CGI скрипты.Т.е. если у такой коробке Web и-с "выставлен наружу" .... см. Выше.

Открою страшную тайну - за кулисам цирка скрывается на несколько порядков больше, чем несколько часов клоунады под названием UI, GUI и т.п. ))) А командная строка позволяет сделать абсолютно все с минимальными трудозатратами и максимальной эффективностью.

Вспомнилась мне одна забавная история из 90-х, во времена моей работы в ДГУ. Один мой студент написал простую программу которая находила все файлы с именем длиной 3 символа и меняла местами имя и расширение. Т.е. файл вида aaa.bbb превращался в bbb.aaa. Учился писать на С. Чуть не выгнали... оказалось, что програмка расползалась по факультету в качестве прикола, а некоторые именитые профессора и доценты не смогли понять что делать после ее запуска и как все вернуть обратно. :)

Запустить еще раз? :)

ну да ))

способ не сработает, если произвести инжекцию через переименование этой программы в aaa.exe

В то время еще даже МS DOS-а не было... А на PDP-11 этой проблемы не существовало. :)

 
 
IDC
Реклама

  •  Home  •  Рынок  •  ИТ-директор  •  CloudComputing  •  Hard  •  Soft  •  Сети  •  Безопасность  •  Наука  •  IoT