Во-первых, фиксят — но не до конца.
Во-вторых, этот будет работать всегда — создаётся переменную окружения foo, в которую заносится функция, и потом эта же функция вызывается в дочернем шелле.
Это нормально, так и задумано.
Беспокоиться стоит только если вот это:
Тут 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 для настройки некоторых параметров сети).
Меня этот метод не раз спасал, когда выбивало винт из RAID, smartctl отваливался с «Input/output error», а в ДЦ надо было отправить запрос на замену с серийником битого винта.
Удаление/добавление — и некоторое время можно опрашивать «плохой» винт через smartctl.
Автор ответил в личку, действительно, ему так ответил отдел обслуживания клиентов (НЕ тех. поддержка).
Сейчас разбираюсь, что произошло и почему ему так ответили — отпишусь тут в комментариях по результатам.
Позже напишу пост, наверное, о том, как работает поддержка РХ, и какие подразделения за что отвечают, чтоб не было недопонимания.
Пока что это не фейк.
Автор ответил, действительно, ему так ответил отдел обслуживания клиентов (НЕ тех. поддержка).
Сейчас разбираюсь, что произошло и почему ему так ответили.
Позже напишу пост, наверное, о том, как работает поддержка РХ, и какие подразделения за что отвечают, чтоб не было недопонимания.
Также через уязвимый CGI можно вывесить bash наружу:
system("/usr/bin/increase_counter.sh");
Если /usr/bin/increase_counter.sh — баш-скрипт, то система будет уязвима.
Уязвимы будут скрипты по типу этого:
При этом, если system() заменить на qx// — то ничего не происходить (qx// не форкает новый шелл насколько я понимаю).
Во-вторых, этот будет работать всегда — создаётся переменную окружения foo, в которую заносится функция, и потом эта же функция вызывается в дочернем шелле.
Это нормально, так и задумано.
Беспокоиться стоит только если вот это:
x='() { echo «hi mom»; };echo «hi bro»' bash -c 'echo bye dad'
выводит «hi bro» и «hi dad» (на патченых версиях будет только «hi dad»).
Учите матчасть, и не дурите головы людям.
Не может такого быть. Разберём команду:
$ 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»
Как видно выше, локалхостом тут и не пахнет — где-то при копи-пасте ошибка.
А ещё есть сервисы, которые дают SSH-туннели прокидывать через себя — логиниться позволяют, но команды выполнять не дают.
Вот эта бага как раз и даёт возможность обойти это ограничение.
По сути, всё, что спавнит баш — уязвимо.
Например — фильтры CUPS. Или dhclient, который от DHCP-сервера принимает параметры, которые через переменные окружения передаются в dhclient (который в свою очередь использует bash для настройки некоторых параметров сети).
$ 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.
В идеальном мире — да. Ну вот случается же.
Конкретно эта бага есть только в баш, все остальные командные интерпретаторы фильтруют это дело.
Удаление/добавление — и некоторое время можно опрашивать «плохой» винт через smartctl.
Сейчас разбираюсь, что произошло и почему ему так ответили — отпишусь тут в комментариях по результатам.
Позже напишу пост, наверное, о том, как работает поддержка РХ, и какие подразделения за что отвечают, чтоб не было недопонимания.
Обязательно отпишусь в комментах.
Автор ответил, действительно, ему так ответил отдел обслуживания клиентов (НЕ тех. поддержка).
Сейчас разбираюсь, что произошло и почему ему так ответили.
Позже напишу пост, наверное, о том, как работает поддержка РХ, и какие подразделения за что отвечают, чтоб не было недопонимания.