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

Для дистрибутивов с действующей поддержкой уязвимость Shellshock устраняется простым обновлением пакета bash. Но если обновления уже не выпускаются, решение проблемы будет сложнее. Рабочих вариантов всего два – обновлять bash другим способом (брать из стороннего репозитория или компилировать самостоятельно) или отказываться от bash в пользу другого shell-интерпретатора.

1. Обновление bash из пакета репозитория Debian wheezу в Debian lenny.

Приводим /etc/apt/source.list из

deb http://ftp.debian.org/debian lenny main contrib
deb http://security.debian.org/ lenny/updates main contrib

к

deb http://archive.debian.org/debian lenny main
 deb http://archive.debian.org/debian-security lenny/updates main
deb http://ftp.debian.org/debian wheezy main contrib
 deb http://security.debian.org/ wheezy/updates main contrib

Убедитесь, что у вас нет файла /etc/apt/preference, настройки которого могли бы мешать установке по из репозиториев wheezy. После этого добавляем ключ, которым подписываются пакеты в wheezy и обновляем базу пакетов и устанавливаем пакет bash-static.

# apt-key adv --recv-keys --keyserver pgp.mit.edu 8B48AD6246925553
# apt-get update && apt-get install -y bash-static

Проверяем установленный bash-static и то, куда сейчас указывает /bin/sh:

# ls -la /bin/sh /bin/bash*
-rwxr-xr-x 1 root root 700492 Май 12 2008 /bin/bash
-rwxr-xr-x 1 root root 1410128 Апр 10 2010 /bin/bash-static
lrwxrwxrwx 1 root root 4 Окт 1 00:32 /bin/sh -> bash

Далее важно аккуратно выполнять действия:

# mv /bin/bash /bin/bash.old && ln -s bash-static /bin/bash

Проверяем результат, должно получиться так:
# ls -la /bin/sh /bin/bash*
lrwxrwxrwx 1 root root 11 Окт 1 00:51 /bin/bash -> bash-static
-rwxr-xr-x 1 root root 700492 Май 12 2008 /bin/bash.old
-rwxr-xr-x 1 root root 1410128 Апр 10 2010 /bin/bash-static
lrwxrwxrwx 1 root root 4 Окт 1 00:32 /bin/sh -> bash

Убедитесь, что c шеллом все в порядке до того, как делать логаут из системы. Например, попробовав залогиниться с другой консоли. Так как в случае недоступности шелла, указанного для пользователя(как правило в /etc/passwd) можно потерять возможность доступа в систему снова.

После выполнения операции стоит закоментировать в /etc/apt/source.list

# deb http://ftp.debian.org/debian wheezy main contrib
# deb http://security.debian.org/ wheezy/updates main contrib

2. Обновление bash в других дистрибутивах.

В случае других дистрибутивов можно попробовать статическую сборку bash из состава Debian wheezy или сборку из ftp://ftp.ssnab.net/pub/bash/ (скомпилированной по пункту 3)

Скачать debian’овский пакет можно здесь:

https://packages.debian.org/wheezy/bash-static

# wget http://security.debian.org/debian-security/pool/updates/main/b/bash/bash-static_4.2+dfsg-0.1+deb7u3_i386.deb

Файл разархивируется либо утилитой dpkg (актуально для старых версий ubuntu) или архиватором ar. Последняя идет в составе пакета binutils.

# mkdir tmp
# dpkg -x bash-static_4.2+dfsg-0.1+deb7u3_i386.deb tmp/

или
# ar x bash-static_4.2+dfsg-0.1+deb7u3_i386.deb

Обязательно сохраните старую версию bash в /bin/bash.old перед тем как выкладывать туда скачанный бинарник.

3. Самостоятельная компиляция

Это может понадобится в том случае, если у вас старое ядро и bash из wheezy не работает с жалобами на отсутствие какого-либо системного вызова, если используется другая операционная система, а также для тех случаев, когда необходима сборка с какими-то особыми опциями.

У bash несколько хитрая система выкладывания исходных кодов: отдельно лежит архив  определенной версии (в нашем случае 4.3) и отдельно каталог с патчами на ошибки, которые нашли с момента его выпуска, вплоть до появления обновленной версии. Поэтому скачиваем и то и другое для самостоятельной установки патчей. На Debian lenny это будет выглядеть так:

Устанавливаем необходимые пакеты для компиляции. Для этого вам, возможно, потребуется настроить правильным образом репозитории на архивы, как в случае с lenny в первом пункте.

# apt-get install libc-dev gcc automake autoconf make patch

Для CentOS, соответственно, будет

# yum install glibc-devel glibc-static make automake autoconf patch
# cd /usr/src
# wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
# tar xzf bash-4.3.tar.gz
# cd bash-4.3
# wget -cr --reject 'index.*' --reject '*.sig' -l1 http://ftp.gnu.org/gnu/bash/bash-4.3-patches/
# find ftp.gnu.org/gnu/bash/bash-4.3-patches/ -type f | sort -u |  xargs -l1 -I % cat % | patch -p0

Во избежание ошибки «multiple definition of `free`» используем опцию –without-bash-malloc

# ./configure --enable-static-link --without-bash-malloc --enable-job-control --enable-history
# make
# strip bash

Полученный bash копируем в /bin и используем его вместо системного bash по описанной ранее схеме:
# cp bash /bin/bash.new && mv /bin/bash /bin/bash.old && ln -s bash.new /bin/bash

Собранные таким образом на чистых Debian 5 и CentOS 5  бинарные файлы можно скачать здесь: ftp://ftp.ssnab.net/pub/bash/

4) Если не получается самостоятельно собрать bash или вытащить его из других дистрибутивов, возможнен еще вариант отказаться от bash и использовать какой-нибудь другой shell-интерпретатор, например, /bin/dash. Переименовать /bin/bash в /bin/bash.vulnerable и создать символьную ссылку /bin/bash, ведущую на альтернативный интерпретатор.

В этом есть доля риска, так как перестанут работать скрипты, содержащие башизмы – код, специфичный именно для bash. Если это окажутся стартовые или важные системные скрипты, это может привести к неработоспособности системы. Но для таких скриптов, если вы уверены в том, что они не будут вызываться в враждебном окружении, можно явно указать в начале файла интерпретатором оригинальный bash: #!/bin/bash.vulnerable

Протестировать, устранена ли уязвимость, можно выполнив команду:

E='() { test;}; echo vulnerable' bash -c ':'

Если ничего не выводится, то уявзимость устранена. Если выводится vulnerable, то значит, уязвимость присутствует.

Comments are closed.