Свободный софт не перестаёт преподносить сюрпризы, но в этом году судьба отчего-то особенно щедра на сюрпризы неприятные. Обнародованная на днях дыра в командной оболочке Bourne Again SHell — более известной под сокращённым вариантом имени: bash — стала уже вторым таким «подарком» за несколько месяцев. Первым, если помните, была уязвимость в OpenSSL (см. «О Heartbleed человеческим языком»). Программные продукты разные, природа уязвимостей тоже непохожая, но оба случая роднит одно парадоксальное обстоятельство: и баг в bash, и в OpenSSL, лежали практически на виду много-много лет. Что там, bash даже установил печальный рекорд — уязвимость в нём практически ровесница операционной системе Linux! Такое долголетие противоречит одному из фундаментальных принципов open source (помните: чем больше глаз, тем меньше ошибок?) и тем не менее ошибка — вот она. И всем нам ещё предстоит расхлёбывать последствия.

Bash — если вдруг вы этого не знали или не задумывались — есть «прокладка» между операционной системой и пользователем, прокладка, позволяющая управлять системой вводом скучных текстовых команд: исполнять утилиты, обращаться к системным функциям, запускать программы и связывать их между собой. Это та самая пресловутая «голая консоль», которую (якобы) ненавидят поклонники графического интерфейса и которую (снова — якобы) обожают все поголовно линуксоиды и пользователи UNIX-систем. Впрочем, что правда, то правда: в «Юниксах» из консоли можно сделать всё или почти всё — за что, собственно, консоль и ценится. Здесь нет ничего лишнего, рабочее пространство максимально информативно, и даже необходимости находиться за конкретной машиной нет — ведь командная оболочка, консоль или как её иногда ещё называют, шелл, работает и через сетевое соединение.

Типичная bash-сессия.
Типичная bash-сессия.

В истории UNIX и Linux командных оболочек было множество, Bash — с момента своего появления в 1989 году и следующие примерно десять лет — занимал скромное место одного из. Лишь после взрыва популярности Linux в «нулевые» он стал лидером, шеллом по умолчанию для большинства популярных Linux-дистрибутивов, и прочих UNIX-производных, от OS до Android. Bash и по сей день остаётся одним из самых популярных (в смысле, устанавливаемых) системных приложений в мире Linux. А в составе других программных продуктов (Git, Cygwin) он забрался и на MS Windows, например.

Впрочем, шелл, командная оболочка, всё же не просто доступ к утилитам. Это ещё и высокоуровневый язык программирования, весьма удобный и потому востребованный в миллионах случаев. Написанные на таком языке программы в простонародье называют скриптами, с их помощью легко и быстро решаются задачи, которые на классических языках программирования потребовали бы серьёзных затрат времени. Программирование на том же bash очень похоже на игру в кубики: пользователь подбирает нужные компоненты системы (утилиты, программы), связывает их скриптом — и получает работающее решение. Такой «бытовой автоматизацией» увлекаются не только сисадмины или опытные юзеры, но и сама операционная система, и многие прикладные программы (вспомните «Войну инициализаторов»).

И именно здесь обнаружилась проблема: уязвимость Shellshock (тут игра слов: shell — это и оболочка, но и артиллерийский снаряд, так что в классическом понимании shellshock — шок от взрыва, контузия) заключается в способности bash исполнять команды, переданные косвенно, спрятанные в так называемых переменных среды (используемых чтобы помочь операционной системе выполнить ту или иную операцию быстрей: например, в переменных среды хранят пути к некоторым файлам). Ошибка не ошибка, скорее недосмотр — вкравшийся в bash ещё на ранних этапах разработки (считается, в начале 90-х годов). И только сейчас, почти четверть века спустя, кто-то обратил на него внимание!

Отсюда — масштаб трагедии. Институт NIST (один из авторитетов в вопросах кибербезопасности) оценил опасность Shellshock в 10 баллов из 10 возможных: эксплуатируется Shellshock элементарно, достаточно скормить программе, использующей bash, особым образом сформированный запрос (где вредоносные команды замаскированы под переменные среды), и — готово, нападающий «получает шелл» (то есть доступ к командной оболочке на атакуемом компьютере).

