Как перекомпилировать Bash, чтобы избежать Shellshock (удаленный эксплойт CVE-2014-6271 и CVE-2014-7169)?

Учитывая, что Bash 3.2 (версия, поставляемая OS X) уязвима для эксплойта удаленного выполнения , известного как «Шок оболочки» ( CVE-2014-6271 и CVE-2014-7169 ), как мне перестроить Bash и защитить мою систему перед официальный патч Apple?

ОБНОВЛЕНИЕ: обратите внимание, что Apple выпустила официальный патч. Подробнее см. ниже .

Apple выпустила исправление: support.apple.com/kb/DL1769 .
Упомянутый выше патч OS X bash Update 1.0 предназначен для OS X 10.9.5 или более поздней версии. Вот все из них: OS X 10.7.5 (Lion), OS X 10.8.5 (Mountain Lion), OS X 10.9.5 ( Маверикс).
Да, ссылки были добавлены 9 часов назад, но они были неправильно удалены. apple.stackexchange.com/revisions/146849/10
создал gist.github.com/dnozay/395dcdef05c6b4b1836a , в котором есть большинство шагов и уже включены исправления (и он должен работать на OSX 10.6).
@dnozay Спасибо за суть! Пожалуйста, обновите его, включив в него патчи 55 и 56 (уже вышли) и 57 (скоро выйдет).
@OldPro, пожалуйста, пингуйте меня, когда выйдет 57, и я обновлю его.

Ответы (7)

Положение дел

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;dr люди могут перестать читать здесь.

ОДНАКО, внимание, привлеченное к 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 — ошибка создания файла/использования токена, обнаруженная Tavis. Исправлено 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, обнаруженное Михалом Залевски. Конкретного патча пока нет.

Это становится довольно запутанным. К счастью, Чет Рэми, официальный сопровождающий 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, показывающий уязвимость в 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, отчасти для предотвращения «Game Over», но в основном для устранения любых дальнейших ошибок в синтаксическом анализаторе (таких как 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 попыталась исправить это, затруднив создание переменной с правильным именем. Официальный патч bash 54 фактически делает невозможным создание переменной с правильным именем, используя имена переменных, которые включают %в себя символ, не разрешенный в имени переменной, эффективно помещая экспортированные определения функций в другое зарезервированное пространство имен.

Если ничего из вышеперечисленного не имеет для вас смысла, не беспокойтесь об этом. У вас все в порядке с патчем 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)-выпуск (x86_64-apple-darwin13), ошибка Game Over все еще несколько уязвима. На данный момент пересборка вашей собственной версии Bash против 3.2.57, вероятно, более безопасна, чем использование патча Apple, если только вы не сделаете это неправильно.

Макпорты

Это дает вам версию bash 4.3.28(1), в которой исправлены обе уязвимости (CVE-2014-6271 и CVE-2014-7169), а также некоторые обнаруженные впоследствии. Это полезно, если вы изменили оболочки, чтобы использовать Macports bash для получения функций версии 4.

Это не решит проблему стандартных скриптов ОС как первой #!/bin/shили #!/bin/bashпервой строки. Проблема такого рода заключается в том, что Macports старается не использовать версии программ, поставляемые Apple, поскольку Macports имеет тенденцию обновляться быстрее, например, у него более новая версия bash)

Вы можете заставить терминал использовать это, как в ответе Homebrew.

Чтобы установить macports, следуйте этим инструкциям :
1. Установите Xcode и инструменты командной строки Xcode
2. Согласитесь с лицензией Xcode в Терминале: sudo xcodebuild -license
3. Загрузите pkg MacPorts для вашей версии OS X: ссылки находятся на странице
4. Запустите пакет

Когда у вас установлены macports, вам нужны последние версии, это делается путем запуска

sudo port selfupdate

и перекомпилируйте или получите последние двоичные файлы,

