Основные детали
Недавно стало известно об одной баге, который подвержена оболочка 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!!! не вылетает!
А почему на одном скрине i486, а на другом i686?
Хорошо, что спросили. На самом деле всё просто. Сервера у меня два. На обоих уязвимость. На первом я исправил. Потом решил написать статью, чтобы поделиться информацией. Ну а предыдущее состояние утрачено, поэтому один скрин взял с ещё не обновленного сервера. А другой – с уже обновленного. Везде Debian, везде всё одинаковое.