Есть мнение, что уязвимость в Bash с безусловным исполнением кода, который следует за символами “() {”, —это не баг, а фича. По мнению одного эксперта, данный факт совершенно очевиден. Пусть и плохо реализованная и неправильная, но всё равно ясно видно, что это намеренно внедрённая фича.
Проблема в том, что Bash разработали 25 лет назад. До появления Apache оставалось ещё пять лет. Интернет уже существовал, но это был относительно закрытый клуб для представителей академической науки. Им пользовались учёные и исследователи из разных университетов. В то время безопасность не считалась важным приоритетом при разработке новых программ. И уж тем более при разработке командного процессора Bash.
В контексте оболочки Unix дочерние процессы создаются и работают совершенно обычным и естественным образом. При создании нового дочернего процесса можно использовать переменные окружения, чтобы передать какие-то данные от родительского процесса к дочернему. В случае с Bash требовалась такая опция, чтобы какие-то функции, описанные в родительском процессе, передавались в дочерний. Вполне естественно, что для этого использовали переменные окружения.
Реализация слегка вышла за рамки спецификаций в том смысле, что Bash исполняет любую команду после определения функции, переданной в переменной окружения. Обычно там не должно быть никакого кода. Но в контексте программы Bash, если пользователь добавляет команды в эти переменные окружения, это можно считать фичей. В любом случае, дочерний процесс исполняется с правами того, кто установил переменные окружения, так что здесь не предвиделось проблем с безопасностью.
Настоящая проблема заключается в том, что через пять лет после создания Bash появились приложения вроде apache, dhcp и др., которые могут использовать Bash в дочерних процессах и в то же время используют переменные окружения для передачи данных. К сожалению, эти данные могут также поступать не от доверенного пользователя в локальной системе, а от кого угодно через интернет. И вот здесь недокументированная (и забытая) функция Bash превращается в мега-уязвимость, которая сейчас всем известна под названием Shellshock.
Никто не предполагал, что Apache и другие программы будут обрабатывать переменные окружения от дочерних процессов таким образом. Если и считать это багом, то это баг не Bash, а баг Apache и остальных программ, которые разрешают исполнение кода после символов “() {”.
В принципе, считает эксперт, если бы спецификации для Bash составлялись тщательно и подробно, то эта функция вполне могла войти в спецификации.