sudo port upgrade outdated
Поскольку речь идет об устранении уязвимости системы безопасности в существующих двоичных файлах, и это не заменяет/исправляет уязвимые двоичные файлы, я не вижу, как это решает проблему.
Это лиса версия macports - и действительно была запрошена на комментарий IanC.
Да. Мы должны перечислить исправления для всех мест, которые bashобычно появляются в OS X, — например, системное исправление, исправление Homebrew и MacPorts. Возможно, и Финк. Лично я бы предпочел, чтобы это было сделано как редактирование ответа @AlBlue. Так что это все один, самый правильный, ответ.
@InaC они должны быть отдельными, так как ответы действительно различаются, а один большой нельзя проверить - например, посмотрите, как я говорю, что это не исправляет Apple bash, а домашний ответ копирует Homebrew bash поверх OSX. По сути, это отдельные вопросы
Смотрите мое редактирование ответа @AlBlue. Я не согласен, что они должны быть отдельными.
sudo port selfupdateбез пробела между self и update...
4.3.25 также устраняет последующую CVE?
Примечание для последнего редактирования macports, кажется, исправил его сам - у меня есть хорошая сборка

ПРИМЕЧАНИЕ относительно официального обновления Apple OS X bash Update 1.0: это обновление программного обеспечения только обновляет официальную версию Apple bash до версии 3.2.53. Версия патча 3.2.54 предлагает следующее изменение:

Этот патч изменяет кодировку, которую bash использует для экспортируемых функций, чтобы избежать конфликтов с переменными оболочки и избежать зависимости только от содержимого переменной среды, чтобы определить, следует ли интерпретировать ее как функцию оболочки.

Для пользователей, которые уже пропатчили систему бинарными файлами 3.2.54, вы можете либо заменить скомпилированные бинарные файлы патчем Apple, либо оставить все как есть, но это не рекомендуется. Хотя Apple оставила свою двоичную версию версии 3.2.53, патч Apple ДЕЙСТВИТЕЛЬНО содержит исправление для приведенного ниже теста эксплойта:

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

Это означает, что официальный бинарный файл Apple 3.2.53 содержит эквивалентную безопасность бинарному файлу vanilla GNU 3.2.54. Неприятная путаница, но это то, что есть. Исправление Apple не наполовину готово. Похоже, это полное решение проблемы. Таким образом, приведенную ниже дорожную карту для компиляции vanilla bashи shисходного кода GNU следует рассматривать как исторический артефакт и, возможно, использовать в качестве шаблона для того, как делать исправления в будущем, если они потребуются.

ПРИМЕЧАНИЕ. С исходным кодом vanilla GNU shвозникают проблемы с повышением привилегий, которые вызывают сбои в различных программах установки, например, Adobe Flash. Я настоятельно рекомендую придерживаться исправленных Apple двоичных файлов. Считайте эту схему исправления устаревшей и опрометчивой.

Существует новый патч GNU bash 3.2.55, который описывает следующее исправление:

Описание ошибки:

В parse.y есть два локальных переполнения буфера, которые могут привести к тому, что оболочка сбрасывает ядро, когда к одной команде подключено много здесь-документов или много вложенных циклов.

Мы оставляем на усмотрение внимательного читателя решить, стоит ли сидеть с официальными исправленными Apple двоичными файлами или создавать свои собственные, чтобы справиться с новыми возможными эксплойтами. Лично я буду придерживаться двоичных файлов Apple.


В этом посте подробно описано, как скомпилировать и установить vanilla bashи shOS X. Я выбрал этот маршрут, поскольку следующие примеры с подробным описанием использования исходного кода Apple не оставили меня с правильной версией патча. YMMV. Однако эта ванильная установка нацелена на замену двоичных файлов OS X, так что, когда Apple, наконец, выпустит обновление для системы безопасности, эти ванильные замены будут узурпированы их соответствующими аналогами Apple.

Моя базовая конфигурация:

OS X Lion 10.7.5 и Xcode 4.6.3 со всеми установленными утилитами командной строки.

Мои шаги, чтобы исправить это, были:

Загрузите базовый исходный код bash для 3.2.48 с:

https://ftp.gnu.org/gnu/bash/bash-3.2.48.tar.gz

Загрузите исправления bash3.2.49, .50, .51, .52, .53, .54 и .55 с:

https://ftp.gnu.org/gnu/bash/bash-3.2-patches/

Я сохранил их как $filename.patch, например, bash3.2.50.patch.

компакт-диск в каталог загрузки и…

Распакуйте основную исходную ветку:

tar xzvf bash-3.2.48.tar.gz

cd bash-3.2.48

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

