Анализ безопасности показал переоценку защиты с использованием "capabilities"

Брэд Спенглер (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
  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.