Брэд Спенглер (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


    Источник: http://www.opennet.ru/opennews/art.shtml?num=29219