cp ../*.patch .

Затем …

for file in *.patch ; do
  patch -p0 < $file
done

Это должно показать успешные исправления различных файлов. Если нет, будьте готовы провести некоторые исследования и расследования.

Следующий:

sudo cp /bin/bash /bin/bash_old
sudo cp /bin/sh /bin/sh_old
sudo chmod -x /bin/bash_old
sudo chmod -x /bin/sh_old

Это в основном создало резервную копию ваших старых, уязвимых оболочек bash и sh и удалило их исполняемые привилегии. Это дает вам возможность восстанавливать команды по мере необходимости, но в то же время устраняет их способность наносить ущерб.

Следующий:

./configure --prefix=/ ; make ; sudo make install

Это должно правильно настроить, скомпилировать и установить новый двоичный файл bash в /bin. После этого выйдите из Терминала и снова откройте.

Вы должны, все счастливы и улыбаются, быть в состоянии bash --versionи теперь видеть 3.2.55, например:

Gaia:Downloads trane$ bash --version
GNU bash, version 3.2.55(1)-release (i386-apple-darwin11.4.2)
Copyright (C) 2007 Free Software Foundation, Inc.

Точный вывод приведенной выше команды будет отличаться в зависимости от вашей версии OS X.

Вы также должны иметь возможность проверить свою уязвимость bashи убедиться, что это нормально.

ПРИМЕЧАНИЕ. Пока мы исправили только bash, но /bin/shисполняемый файл все еще находится в уязвимом состоянии. Простое копирование bashповерх sh— это стиль Linux. Однако реализация OS X shимеет некоторые отличия от bash, поэтому вам придется снова затянуть компилятор. Дополнительную информацию о том, как bashи shчем отличается OS X, можно найти здесь:

https://apple.stackexchange.com/a/89327/91441

В вашем каталоге загрузки выполните:

make clean

В вашем любимом редакторе откройте файл Makefile.inи прокрутите до строки 99. Мы собираемся изменить строку Program, чтобы выводимый нами двоичный файл был shне bashтаким:

Program = sh$(EXEEXT)

Сохраните его, а затем

./configure --prefix=/ --enable-xpg-echo-default --enable-strict-posix-default
make ; sudo make install

Теперь вы будете строить shпочти так же, как Apple.

И последнее замечание: на некоторых (всех?) системах Apple обычно помещает bashbugисполняемый файл в /usr/bin. Наш компилятор поместит его в /bin. Итак, последние шаги здесь:

sudo mv /usr/bin/bashbug /usr/bin/bashbug_old
sudo chmod -x /usr/bin/bashbug_old
sudo mv /bin/bashbug /usr/bin/bashbug
Ответы должны стоять отдельно; ссылки в порядке, но вы также должны обобщить содержание.
Не для того, чтобы ныть или что-то в этом роде, но когда вопрос «как мне перекомпилировать bash», а мой ответ «щелкните следующую ссылку, чтобы ответить на этот вопрос», кажется, что сводные требования остаются в силе.
FWIW, ниже 10.6.8 с Xcode 3.2.6, configure завершается без предупреждения об отсутствующем программном обеспечении, но компиляция выдает предупреждения в одном из исправленных файлов (variables.c), а затем завершается сбоем с кучей ошибок ссылок, связанных с _rl_символами.
Жаль это слышать, Сет. Я надеюсь, что вы можете решить эту проблему; иначе вам не повезло. Apple прекратила поставки обновлений Snow Leopard в конце прошлого года.
Понятно: библиотека readline, включенная в bash, несовместима с 10.6. Вместо этого установите GNU readline, а затем взломайте make-файл bash, чтобы использовать его. Установите readline: ftp.cwru.edu/pub/bash/readline-6.3.tar.gz В bash, после настройки, в Makefile установите READLINE_LIB = /usr/local/lib/libreadline.aи выполните чистую компиляцию. Затем разделите и скопируйте новый двоичный файл bash поверх /bin/bashи/bin/sh
ОТЛИЧНО, Сет. Рад видеть это!
Дополнение: В Makefile bash также необходимо установить HISTORY_LIB = /usr/local/lib/libhistory.a. В противном случае bash будет динамически связан с /usr/local версией libhistory.
Обратите внимание, что версия, загружаемая со страницы Apple с открытым исходным кодом, имеет пользовательские изменения, чтобы она работала на OSX. Я бы не рекомендовал использовать ванильный апстрим-баш, иначе вы не замените аналогичный.
Apple вносит множество изменений для оптимизации утилит с открытым исходным кодом в системе. Тем не менее, я не вижу, где ваниль bashкаким-то образом не сможет себя вести только потому, что ядро ​​​​другое. В любом случае я считаю свое решение временным; в конце концов, Apple исправит проблему, и мои скомпилированные двоичные файлы будут заменены (что является моей основной причиной для компиляции в /binпервую очередь.
У меня старая система с OS X v10.4 и Bash 2.05b, поэтому я не могу обновиться до последней версии Bash или последней версии OS X. Я следовал приведенным здесь инструкциям и загрузил исходный код для Bash 2.05b вместе с десятью файлами исправлений. . Я применил патчи и собрал Bash. Мне понадобился kluge для библиотеки readline выше. Патч 008 является одним из ключевых исправлений для этой уязвимости, и, помимо прочего, он блокирует попытки определения функции из переменных среды с сообщением об ошибкеinternal_warning ("%s: ignoring function definition attempt", from_file);
stringsна только что созданном Bash проверяет наличие нового сообщения об ошибке ignoring function definition attempt. Тем не менее, если я запускаю новый bash, а затем вхожу в проверку уязвимости, он все равно показывает уязвимость.
@jetset: Вы перезапустили текущий открытый экземпляр терминала? Чтобы проверить, все ли в порядке, сравните вывод bash --versionс echo $BASH_VERSION. Если последняя является более ранней версией, перезапустите Терминал.
Я не устанавливал только что построенный Bash; Сначала я хотел убедиться, что это устранило проблему. Поэтому я просто вызвал его с помощью, ./bashа затем провел в нем тест на уязвимость.
И старый Bash, и недавно созданный сообщают об одной и той же версии (что имеет смысл, поскольку я вручную применил исправления 2.05):~/bash/bash-2.05b$ ./bash --version GNU bash, version 2.05b.0(1)-release (powerpc-apple-darwin8.11.0) ~/bash/bash-2.05b$ /bin/bash --version GNU bash, version 2.05b.0(1)-release (powerpc-apple-darwin8.0)
Но только что собранный Bash имеет новое сообщение об ошибке, а старый Bash — нет: В новом Bash есть строка: ~/bash/bash-2.05b$ strings ./bash | grep 'ignoring function definition attempt'%s: ignoring function definition attemptВ старом Bash нет:~/bash/bash-2.05b$ strings /bin/bash | fgrep 'ignoring function definition attempt'
Если вы запустите три варианта тестов на уязвимости, и они не появятся, все в порядке. Новейшие исправления 2.05b определенно устраняют эти CVE.
Возможно, вы захотите изменить ссылки для скачивания наhttps://
@CousinCocaine: Да, действительно могу. Спасибо.
Может ли кто-нибудь помочь понять, почему только что перекомпилированный Bash 2.05b со всеми десятью примененными исправлениями по-прежнему показывает себя уязвимым в соответствии с тестами? Команда stringsпроверяет наличие исправлений в двоичном файле.
@jetset: Вы использовали patchкоманду для применения своих исправлений, как описано выше? Я помню, как вы в другом месте говорили, что исправляли ошибки «вручную».
Да, я успешно применил все десять патчей, что подтверждается проверкой исходников. Команда stringsв полученном двоичном файле показывает, что у него есть новое сообщение об ошибке ignoring function definition attempt, добавленное патчем 008.
Что именно получается в результате запуска трех примеров эксплойта?
Результат каждого из трех эксплойт-тестов идентичен для старого и исправленного Bash: $ ./bash $ env x='() { :;}; echo vulnerable' bash -c 'echo hello' vulnerable hello $ rm -f echo$ env X='() { (a)=>\' sh -c "echo date"; cat echo sh: X: строка 2: синтаксическая ошибка рядом с неожиданным токеном =' sh: X: line 2: 'sh: ошибка при импорте определения функции для X' Tue Sep 30 17:35:25 PDT 2014 $ env ls="() { echo 'Игра окончена'; }" bash -c ls`Game over
Вы еще не перенесли свой скомпилированный bash /bin, не так ли? Эксплойты проверяют вашу систему bash, а не bashскомпилированные, но еще не установленные двоичные файлы. Либо установите двоичные файлы, либо измените ВСЕ bashэкземпляры на ./bash.
Цитируя знаменитого Симпсона, «DoH!» Конечно, тесты по-прежнему показали уязвимость, потому что каждый из них вызывает систему, bashпоэтому shмне нужно изменить тесты, чтобы ./bashвместо этого вызывать локальный. Если я так сделаю, то все работает.
Установите свои двоичные файлы, и все готово. Не забудьте перезапустить Терминал, чтобы убедиться, что ваша текущая оболочка запускает новый двоичный файл.
Я вижу, что @TraneFrancks опубликовал то же самое решение в то же время, когда я это понял. Спасибо всем за помощь.
Что касается различий между сборками Apple и GNU: по крайней мере, в версии 10.8.5 замена Apple /bin/sh на исправленный GNU bash приведет к сбою установщика Adobe Flash на authexec[460]: executing /bin/sh. Но эта проблема не возникает в версии 10.6.8, для которой нет патча Apple. Так что, по крайней мере, кажется, что патчи Apple предпочтительнее на более поздних системах, но патчи GNU могут работать для 10.6.8.
Я согласен с тем, что эти патчи Apple предпочтительнее. Они полностью устраняют эксплойт Shellshock.
Я не только согласен, @SethNoble, я смог воспроизвести проблему. Программа установки Adobe отлично работает с патчем Apple bash/sh 3.2.53.

Для тех, кто борется с компиляцией из исходного кода, с 29 сентября Apple официально выпустила исправления для Mac OS X 10.9.5, 10.8.5, а также 10.7.5:

Спасибо! Это может быть проще, чем перекомпилировать для многих/большинства.
@AlBlue Согласен. Кроме того, несмотря на то, что патчи не совсем чисты, как отмечают некоторые, это намного лучше, чем ничего. И гораздо безопаснее, чем какой-нибудь новичок, компилирующий исходный код в панике.
Как обычно, действует задержка распространения обновлений программного обеспечения. Интересно, сколько времени потребуется, чтобы посылки появились. Приятно видеть, что Apple довольно быстро отреагировала на эту проблему!
@TraneFrancks «Как обычно, задержка распространения обновлений программного обеспечения действует в полную силу». Я действительно не понимаю, как организация, которая распространяет полный альбом U2 для всех пользователей iOS, может как-то подавиться обновлением безопасности размером менее 4 МБ.
@JakeGould: Хех. Да, это смех. Я только что проверил обновление программного обеспечения в этой системе Lion, и оно утверждает, что система обновлена. То же самое с другой системой Mountain Lion здесь.
@TraneFrancks Ммм, если вы перейдете по приведенным выше ссылкам, вы сможете скачать прямо с Apple. Не нужно ждать обновления программного обеспечения.
@JakeGould: Только что сделал это и теперь вижу, что версия всего 3.2.53, а не 3.2.54. Apple все еще на шаг позади.
@TraneFrancks Вы должны прочитать комментарий, который я сделал выше, где я заявляю: «Кроме того, хотя он и не полностью чист в исправлении — как указывали некоторые — это намного лучше, чем ничего». Так что в основном я считаю, что это нормально на данный момент и для большинства запаниковавших пользователей.
@JakeGould: я согласен. Я просто отметил разницу, так как переход с 3.2.54 на 3.2.53 может быть нежелательным для тех, кто уже пропатчил свои системы.

Во-первых, исправление bash и sh для этой уязвимости, скорее всего, сломает некоторые скрипты на вашем Mac. Вам действительно не нужно делать это, если вы не предлагаете веб-сервисы в общедоступном Интернете прямо с вашего Mac. Так что если это действительно не нужно, подождите, пока не выйдет официальное обновление безопасности от Apple.

Предупреждаем, вот несколько инструкций о том, как сделать это обновление с помощью Brew на Mavericks 10.9.

Сначала подтвердите, что вы используете устаревший bash:

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

Самая последняя версия bash — 4.3.25.

Если у вас не установлен Xcode, вам понадобятся инструменты командной строки Xcode, которые можно установить с помощью

$ xcode-select --install

Или с портала разработчиков .

Чтобы установить Brew ( http://brew.sh ):

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Затем выполните:

$ brew doctor

Следуйте инструкциям, если есть проблемы. Здесь решаются многие распространенные проблемы .

Затем обновите brew до последнего списка пакетов:

$ brew update

Чтобы получить последнюю версию bash 4.3.25:

$ brew install bash

Это устанавливает bash в/usr/local/Cellar/bash/4.3.25/bin/bash

Старый bashи shвсе еще существует по адресу /bin, поэтому после установки вы переименуете старые исполняемые файлы в новый файл.

$ sudo mv /bin/bash /bin/bash_old
$ sudo mv /bin/sh /bin/sh_old

Если вы очень параноик, вы можете удалить права на выполнение наbash_old

$ sudo chmod a-x /bin/bash_old /bin/sh_old

Затем создайте символическую ссылку на новый bash 4.3.25, который установил brew.

$ sudo ln -s /usr/local/Cellar/bash/4.3.25/bin/bash /bin/bash
$ sudo ln -s /usr/local/Cellar/bash/4.3.25/bin/bash /bin/sh

Перезагружаемся и готово.

Предупреждение — это может привести к поломке некоторых существующих сценариев оболочки, которые могут полагаться на bash 3.2 или различия, которые Mac shимеет по сравнению с linux sh. Существует гораздо более сложный ответ на замену bash и sh из исходников из ответа @TraneFranks в этой же теме.

Обновление с 3.2.51 до 3.2.52 нанесет гораздо меньший ущерб, чем обновление до 4.3.любого.
Предупреждаю, что это может привести к поломке некоторых скриптов, но 4.3.25 — это то, что Brew устанавливает как текущую — я пытаюсь предложить версию, которую легко установить, делая это с нуля. И всегда можно восстановить, переименовав старые исполняемые файлы обратно.
Эта ошибка может быть использована вредоносным DHCP-сервером (например, точкой доступа Wi-Fi) и может полностью вывести из строя ваш компьютер, поэтому ее стоит исправить как можно скорее. В других ответах есть лучшие инструкции по замене , /bin/bashи /bin/shэто, вероятно, вызовет меньше проблем, чем обновление до последней версии Brew bash.
Mac не может быть уязвим для атаки DHCP.
Атака сервера DCHP возможна только в том случае, если ваш DHCP-клиент использует сценарии Bash, чего нет в реализации OSX.
Это кажется довольно простым, но это не удается.mv: cannot move '/bin/bash' to '/bin/bash_old': Operation not permitted

OS X 10.6.8 — Снежный барс

Пост @AlBlue очень полный. Однако на моем сервере OS X 10.6.8 его исправление не будет работать. У Apple нет исправления для 10.6.8, и шаги, описанные @AlBlue, не работают с Xcode 3.2.6 (последняя версия для Snow Leopard). Я получаю сообщение об ошибке:

** BUILD FAILED **

The following build commands failed:
sh:
    CodeSign /Users/bas/bash-fix/bash-92/build/Release/sh
bash:
    CodeSign /Users/bas/bash-fix/bash-92/build/Release/bash
(2 failures)

По этой причине я использую brew.sh. Пожалуйста, прокомментируйте свои мысли, если у вас есть лучшее решение для OS X 10.6.8 Snow Leopard. См. Также комментарий @Jerome, у него был успешный патч для OS X 10.6.8 Snow Leopard с использованием решения @AlBlue. Тем не мение:

Сначала установите brew с помощью следующего лайнера:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Обновлятьbrew

brew update

Теперь просто установите последнюю версию bashи замените текущую:

brew install bash
sudo sh -c 'echo "/usr/local/bin/bash" >> /etc/shells'
chsh -s /usr/local/bin/bash
sudo mv /bin/bash /bin/bash-backup
sudo ln -s /usr/local/bin/bash /bin/bash

Вы можете установить оболочку входа по умолчанию ' Command (complete path)' для Terminal.app в его настройках ( Command,)введите описание изображения здесь


примечание: в комментариях некоторые пользователи не считают этот метод подходящим. Но для меня это единственный понятный метод обновления BASH на OS X 10.6.8 Snow Leopard.

Однако это не изменит версию bash, используемую при запуске терминала или запускаемую любым другим скриптом. скрипты, как правило, имеют #!/bin/sh или bash вверху, поэтому игнорируйте PATH
также некоторые скрипты полагаются на bash 3 и не работают с bash 4 (в macports исправлена ​​версия bash 4.3.25, которую, я полагаю, доморощенный пиво обновил до
ОП не запрашивал конкретную версию 3 или 4. Это просто еще один способ сделать это.
Не то решение, которое я выбрал, а +1 за полезную информацию, такую ​​​​как предпочтение «Оболочки, открытые с помощью».
Да, вам нужно предоставить bash 3.x, чтобы решить проблему.
Исправлен PATH и оболочка терминала по умолчанию.
Вы тоже не обновляетесь sh— вам тоже нужно это делать. /bin/sh!= /bin/bash. Многие инструменты работают, /bin/shкогда вы запускаете системные команды. Вызов Ruby system(), например, используется, /bin/shкогда у вас есть символ расширения оболочки, который необходимо расширить в строке. Вы играете в проигрышную игру, используя Homebrew для обновления двоичных файлов вашей системы IMO. Вы должны обновить Homebrew bash в дополнение к правильному обновлению двоичных файлов системы.
Имейте в виду, что OSX 10.8 и 10.9 используют Bash 3.2, поэтому для прямой согласованности я выбрал версию 3.2. Это также основано на официальной сборке Apple для предыдущей версии, которая может включать дополнительные функции, такие как расширенная осведомленность об атрибутах и ​​т. д.
Я без проблем обновил три машины 10.6.8 в соответствии с инструкциями по захвату и перекомпиляции BASH, приведенными в ответе AlBlue, появившемся в пятницу 10 сентября. 26 (т.е. без # ADD_IMPORT_FUNCTIONS_PATCH). Выполнение варочного обновления обновит эту версию, если вы установили ее таким образом. Вы уверены, что системный bash не используется где-либо еще? Если нет, выберите решение AlBlue.
@ Джером, я получаю сообщение об ошибке на xcodebuildшаге. Я запускаю xcode 3.2.6. Сначала кажется, что он собирается, но затем я получаю сообщение об ошибке: ** BUILD FAILED ** Не удалось выполнить следующие команды сборки: sh: CodeSign /Users/user/bash-fix/bash-92/build/Release/sh bash: CodeSign /Users/user/bash-fix/bash-92/build/Release/bash Это я застрял, есть идеи?
Я использую 3.2.6 на всех экземплярах. Я так понимаю, сборка не работает xcodebuild? Если да, то я такого не испытывал. У меня есть несколько веских предложений, чтобы дать вам в сторону: проверьте, есть ли у вас несколько сборок bash, рассмотрите возможность очистки (удаление brew) и, возможно, переустановите xcode... затем запустите процесс исправления заново.
@Jerome, очистка (удаление варки) и повторная установка xcode, а также описанный выше процесс исправления привели к той же ошибке. Но у меня должно быть что-то странное в моей системе, потому что я не видел эту ошибку в другом месте.
Я думаю, что единственный способ узнать это — построить то же самое на другой машине. Я понятия не имею, что может происходить; Я могу только инстинктивно сказать, что когда вы прикасаетесь к некоторым вещам с интерфейсом Apple OS X, как указано выше, возникает боль.
У меня были серьезные проблемы с управлением заданиями с собранным вручную стандартным bash-4.3 на Snow Leopard (если я запускаю emacs, а затем приостанавливаю его, я не могу возобновить его с помощью «fg»). С тех пор я загрузил исходный код Snow Leopard для bash с opensource.apple.com/release/mac-os-x-1068 , применил исправления с ftp.gnu.org/gnu/bash/bash-3.2-patches и пересобрал на гораздо лучший эффект.

Вы можете следовать инструкциям здесь: https://github.com/tjluoma/bash-fix В основном, сделайте следующее в терминале:

curl -s https://raw.githubusercontent.com/tjluoma/bash-fix/master/bash-fix.sh | zsh -f
Выполнение случайных сценариев оболочки из случайных учетных записей github — это не то, как вы получаете более безопасную ситуацию на любой машине. Вы хотите доверять конечной точке.
Здесь я должен согласиться с Яном. С помощью ненадежных сценариев оболочки очень легко нанести существенный ущерб, например проблемы, описанные в этих CVE.
Категорически не согласен с таким распространением FUD. ПРОЧИТАЙТЕ все сценарии оболочки перед их выполнением и только с https://.