Исправление уязвимости shellshock для устаревших систем
Для дистрибутивов с действующей поддержкой уязвимость 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