Содержание статьи
По данным cvedetails.com, с 1999 года в ядре Linux найдено 1305 уязвимостей, из которых 68 — в 2015-м. Большинство из них не несут особых проблем, помечены как Local и Low, а некоторые можно вызвать только с привязкой к определенным приложениям или настройкам ОС. В принципе, цифры небольшие, но ядро — это не вся ОС. Уязвимости находят и в GNU Coreutils, Binutils, glibs и, конечно же, в пользовательских приложениях. Разберем самые интересные.
Уязвимости в ядре Linux
ОС: Linux
Уровень: Medium, Low
Вектор: Remote
CVE: CVE-2015-3331, CVE-2015-4001, CVE-2015-4002, CVE-2015-4003
Exploit: концепт, https://lkml.org/lkml/2015/5/13/740, https://lkml.org/lkml/2015/5/13/744
Уязвимость, найденная в июне в ядре Linux до 3.19.3, в функции __driver_rfc4106_decrypt в файле arch/x86/crypto/aesni-intel_glue.c связана с тем, что реализация RFC4106 для процессоров x86, поддерживающих расширение системы команд AES AES-NI (предложена Intel, Intel Advanced Encryption Standard Instructions), в некоторых случаях неправильно вычисляет адреса буферов. Если IPsec-туннель настроен на использование этого режима (алгоритм AES — CONFIG_CRYPTO_AES_NI_INTEL), уязвимость может приводить к повреждению содержимого памяти, аварийным остановкам и потенциально к удаленному выполнению кода CryptoAPI. Причем самое интересное, что проблема может возникнуть сама по себе, на вполне легальном трафике, без вмешательства извне. На момент публикации проблема была устранена.
В драйвере Linux 4.0.5 ozwpan, имеющем статус экспериментального, выявлено пять уязвимостей, четыре из них позволяют организовать DoS-атаку через крах ядра, отправив специально оформленные пакеты. Проблема связана с выходом за границы буфера из-за некорректной обработки знаковых целых чисел, при котором вычисление в memcpy между required_size и offset возвращало отрицательное число, в итоге данные копируются в кучу. Находится в функции oz_hcd_get_desc_cnf в drivers/staging/ozwpan/ozhcd.c и в функциях oz_usb_rx и oz_usb_handle_ep_data файла drivers/staging/ozwpan/ozusbsvc1.c. В других уязвимостях возникала ситуация возможного деления на 0, зацикливания системы или возможность чтения из областей вне границ выделенного буфера.
Драйвер ozwpan, одна из новинок Linux, может быть сопряжен с существующими беспроводными устройствами, совместимыми с технологией Ozmo Devices (Wi-Fi Direct). Предоставляет реализацию хост-контроллера USB, но фишка в том, что вместо физического подключения периферия взаимодействует через Wi-Fi. Драйвер принимает сетевые пакеты c типом (ethertype) 0x892e, затем разбирает их и переводит в различную функциональность USB. Пока используется в редких случаях, поэтому его можно отключить, выгрузив модуль ozwpan.ko.
Linux Ubuntu
ОС: Linux Ubuntu 12.04–15.04 (ядро до 15 июня 2015 года)
Уровень: Critical
Вектор: Local
CVE: CVE-2015-1328
Exploit: https://www.exploit-db.com/exploits/37292/
Критическая уязвимость в файловой системе OverlayFS позволяет получить права root в системах Ubuntu, в которых разрешено монтирование разделов OverlayFS непривилегированным пользователем. Настройки по умолчанию, необходимые для эксплуатации уязвимости, используются во всех ветках Ubuntu 12.04–15.04. Сама OverlayFS появилась в ядре Linux относительно недавно — начиная с 3.18-rc2 (2014 год), это разработка SUSE для замены UnionFS и AUFS.
OverlayFS позволяет создать виртуальную многослойную файловую систему, объединяющую несколько частей других файловых систем. ФС создается из нижнего и верхнего слоев, каждый из которых прикрепляется к отдельным каталогам. Нижний слой используется только для чтения в каталогах любых поддерживаемых в Linux ФС, включая сетевые. Верхний слой обычно доступен на запись и перекрывает данные нижнего слоя, если файлы дублируются. Востребована в Live-дистрибутивах, системах контейнерной виртуализации и для организации работы контейнеров некоторых настольных приложений. Пространства имен для пользователей (user namespaces) позволяют создавать в контейнерах свои наборы идентификаторов пользователей и групп.
Уязвимость вызвана некорректной проверкой прав доступа при создании новых файлов в каталоге нижележащей ФС. Если ядро собрано с параметром CONFIG_USER_NS=y (включение пользовательского пространства имен), а при монтировании указан флаг FS_USERNS_MOUNT, OverlayFS может быть смонтирована обычным пользователем в другом пространстве имен, в том числе там, где допускаются операции с правами root. При этом операции с файлами с правами root, выполненные в таком namespaces, получают те же привилегии и при выполнении действий с нижележащей ФС. Поэтому можно смонтировать любой раздел ФС и просмотреть или модифицировать любой файл или каталог.
На момент публикации уже было доступно обновление ядра с исправленным модулем OverlayFS от Ubuntu. И если система обновлена, проблем быть не должно. В том же случае, когда обновление невозможно, в качестве временной меры следует отказаться от использования OverlayFS, удалив модуль overlayfs.ko.
Уязвимости в основных приложениях
ОС: Linux
Уровень: Critical
Вектор: локальная, удаленная
CVE: CVE-2015-0235
Exploit: https://www.qualys.com/research/security-advisories/exim_ghost_bof.rb
Опасная уязвимость в стандартной библиотеке GNU glibc, которая является основной частью ОС Linux, и в некоторых версиях Oracle Communications Applications и Oracle Pillar Axiom, обнаруженная во время аудита кода хакерами из Qualys. Получила кодовое имя GHOST. Заключается в переполнении буфера внутри функции __nss_hostname_digits_dots(), которую используют для получения имени узла такие функции glibc, как gethostbyname() и gethostbyname2() (отсюда и название GetHOST). Для эксплуатации уязвимости нужно вызвать переполнение буфера при помощи недопустимого аргумента имени хоста приложению, выполняющему разрешение имени через DNS. То есть теоретически эту уязвимость можно применить для любого приложения, использующего в той или иной мере сеть. Может быть вызвано локально и удаленно, позволяет выполнить произвольный код. Самое интересное, что ошибка была исправлена еще в мае 2013 года, между релизами glibc 2.17 и 2.18 был представлен патч, но проблему не классифицировали как патч безопасности, поэтому на нее внимания не обратили. В итоге многие дистрибутивы оказались уязвимы. Вначале сообщалось, что самая первая уязвимая версия — 2.2 от 10 ноября 2000 года, но есть вероятность ее появления вплоть до 2.0. Среди прочих уязвимости были подвержены дистрибутивы RHEL/CentOS 5.x–7.x, Debian 7 и Ubuntu 12.04 LTS. В настоящее время доступны исправления. Сами хакеры предложили утилиту, поясняющую суть уязвимости и позволяющую проверить свою систему. В Ubuntu 12.04.4 LTS все нормально:
$ wget https://goo.gl/RuunlE
$ gcc gistfile1.c -o CVE-2015-0235
$ ./CVE-2015-0235
not vulnerable
Практически сразу был выпущен модуль к Metasploit, позволяющий удаленно выполнить код на x86 и x86_64 Linux с работающим почтовым сервером Exim (с включенным параметром helo_try_verify_hosts или helo_verify_hosts). Позже появились и другие реализации, например модуль Metasploit для проверки блога на WordPress.
Чуть позже, в 2015 году, в GNU glibc были обнаружены еще три уязвимости, позволяющие удаленному пользователю произвести DoS-атаку или переписать ячейки памяти за пределами границы стека: CVE-2015-1472, CVE-2015-1473, CVE-2015-1781.
ОС: Linux (GNU Coreutils)
Уровень: Low
Вектор: Local, Remote
CVE: CVE-2014-9471
Exploit: нет
GNU Сoreutils — один из основных пакетов *nix, включающий практически все базовые утилиты (cat, ls, rm, date...). Проблема найдена в date. Ошибка в функции parse_datetime позволяет удаленному атакующему, не имеющему учетной записи в системе, вызвать отказ в обслуживании и, возможно, выполнить произвольный код, используя специально сформированную строку даты с использованием timezone. Уязвимость выглядит так:
$ touch '--date=TZ="123"345" @1'
Segmentation fault
$ date -d 'TZ="Europe/Moscow" "00:00 + 1 hour"'
Segmentation fault
$ date '--date=TZ="123"345" @1'
*** Error in `date': free(): invalid pointer: 0xbfc11414 ***
Если уязвимости нет, получим сообщение о неверном формате даты. О наличии уязвимости отчитались практически все разработчики дистрибутивов Linux. В настоящее время доступно обновление.
ОС: Linux (grep 2.19–2.21)
Уровень: Low
Вектор: Local
CVE: CVE-2015-1345
Exploit: нет
В утилите grep, которая используется для поиска текста по шаблону, редко находят уязвимости. Но эту утилиту часто вызывают другие программы, в том числе и системные, поэтому наличие уязвимостей гораздо проблематичнее, чем кажется на первый взгляд. Ошибка в bmexec_trans function в kwset.c может привести к чтению неинициализированных данных из области за пределами выделенного буфера или краху приложения. Этим может воспользоваться хакер, создав специальный набор данных, подаваемых на вход приложения при помощи grep -F. В настоящее время доступны обновления. Эксплоитов, использующих уязвимость, или модуля к Metasploit нет.
Уязвимость в FreeBSD
ОС: FreeBSD
Уровень: Low
Вектор: Local, Remote
CVE: CVE-2014-0998, CVE-2014-8612, CVE-2014-8613
Exploit: https://www.exploit-db.com/exploits/35938/
В базе CVE за 2015 год не так уж много уязвимостей, если точнее — всего шесть. Сразу три уязвимости были найдены в FreeBSD 8.4–10.х в конце января 2015-го исследователями из Core Exploit Writers Team. CVE-2014-0998 связана с реализацией драйвера консоли VT (Newcons), который предоставляет несколько виртуальных терминалов, включаемых параметром kern.vty=vt в /boot/loader.conf.
CVE-2014-8612 проявлялась при использовании протокола SCTP и вызвана ошибкой в коде проверки идентификатора потока SCTP, реализующего SCTP-сокеты (локальный порт 4444). Суть в ошибке выхода за пределы памяти в функции sctp_setopt() (sys/netinet/sctp_userreq.c). Это дает локальному непривилегированному пользователю возможность записать или прочитать 16 бит данных памяти ядра и повысить свои привилегии в системе, раскрыть конфиденциальные данные или положить систему.
CVE-2014-8613 позволяет инициировать разыменование нулевого указателя при обработке полученного извне SCTP-пакета, при установке SCTP_SS_VALUE опции сокета SCTP. В отличие от предыдущих, CVE-2014-8613 может быть использована для удаленного вызова краха ядра через отправку специально оформленных пакетов. В FreeBSD 10.1 защититься можно, установив переменную net.inet.sctp.reconfig_enable в 0, тем самым запретив обработку блоков RE_CONFIG. Или просто запретить использовать SCTP-соединения приложениям (браузерам, почтовым клиентам и так далее). Хотя на момент публикации разработчики уже выпустили обновление.
Уязвимость в OpenSSL
ОС: OpenSSL
Уровень: Remote
Вектор: Local
CVE: CVE-2015-1793
Exploit: нет
В 2014 году в OpenSSL, широко используемом криптографическом пакете для работы с SSL/TLS, была найдена критическая уязвимость Heartbleed. Инцидент в свое время вызвал массовую критику качества кода, и, с одной стороны, это привело к появлению альтернатив вроде LibreSSL, с другой — сами разработчики наконец взялись за дело.
Критическая уязвимость обнаружена Адамом Лэнгли из Google и Дэвидом Бенджамином из BoringSSL. Изменения, внесенные в OpenSSL версий 1.0.1n и 1.0.2b, привели к тому, что OpenSSL пытается найти альтернативную цепочку верификации сертификата, если первая попытка построить цепочку подтверждения доверия не увенчалась успехом. Это позволяет обойти процедуру проверки сертификата и организовать подтвержденное соединение с использованием подставного сертификата, говоря другими словами — спокойно заманивать пользователя на поддельные сайты или сервер электронной почты или реализовать любую MITM-атаку там, где используется сертификат.
После обнаружения уязвимости разработчики 9 июля выпустили релизы 1.0.1p и 1.0.2d, в которых эта проблема устранена. В версиях 0.9.8 или 1.0.0 этой уязвимости нет.
Linux.Encoder
Конец осени ознаменовался появлением целого ряда вирусов-шифровальщиков, вначале Linux.Encoder.0, затем последовали модификации Linux.Encoder.1 и Linux.Encoder.2, заразивших более 2500 сайтов. По данным антивирусных компаний, атаке подвергаются серверы на Linux и FreeBSD с веб-сайтами, работающими с использованием различных CMS — WordPress, Magento CMS, Joomla и других. Хакеры используют неустановленную уязвимость. Далее размещался шелл-скрипт (файл error.php), при помощи которого и выполнялись любые дальнейшие действия (через браузер). В частности, запускался троян-энкодер Linux.Encoder, который определял архитектуру ОС и запускал шифровальщик.
Энкодер запускался с правами веб-сервера (Ubuntu — www-data), чего вполне достаточно, чтобы зашифровать файлы в каталоге, в котором хранятся файлы и компоненты CMS. Зашифрованные файлы получают новое расширение .encrypted. Также шифровальщик пытается обойти и другие каталоги ОС, если права настроены неправильно, то он вполне мог выйти за границы веб-сайта. Далее в каталоге сохранялся файл README_FOR_DECRYPT.txt, содержащий инструкции по расшифровке файлов и требования хакера. На данный момент антивирусные компании представили утилиты, позволяющие расшифровать каталоги. Например, набор от Bitdefender. Но нужно помнить, что все утилиты, предназначенные для расшифровки файлов, не удаляют шелл-код и все может повториться.
Учитывая, что многие пользователи, занимающиеся разработкой или экспериментирующие с администрированием веб-сайтов, часто устанавливают веб-сервер на домашнем компьютере, следует побеспокоиться о безопасности: закрыть доступ извне, обновить ПО, эксперименты устраивать на VM. Да и сама идея может в будущем использоваться при атаке на домашние системы.
Вывод
Сложного ПО без ошибок физически не существует, поэтому придется мириться с тем фактом, что уязвимости будут обнаруживаться постоянно. Но не все они могут представлять действительно проблемы. И можно себя обезопасить, предприняв простые шаги: удалить неиспользуемое ПО, отслеживать новые уязвимости и обязательно устанавливать обновления безопасности, настроить брандмауэр, установить антивирус. И не забывать о специальных технологиях вроде SELinux, которые вполне справляются при компрометации демона или пользовательского приложения.