Исправляем критическую багу в Bash/Linux CVE-2014-6271, CVE-2014-7169

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

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

Недавно стало известно об одной баге, который подвержена оболочка 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!!! не вылетает!

Интересно? Поделись с другом
Litl-Admin.ru

Comments:

Comments: 2
  1. valentino

    А почему на одном скрине i486, а на другом i686?

    1. litladmin (author)

      Хорошо, что спросили. На самом деле всё просто. Сервера у меня два. На обоих уязвимость. На первом я исправил. Потом решил написать статью, чтобы поделиться информацией. Ну а предыдущее состояние утрачено, поэтому один скрин взял с ещё не обновленного сервера. А другой – с уже обновленного. Везде Debian, везде всё одинаковое. :)

Leave a Reply