Материал просмотрен 583 раз(а)

Основные детали

Недавно стало известно об одной баге, который подвержена оболочка bash начиная аж с 1.14, то есть много-много лет. В чём выражается код? Дело в том, что bash позволяет экспортировать функцию в качестве переменной окружения. То есть мы не имея особых привилегий в системе создаем переменную окружения, содержащую функцию, дописываем произвольную команду после окончания функции и перезаходим в шелл, то наша последняя команда выполнится с нашими правами!

Демонстрация:

$ my='() { :; }; echo "BAGA!!!"' bash -c 'echo "test"'

Проверка баги

Проверка баги

Что мы сделали? Мы присвоили переменной my функцию, которая ничего не делает, а после команда вывода слова BAGA!!!. Это всё в переменной. Теперь запускаем дочерний баш и что мы видим? Вывод слова BAGA, который хранился в переменной! Эту переменную мы нигде явно не вызывали, но код выполнился. Интересненько.

Что делать, будем исправлять.

Версия баша

Версия баша

Узнаем версию баша… да, все версии до 4.3 подвержены уязвимости. Самая последняя 4.3, будем ставить её.

P.S. у меня Debian

Исправление уязвимости

1. Создаем временный каталог для исходников

# mkdir sources

2. Переходим в каталог

# cd sources

3. Получаем последнюю версию баша:

# wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz

Откроем в браузере страницу с патчами: http://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/

4. Ого.. Немало. Будем скачивать все.

# for i in $(seq -f "%03g" 0 25); do wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done

Команда seq выдает последовательность символов нужного формата, от 001 до 025, и мы формируем нужные URL патчей и  будем скачивать эти файлы.

5. После того, как закачаны все патчи, распакуем архив с башем:

# tar xvzf bash-4.3.tar.gz

6. Переходим в каталог с исходниками bash-а:

# cd bash-4.3

7. Теперь аналогичным образом применим патчи:

# for i in $(seq -f "%03g" 0 25);do patch -p0< ../bash43-$i; done

Команда patch – применяет разностные изменения к исходникам.

8. Теперь собираем в системе новый баш:

# ./configure && make && make install

После того, как сборка окончена, проверяем наши уязвимости:

Теперь версия пропатчена

Теперь версия пропатчена

Версия пропатчена! Теперь проверяем первоначальный баг с переменными окружениями.

Тест пройден

Тест пройден

Всё! Больше BAGA!!! не вылетает!