Shellshock — не баг, а фича

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

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

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

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

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

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

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

Анатолий Ализар: Бывший автор новостной ленты «Хакера». Увлекается современными технологиями, оружием, информационной безопасностью, носимой электроникой и в целом концепцией Internet of Things.

Комментарии (9)

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

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

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

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

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

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

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

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

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