Есть мнение, что уязвимость в Bash с безусловным исполнением кода, который следует за символами “() {”, —это не баг, а фича. По мнению одного эксперта, данный факт совершенно очевиден. Пусть и плохо реализованная и неправильная, но всё равно ясно видно, что это намеренно внедрённая фича.

Проблема в том, что Bash разработали 25 лет назад. До появления Apache оставалось ещё пять лет. Интернет уже существовал, но это был относительно закрытый клуб для представителей академической науки. Им пользовались учёные и исследователи из разных университетов. В то время безопасность не считалась важным приоритетом при разработке новых программ. И уж тем более при разработке командного процессора Bash.

В контексте оболочки Unix дочерние процессы создаются и работают совершенно обычным и естественным образом. При создании нового дочернего процесса можно использовать переменные окружения, чтобы передать какие-то данные от родительского процесса к дочернему. В случае с Bash требовалась такая опция, чтобы какие-то функции, описанные в родительском процессе, передавались в дочерний. Вполне естественно, что для этого использовали переменные окружения.

Реализация слегка вышла за рамки спецификаций в том смысле, что Bash исполняет любую команду после определения функции, переданной в переменной окружения. Обычно там не должно быть никакого кода. Но в контексте программы Bash, если пользователь добавляет команды в эти переменные окружения, это можно считать фичей. В любом случае, дочерний процесс исполняется с правами того, кто установил переменные окружения, так что здесь не предвиделось проблем с безопасностью.

Настоящая проблема заключается в том, что через пять лет после создания Bash появились приложения вроде apache, dhcp и др., которые могут использовать Bash в дочерних процессах и в то же время используют переменные окружения для передачи данных. К сожалению, эти данные могут также поступать не от доверенного пользователя в локальной системе, а от кого угодно через интернет. И вот здесь недокументированная (и забытая) функция Bash превращается в мега-уязвимость, которая сейчас всем известна под названием Shellshock.

Никто не предполагал, что Apache и другие программы будут обрабатывать переменные окружения от дочерних процессов таким образом. Если и считать это багом, то это баг не Bash, а баг Apache и остальных программ, которые разрешают исполнение кода после символов “() {”.

В принципе, считает эксперт, если бы спецификации для Bash составлялись тщательно и подробно, то эта функция вполне могла войти в спецификации.

9 комментариев

  1. 29.09.2014 at 12:23

    Ну боржоми-то пить уже поздно, форкать надо и пилить замену. Или вообще с нуля, как некоторые.

  2. 29.09.2014 at 12:51

    «Если и считать это багом, то это баг не Bash, а баг Apache и остальных программ, которые разрешают исполнение кода после символов “() {”» — перевести оригинал нормально не могли? Апач и прочая НЕ ИСПОЛНЯЮТ код из переменных окружения, они лишь используют bash, не проверяя передаваемые ей данные на валидность. Так что ShellShock — это всё-таки BashCrash. 🙂

    • 29.09.2014 at 14:28

      Как раз нахожусь на on-site пентесте и когда опубликовали информацию о шеллшоке — дополнительный видный finding в отчет :).
      А в целом отчасти с автором согласен — не совсем это баг (в момент создания оно было ок), но и не совсем фича (ибо документированно плохо и создатели Апача и т.д. видимо об этом просто не знали).

  3. 29.09.2014 at 18:57

    poetomu dla anonimnosti v seti nujni odnorazovie devaysi. vse ostalnoe erunda!!! backdoori v jeleze!!! a v softe tem bolee!!!

  4. http://mrixs.ru

    30.09.2014 at 12:26

    Это всё-таки в текущей ситуации — баг. Если бы возможность исполнения кода из переменной окружения после определения функции была описана и задокументирована, то да — была бы фича.

    • 30.09.2014 at 12:54

      Плюс ко всему, зачем такая возможность вообще нужна? Почему нельзя поместить команды в тело функции? Что-то типа авторана?

  5. 30.09.2014 at 22:09

    Прям заново баш писать ? Патчи для слабаков ?

  6. http://romanakamagician.tumblr.com/

    01.10.2014 at 01:58

    Классическое ИТ: не можешь исправить баг — скажи, что фича 🙂

  7. 03.10.2014 at 14:38

    А где тут у вас свежие новости? Эта — последняя?

Оставить мнение