Анализ безопасности показал переоценку защиты с использованием «capabilities»
10 января 2011 года
Брэд Спенглер (Brad Spengler), автор проекта grsecurity, представил отчет с результатами оценки надежности системы " capabilities" в Linux, предназначенной для выборочного предоставления определенных привилегированных действий или открытия доступа к определенным ресурсам (например, утилите ping можно открыть только доступ к raw-сокету, без делегирования остальных root-прав). Проведенное исследование показало неожиданные результаты: 19 из 35 существующих "capabilities" позволили совершить действия, которые в конечном итоге потенциально могут привести к получению полноценных прав пользователя root.
Для каждого из девятнадцати проблемных "capabilities" представлен метод получения прав полноценного суперпользователя в ситуации эксплуатации непривилегированных приложений, для которых выставлен только один из флагов "capabilities". Несмотря на то, что многие из методов расширения привилегий через проблемные "capabilities" имеют теоретический характер и требуют для эксплуатации определенных условий, по мотивам исследования уже подготовлен рабочий эксплоит, демонстрирующий процесс расширения флага CAP_SYS_ADMIN до полноценного root-доступа. Эксплоит работает только на 32-разрядных системах с Linux-ядром до версии 2.6.35 (например, Ubuntu 10.10) и дополнительно использует ошибку в реализации протокола Phonet.
Эксплоит использует CAP_SYS_ADMIN в сочетании с передачей отрицательного индекса протокола для подстановки серии фиктивных структур на уровне пользователя и инкрементирования произвольного адреса в ядре, что в конечном итоге позволяет выполнить код на уровне ядра. Представленный в эксплоите метод намеренно усложнен для демонстрации наличия не очевидных вариантов. В простейшем случае, имея права CAP_SYS_ADMIN, можно примонтировать собственную файловую систему поверх части текущей ФС. Другие варианты - осуществить подстановку команд в открытый администратором shell через формирование TIOCSTI ioctl к /dev/tty или перенаправить сетевой порт для переброса SSH-запросов на свой обработчик, предназначенный для сбора паролей.
Примечательно, что статья о недостатках "capabilities" опубликована во время начала воплощения в жизнь инициативы по замене suid-бита на "capabilities" во всех программах будущих релизов Ubuntu и Fedora. Ожидалось, что переход на "capabilities" позволит понизить опасность от эксплуатации уязвимостей в приложениях, требующих расширенных привилегий, что в итоге значительно повысит безопасность системы. В ситуации когда большинство "capabilities" позволяют обходными путями теоретически получить root-доступ, в сочетании с ранее публиковавшимися предупреждениями о необходимости переработки и аудита кода некоторых программ для полноценной поддержки "capabilities", итог инициатив по полному уходу от suid-бита может отрицательно сказаться на безопасности. В частности, приводится пример, когда suid-утилита на начальной стадии своей работы выполняет требующее повышенных привилегий действие и затем сразу сбрасывает повышенные привилегии. Если в такой утилите заменить suid на "capabilities" без добавления кода сброса полученных привилегий, то данные привилегии останутся доступны на протяжении всего времени работы программы.
В качестве примеров приложений, для защиты которых используется хотя бы один проблемный флаг "capabilities" приводятся:
- rsyslogd/syslogd (CAP_SYS_ADMIN, CAP_DAC_OVERRIDE, CAP_DAC_READ_SEARCH)
- cron (CAP_SETUID, CAP_SETGID)
- login (CAP_SETUID, CAP_SETGID, CAP_FSETID, CAP_CHOWN)
- cvs (CAP_DAC_OVERRIDE, CAP_SETUID, CAP_FSETID)
- postfix (CAP_DAC_OVERRIDE, CAP_KILL, CAP_SETUID, CAP_SETGID, CAP_SYS_CHROOT)
- apache (CAP_KILL, CAP_SETUID, CAP_SETGID)
- sshd (CAP_KILL, CAP_SYS_TTY_CONFIG, CAP_SETUID, CAP_SETGID, CAP_CHOWN)
- xinetd (CAP_SETUID, CAP_SETGID)
- procmail (CAP_SETUID, CAP_SETGID, CAP_DAC_OVERRIDE)
Проблемные "capabilities" (стоит отметить, что в списке представлены достаточно редко используемые или очевидно небезопасные флаги):
- CAP_SYS_ADMIN - включает достаточно широкий спектр административных операций, включая монтирование ФС, управление квотами и т.п. Методы расширений привилегий были представлены выше;
- CAP_SYS_TTY_CONFIG - можно изменить раскладку клавиатуры для терминала администратора, что в конечном итоге может быть использовано для выполнения не той команды, которая подразумевалась (rm вместо ls);
- CAP_MKNOD - можно создать доступное пользователю на запись блочное устройство, которое будет отождествлено с рабочим системным диском;
- CAP_SYS_PTRACE - можно выполнить подстановку кода в процессе выполнения трассировки привилегированного процесса;
- CAP_SYS_RAWIO - можно выполнить маппинг NULL-страницы для эксплуатации повсеместно встречающихся уязвимостей, связанных с разыменованием NULL-указателей. Также возможно совершение атак через FIBMAP ioctl;
- CAP_SYS_MODULE - позволяет модифицировать ядро;
- CAP_SETFCAP - имея полный доступ к файлам, легко получить полный root-доступ;
- CAP_FSETID, CAP_SETGID - можно получить привилегии GID 0 или GID staff, а затем модифицировать некоторые системные файлы доступные на запись для данных GID (например, содержимое /usr/local в Debian);
- CAP_SETUID - не запрещает сменить id на 0;
- CAP_DAC_OVERRIDE - можно модифицировать бинарный файл, который затем будет запущен пользователем root;
- CAP_SETPCAP - позволяет организовать сохранение установленных "capabilities" для дочерних процессов;
- CAP_IPC_OWNER - позволяет контролировать содержимое приватных данных в IPC;
- CAP_FOWNER, CAP_CHOWN - можно поменять права доступа на такие файлы, как /etc/shadow и /root/.ssh/*;
- CAP_SYS_CHROOT - можно подготовить chroot-окружение с подставным libc и организовать проброс из него жесткой ссылки на внешний suid root-файл, при выполнении которого в chroot функции подмененной libc будут выполнены с root-правами;
- CAP_DAC_READ_SEARCH - можно прочитать содержимое /etc/shadow и /root/.ssh/*;
- CAP_SYS_BOOT - можно загрузить подставное ядро через систему kexec_load;
- CAP_AUDIT_CONTROL - можно задействовать netlink-команды AUDIT_TTY_GET/AUDIT_TTY_SET для логгирования ввода/вывода для заданного tty и перехватить таким образом пароль root.
"Capabilities" допускающие проведение некоторых видов атак:
- CAP_KILL - можно завершить процесс, обслуживающий сетевой порт c номером выше 1024 и запустить вместо него свой обработчик;
- CAP_NET_ADMIN - позволяет организовать перенаправление сетевого порта на свой обработчик;
- CAP_NET_RAW - позволяет организовать сниффинг транзитного трафика с целью выявления паролей.
- "Capabilities" для которых пока не найдено обходных путей:
- CAP_LINUX_IMMUTABLE
- CAP_NET_BROADCAST
- CAP_NET_BIND_SERVICE;
- CAP_IPC_LOCK
- CAP_SYS_PACCT
- CAP_SYS_NICE;
- CAP_SYS_RESOURCE
- CAP_SYS_TIME
- CAP_LEASE
- CAP_AUDIT_WRITE
- CAP_MAC_OVERRIDE
- CAP_MAC_ADMIN
- CAP_SYSLOG
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.