Статус
Apple выпустила исправления безопасности Bash для Shellshock и связанных с ними уязвимостей как « OS X bash Update 1.0 ». Они могут быть установлены через обычное обновление системы для людей, использующих OS X Mountain Lion v10.8.5 или OS X Mavericks v10.9.5 (они включены в Обновление безопасности 2014-005 ), а также могут быть установлены вручную. Официальные исправления Apple также доступны для OS X Lion v10.7.5 и OS X Lion Server v10.7.5, но доступны только при ручной загрузке. Исправления безопасности доступны по различным URL-адресам в зависимости от версии операционной системы:
(Если выпущены новые патчи, разместите их здесь, но, пожалуйста, сохраните их и для справки.)
Патч Apple заботится о Shellshock и некоторых других уязвимостях и подходит для большинства людей. TL; д-р люди могут перестать читать здесь.
ОДНАКО внимание, привлеченное к bash из-за ошибки Shellshock, заставило многих исследователей внимательно взглянуть на bash, и все больше и больше (трудно эксплуатируемых) уязвимостей продолжают обнаруживаться. Если вы очень обеспокоены безопасностью (потому что, возможно, вы используете OS X Server для размещения общедоступного веб-сайта), вы можете (попытаться) не отставать от уязвимостей и исправлений, поскольку они продолжают действовать, компилируя bash самостоятельно. В противном случае, не беспокойтесь об этом.
Ищите, что Apple выпустит еще одно обновление, которое выйдет в будущем, когда пыль осядет в поисках новых уязвимостей.
Доступен официальный набор патчей самого bash для bash 3.2, патчей 52, 53 и 54 (которые соответствуют патчам 25, 26 и 27 Bash 4.3), исправляющих как CVE-2014-6271, так и CVE-2014-7169, а также «Игра окончена», показанная ниже. Это было проверено мной ( @alblue ), и пост был обновлен соответствующим образом (и затем были сделаны дополнительные обновления: см. Редакцию 41 для поста, который останавливается на патче 54).
Сообщалось о множестве дополнительных уязвимостей в отношении bash. По словам Михала Залевский посту , если у вас есть участок 54 (и , предположительно , официальный патч от Apple) «нет никакого смысла увлеченно о статусе этих индивидуальных ошибок, потому что они больше не должны представлять угрозу безопасности:»
CVE-2014-6271 - оригинальная RCE, найденная Стефаном. Исправлено bash43-025 и соответствующими записями 24 сентября для других версий.
CVE-2014-7169 - ошибка создания файла / использования токена, найденная Тависом. Исправлено bash43-026 & co (26 сентября)
CVE-2014-7186 - вероятный сбой 10-ти с лишним риска здесь и сейчас, обнаруженный Флорианом и Тоддом. Исправлено bash43-028 & co (1 октября).
CVE-2014-7187 - Флориан обнаружил безаварийный, вероятно, без риска второй раз. Исправлено bash43-028 & co (1 октября).
CVE-2014-6277 - проблема неинициализированной памяти, почти наверняка RCE, обнаруженная Михалом Залевским. Никаких конкретных патчей пока нет.
CVE-2014-6278 - команда впрыска RCE, найденная Михалом Залевским. Никаких конкретных патчей пока нет.
Это становится довольно запутанным. К счастью, Chet Ramey, официальный разработчик bash, опубликовал CVE для исправления карт . Его пост ссылается на патчи для bash 4.3, я (@OldPro) перевел их на патчи для bash 3.2, что применимо к OS X. Кроме того, начиная с этого поста он выпустил патч 57, поэтому я добавил его ниже:
bash32-052 CVE-2014-6271 2014-09-24
bash32-053 CVE-2014-7169 2014-09-26
bash32-054 exported function namespace change 2014-09-27 ("Game Over")
bash32-055 CVE-2014-7186/CVE-2014-7187 2014-10-01
bash32-056 CVE-2014-6277 2014-10-02
bash32-057 CVE-2014-6278 2014-10-05
См Дэвид А. Уилера пост на временной шкале и более подробно.
@alblue опубликовал инструкции по сборке через патч 55. Я (@OldPro) добавил патчи 56 и 57 в инструкции, но не проверял их.
Тестирование на оригинальную уязвимость
Вы можете определить, уязвимы ли вы к исходной проблеме в CVE-2014-6271 , выполнив этот тест:
$ env x='() { :;}; echo vulnerable' bash -c 'echo hello'
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
hello
Приведенный выше вывод является примером неуязвимой bash
версии. Если вы видите слово vulnerable
в выходных данных этой команды, вы bash
уязвимы, и вам следует обновить. Ниже приведена уязвимая версия от OS X 10.8.5:
Тестирование на новую Уязвимость
Было обновлено оригинальное сообщение, и Bash 3.2.52 (1) по-прежнему уязвим к вариации уязвимости, определенной в CVE-2014-7169.
$ rm -f echo
$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST
Приведенный выше вывод является примером уязвимой bash
версии. Если вы видите дату в выводе этой команды, вы bash
уязвимы.
Отключение автоматически импортируемых функций для предотвращения «Game Over»
Исследователи отметили, не классифицируя это как уязвимость, что сценарий может захватить функцию в подоболочке с помощью автоматически импортируемых функций:
$ env ls="() { echo 'Game Over'; }" bash -c ls
Game over
Приведенный выше код в уязвимой системе будет отображаться Game Over
вместо списка каталогов, от которого вы ожидаете ls
. Очевидно, echo 'Game Over'
может быть заменен любым вредоносным кодом, который вы хотите. Это стало известно как ошибка "Game Over".
До появления исправления 54 и NetBSD, и FreeBSD по умолчанию отключали автоматический импорт функций bash, частично для того, чтобы предотвратить «окончание игры», но в основном для того, чтобы содержать любые дальнейшие ошибки в синтаксическом анализаторе (такие как CVE-2014-7169 ), какими они были продолжает обнаруживаться, и добавлен новый флаг командной строки--import-functions
чтобы повторно включить старое поведение по умолчанию. Я (@alblue) подготовил патч (против 3.2.53), чтобы другие могли его использовать, если они тоже хотят принять это поведение, и включил его ниже. По умолчанию этот патч не включен в скрипт сборки ниже. Я (@OldPro) считаю, что этот патч больше не нужен или не является хорошей идеей, потому что он нарушает обратную совместимость, и уязвимости, от которых он защищает, очень хорошо устраняются патчем 54 и более ранними патчами, и включение этого неофициального патча предотвращает применение будущих патчей ,
(Примечание для редакторов вопросов; пожалуйста, не включайте это по умолчанию, так как это неофициальный патч.)
a0c5c4d66742fddd0a35001cb91798a5fbf8a2f5 import_functions.patch
Патч можно включить, запустив export ADD_IMPORT_FUNCTIONS_PATCH=YES
перед запуском сборки. Обратите внимание, что включение этого исправления отключит исправление 54 и любые будущие исправления, потому что нельзя гарантировать совместимость будущих исправлений с неофициальным исправлением.
В Apple Patch есть уязвимость Game Over, своего рода
Как отметил @ake_____ в твиттере, официальный патч Apple по-прежнему уязвим для засорения среды исполняемыми файлами:
$ env '__BASH_FUNC<ls>()'="() { echo Game Over; }" bash -c ls
Game Over
Пользователи должны решить для себя, насколько это важно. Я (@OldPro) думаю, что беспокоиться не о чем, потому что нет никакого известного эксплойта для этого поведения (ему даже не был дан идентификатор CVE), потому что в общем случае непривилегированные удаленные злоумышленники не могут установить имя переменной среды, а злоумышленники с привилегиями не могут используйте это, чтобы получить привилегии, которых у них еще нет (по крайней мере, без использования дополнительной уязвимости).
Чтобы обеспечить небольшую предысторию, bash позволяет вам определять функции и, кроме того, позволяет экспортировать эти функции в подоболочки с помощью export -f
команды. Раньше это реализовывалось путем создания переменной среды с тем же именем, что и у функции со значением, установленным для определения функции. Так
$ ls () { echo 'Game Over'; }
$ export -f ls
$ echo $ls
Game Over
Это произошло потому, что export -f ls
создали переменную среды с именем ls
. Уязвимость «Game Over» заключалась в том, что вы могли напрямую создавать эту переменную среды без необходимости сначала определять функцию, что означало, что если вы можете ввести правильное имя переменной, вы можете перехватить команду. Apple попыталась исправить это, затруднив создание переменной с правильным именем. Официальный патч 54 для bash фактически делает невозможным создание переменной с правильным именем, используя имена переменных, которые включают %
символ, который не допускается в имени переменной, эффективно помещая определения экспортированных функций в другое, зарезервированное пространство имен.
Если ничего из вышеперечисленного не имеет для вас смысла, не беспокойтесь об этом. Вы в порядке с патчем Apple на данный момент.
Системные двоичные файлы
OS X 10.9.5 (последний стабильный выпуск на данный момент) поставляется с Bash v3.2.51:
$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
Вы можете получить и перекомпилировать Bash следующим образом , при условии, что у вас установлен Xcode (и вы xcodebuild
хотя бы раз запускали его, чтобы принять лицензию):
$ # If you want to disable auto-imported functions, uncomment the following
$ # export ADD_IMPORT_FUNCTIONS_PATCH=YES
$ 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
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-053 | patch -p0
$ # See note above about ADD_IMPORT_FUNCTIONS_PATCH
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] && curl http://alblue.bandlem.com/import_functions.patch | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-054 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-055 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-056 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-057 | patch -p0
$ cd ..
$ # Note: DO NOT ADD SUDO TO XCODEBUILD HERE
$ xcodebuild
$ build/Release/bash --version # GNU bash, version 3.2.57-release
$ build/Release/sh --version # GNU bash, version 3.2.57-release
$ sudo cp /bin/bash /bin/bash.old
$ sudo cp /bin/sh /bin/sh.old
$ sudo cp build/Release/bash /bin
$ sudo cp build/Release/sh /bin
(Примечание: вы можете запустить это, скопировав и вставив вышеуказанный блок кода, зайдя в Терминал и затем запустив его pbpaste | cut -c 2- | sh
. Всегда будьте осторожны при запуске случайных сценариев из Интернета, хотя ...)
После этого версия Bash должна быть v3.2.57:
$ bash --version
GNU bash, version 3.2.57-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
В целях безопасности и после тестирования я рекомендую вам chmod -x
старые версии, чтобы они не использовались повторно, или перенести их на резервный сайт.
$ sudo chmod a-x /bin/bash.old /bin/sh.old
Другие ответы имеют решения для тех, кто использует MacPorts или Homebrew; они не решают проблему, они просто устанавливают дополнительные версии Bash. Пожалуйста, смотрите эти ответы, если вы хотите обновить их специально.
Спасибо
Спасибо Чету, который присматривает за bash и делает эти патчи доступными. Спасибо всем, кто прокомментировал это и улучшил его с течением времени.
Теперь Apple выпустила реальное исправление, хотя это все еще может быть полезно. Поскольку они выпустили исправление только для Lion и выше, а официальный патч предоставляет GNU bash, версия 3.2.53 (1) -release (x86_64-apple-darwin13), тем не менее, ошибка Game over все еще несколько уязвима. На этом этапе перестройка вашей собственной версии Bash для 3.2.57, вероятно, более безопасна, чем использование патча Apple, если вы не ошиблись.