Один из способов проверки.  Текст, стоящий за пределами {;}; исполняться не должен, но исполняется всеми версиями bash вплоть до 4.3.
Один из способов проверки. Текст, стоящий за пределами {;}; исполняться не должен, но исполняется всеми версиями bash вплоть до 4.3.

А ведь на bash завязано бесчисленное множество программ, как офлайновых, так и онлайновых. Сложные программы частенько вызывают bash, чтобы выполнить ту или иную высокоуровневую системную операцию — и каждая такая программа теперь потенциально может стать распахнутой дверью для злоумышленников. «Башем» пользуются серверы (в первую очередь Apache, на котором держится половина всего киберпространства). На «Баш» опираются тысячи проприетарных прикладных программных продуктов: Oracle, например, только что предупредила, что три десятка её программ завязаны на bash. К услугам «Баш» прибегают и многие свободные приложения. Хуже того, bash встроен в миллионы «умных» (но увы, зачастую не подлежащих обновлению) интернет-устройств, начиная прямо с домашних точек беспроводного доступа.

Но что мешает залатать дыру? Дело в том, что если быть точным, Shellshock — не одна конкретная уязвимость в коде, которую можно исправить, заменив в исходниках bash команду X командой Y. Скорее это огромная дыра, обусловленная фундаментальным недосмотром на ранней стадии разработки. Вот почему даже проверить свою систему на наличие Shellshock не так-то просто: по состоянию на утро понедельника известны пять уязвимостей, подпадающих под определение Shellshock, и три способа проверки (см. Shellshocker.net ) — и если один даёт отрицательный результат, не факт, что два других не сработают тоже. Это же объясняет и почему до сих пор нет универсальной заплатки: даже трёх месяцев труда (первая из уязвимостей была обнаружена ещё летом, с тех пор шла тихая работа по созданию патчей) не хватило, чтобы устранить проблему. Уже высказано мнение, что для полного решения придётся менять структуру bash — а это совместимость со старыми версиями оболочки и потребует невероятных усилий, чтобы перепроверить на корректность каждую системную и прикладную программу, так или иначе bash использующую.

Что делать простому пользователю? В первую очередь обновить bash на своей персоналке. Выпущенные заплатки может быть и не решают проблему полностью, но по крайней мере уменьшают риск быть взломанным. Зондирование, заражение и формирование бот-сетей из заражённых через Shellshock машин уже идёт, а специалисты предрекают появление червя, который пожрёт уязвимые системы. Так что не ждите, обновитесь прямо сейчас.

shellshock-2

Ну а как же с парадоксальным несоответствием, упомянутым в самом начале? Ведь Shellshock явно противоречит open source-постулату об открытости как гаранте чистоты! Двадцать два года ошибка лежала буквально под носом (bash развивается под лицензией GNU GPL) у сотен миллионов пользователей и разработчиков, и никто не заметил.

Что тут сказать? Да, очевидно, не заметил. Не верьте только людям, которые попытаются использовать этот случай «наоборот»: наличие Shellshock вовсе не означает, что в проприетарных продуктах глупых ошибок меньше — там до вещей, лежащих на поверхности, тоже никому нет дела (примеры? Да возьмите хоть гнущийся iPhone 6). Кроме того — и это самое важное — свободный софт в силах «выплатить компенсацию».

Я говорю о разнообразии. В отличие от проприетарных продуктов, состав которых и конфигурация почти всегда одинаковы на всех использующих данный продукт компьютерах, свободные системы — чумовая смесь версий, форков, альтернатив. Идентичных свободных систем мало. Тот же bash — хоть и очень популярен, но далёк от статуса монополии. У пользователей Linux всегда есть возможность выбрать командную оболочку по вкусу (шеллы стандартизованы, в значительной степени взаимозаменяемы, и вариантов их масса). Так что часто bash хоть и включён в состав системы, не является оболочкой по умолчанию: в Debian GNU/Linux, например, такую роль играет dash, а на Android используется mksh.

Выгода очевидна: отсутствие монокультуры усложняет жизнь взломщикам, делает трудней написание вирусов. В таких условиях роль Shellshock сведётся почти к лечебной, санитарной: он уничтожит тех, кто «болен неизлечимо» (системы, не подлежащие обновлению) или игнорирует цифровую гигиену, но не затронет остальных.