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

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



    1. Установка из пакета из репозитория Debian wheezy в 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 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 из состава Debian wheezy или сборку из ftp.ssnab.net/pub/bash (скомпилированной по пункту 3)

    Скачать Debian'овский пакет можно здесь: 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.1-3_i386.deb tmp/
    

    или

    # ar x bash-static_4.1-3_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.ssnab.net/pub/bash

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

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

    Update добавлена процедура получения ключа для wheezy
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 16

      +1
      так в squeeze версия bash 4.1-3, до сих пор уязвима. по-крайней мере отсюда все эксплоиты подтвердили уязвимость. надо из wheezy пакет ставить, версия >=4.2.37(1).
        +2
        Я для Squeeze подключил LTS репозитории, обновился и всё стало хорошо. Линк: wiki.debian.org/ru/LTS/Using
          0
          Меня одного смущает http как часть домена?
          deb _http://http.debian.net/debian/ squeeze-lts main contrib non-free
          deb-src _http://http.debian.net/debian/ squeeze-lts main contrib non-free

          Очень часто приходилось после редакторов исправлять ссылки:
          _http://http://example.com

          Наверно поэтому смущает глаз такой URL
          +1
          Спасибо, действительно мой косяк, там должен быть именно wheezy или squeeze-lts. Исправил.
          +1
          Наткнулся на рецепт для Debian Etch (да-да, и там есть жизнь).
            0
              0
              У меня на wheeze apt-get install говорит, что установлена последняя версия bash, хотя файл /bin/bash от 01.01.2013, и простейший тест
              env X="() { :;} ; echo busted" bash -c "echo stuff" показывает, что уязвимость есть.
                0
                нужно сначала обновить локальную базу пакетов через apt-get update
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  А никто не задумывался о выпуске универсального бинарного патчера или хотя бы скрипта для автоматизации этих действий на всех затронутых системах?
                    +1
                    Было обсуждение на эту тему в рассылке oss-security, предложен простой однострочник, правда на всех платформах он не проверялся.
                      +1
                      Вот еще, в дополнение к однострочнику на perl от Solar Designer.
                      0
                      для старых версий Ubuntu 10.10, 11.04, 11.10 и Debian 5 просто поставил из исходников сделав скрипт:

                      mkdir src
                      cd src
                      wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
                      #download all patches
                      for i in $(seq -f "%03g" 1 27); do wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
                      tar zxvf bash-4.3.tar.gz 
                      cd bash-4.3
                      #apply all patches
                      for i in $(seq -f "%03g" 1 27);do patch -p0 < ../bash43-$i; done
                      #build and install
                      ./configure --prefix=/ && make && make install
                      cd .. 
                      cd ..
                      rm -r src
                      


                      Установка идет в /bin/bash что позволит при обновлении системы просто обновить bash до нормальной версии.

                      PS. Для тех у кого будет ругаться в Ubuntu на отсутствие patch или gcc просто в /etc/apt/sources.list надо указать old-releases.ubuntu.com
                        +1
                        Для FreeBSD веток 9.0 и старше:
                        portsnap fetch
                        portsnap extract
                        

                        Затем перетягиваем /usr/bin/make из любой современной версии фри, иначе ничерта не соберется и будет ошибка, т.к. в современных портах используется чуть другая система компиляции.
                        Идем в /usr/ports/shells/bash и пробуем собрать через
                        make reinstall clean
                        

                        Если ругнулось смотрим лог ругани, там скорее всего будет список что нужно дособрать и затем сконвертировать базу портов, после этого пересобирается нормально.
                          +1
                          Только совсем не понятно зачем для CentOS 5 собирать bash вручную из исходников.

                          Гораздо проще и удобнее просто обновить систему штатными средствами, через yum update

                          Обновления критических проблем безопасности RHEL5/CentOS5 будут выпускаться до 31 марта 2017 года.

                          Подробности: access.redhat.com/support/policy/updates/errata
                            0
                            Да, безусловно, CentOS5 еще поддерживаемый. Он был выбран как платформа для компиляции в качестве примера. Плюс, у него используется старое ядро и скомпилированный на нем бинарник может подойти для каких-то сравнительно старых платформ, на которых нет компилятора и нужно брать бинарник со стороны.

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое