Phil Kulin (schors) wrote,
Phil Kulin
schors

Shellshock на пальцах

Все уже слышали об эпической дырке в bash?
Для тех, кто не слышал:
http://www.troyhunt.com/2014/09/everything-you-need-to-know-about.html - тут недурно на басурманском
http://www.securitylab.ru/vulnerability/458762.php - тут так себе
http://xakep.ru/shellshock/ - тут тоже так себе
А тут продолжение банкета:
https://news.ycombinator.com/item?id=8367883

Вкратце - косяк позволяет исполнить что-то, разными извращёнными способами, зачастую очень простыми для злоумышленика. Осложняется всё тем, что линукс вообще везде bash.

Теперь более подробно, но на пальцах. Что происходит?

bash - командная оболочка UNIX. Если вы в Linux, то скорее всего ваша оболочка - bash. Более того, большинство Linux-дистрибутивов ещё и не различают sh и bash. Для пользователей Windows поясню - bash это такой cmd только для *NIX. С какого-то перепоя bash позволяет определять функции в переменных окружения. Грубо говоря, при запуске bash, он пробегает по переменным окружения, и если видит в какой из них синтаксис определения функции - берёт и исполняет эту переменную как свою строку. Соответственно, вот такая строка:

export atata='() { :;}; echo Дыра в безопасности'; bash -c echo;

придаст переменной atata значение '() { :;}; echo Дыра в безопасности', переменная atata экспортируется в окружение, потом (после ';') запустится bash, который в начале запуска интерпретирует переменную окружения atata как строку для исполнения, а только потом выполнит команду echo. как ему предписано. Правда прекрасно?

А теперь представьте, что некий веб-бот обходит сайт, представляясь "User-Agent: () { :;}; rm -rf". А у Вас CGI на /bin/sh и Linux, где это bash... Или cgi-скрипт делает вызов через shell, а shell - это bash...

Где это сработает


  • CGI-скрипты, если там хоть где-то есть вызов bash, или если это Linux и есть какой-нибудь запуск. Даёт доступ к shell кому угодно.

  • gitolite, gitosis, gitlab, если логин-шелл - bash. Проблема в том, что эти системы работают через ключи SSH и ограничивают пользователя жёстко одной командой, однако, реальная команда, которую хотел исполнить пользователь, передаётся в переменной окружения SSH_ORIGINAL_COMMAND. Итак:
    ssh git@you_gitolite_sercver '() { :;}; rm -rf ~/'
    и репозитария больше нет, даже если у вас были права на посмотреть одну веточку. Но если валидного логина SSH нет, то ничего и не будет</i>
  • shell_exec() в страницах на PHP на Linux, если php запущен как php-fpm. FastCGI передаёт заголовки HTTP в окружение и поэтому запуск bash будет в соответствуюем окружении. Выкладка теоретическая, поправьте меня, если это не так.

  • Придумайте ещё что-нибудь



Где это не сработает


  • Эта уязвимость не повышает привилегии

  • CGI на Perl даже если есть запуск через qx - запускает sh. Если у вас sh - это bash, то вы сами себе Linux

  • Запуск bash со страниц на PHP под управлением mod_php, поскольку php в этом случае не передаёт заголовки HTTP как переменные окружения

  • SSH без валидной авторизации. Ибо shell запускается уже после неё</b>
  • На домашних роутерах и т.д. и т.п., как обозначено в релизах. В большинстве своём домашние роутеры - это мини-Linux с лёгким shell, который точно не bash.



Это серьёзная уязвимость?

Нет. Да.

Вообще я чуть со смеху не помер, когда понял как она работает :)
Tags: bash, linux, shellshock, ИБ
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 13 comments