Для дистрибутивов с действующей поддержкой уязвимость Shellshock устраняется простым обновлением пакета bash. Но если обновления уже не выпускаются, решение проблемы будет сложнее. Рабочих вариантов всего два — обновлять bash другим способом или отказываться от bash в пользу другого shell-интерпретатора.
1. Установка из пакета из репозитория Debian squeeze в 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://archive.debian.org/backports.org lenny-backports main
deb http://ftp.debian.org/debian squeeze main contrib
deb http://security.debian.org/ squeeze/updates main contrib
Убедитесь, что у вас нет файла /etc/apt/preference, настройки которого могли бы мешать установке по из репозиториев squeeze. После этого обновляем базу пакетов и устанавливаем пакет bash-static.
# 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 squeeze main contrib
#deb http://security.debian.org/ squeeze/updates main contrib
2. Другие дистрибутивы.
В случае других дистрибутивов можно попробовать статическую сборку bash из состава Debian squeeze или сборку из ftp.ssnab.net/pub/bash/ (скомпилированной по пункту 3)
Скачать Debian'овский пакет можно здесь: packages.debian.org/squeeze/bash-static
# wget http://ftp.us.debian.org/debian/pool/main/b/bash/bash-static_4.1-3_i386.deb
Файл разархивируется либо утилитой dpkg (актуально для старых версий ubuntu) или архиватором ar. Последняя идет в составе пакета binutils.
# mkdir tmp
# dpkg -x bash-static_4.1-3_i386.deb tmp/
или
# ar x bash-static_4.1-3_i386.deb
Обязательно сохраните старую версию bash в /bin/bash.old перед тем как выкладывать туда скачанный бинарник.
3. Самостоятельная компиляция
Это может понадобится в том случае, если у вас старое ядро и bash из squeeze не работает с жалобами на отсутствие какого-либо системного вызова, если используется другая операционная система, а также для тех случаев, когда необходима сборка с какими-то особыми опциями.
У 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.ssnab.net/pub/bash/
4) Если не получается самостоятельно собрать bash или вытащить его из других дистрибутивов, возможнен еще вариант отказаться от bash и использовать какой-нибудь другой shell-интерпретатор, например, /bin/dash. Переименовать /bin/bash в /bin/bash.vulnerable и создать символьную ссылку /bin/bash, ведущую на альтернативный интерпретатор.
В этом есть доля риска, так как перестанут работать скрипты, содержащие башизмы — код, специфичный именно для bash. Если это окажутся стартовые или важные системные скрипты, это может привести к неработоспособности системы. Но для таких скриптов, если вы уверены в том, что они не будут вызываться в враждебном окружении, можно явно указать в начале файла интерпретатором оригинальный bash: #!/bin/bash.vulnerable
Автор: Viliar