Ограничение службы с помощью окружения «песочницы»

Иногда своевременной установки новейших обновлений недостаточно для предотвращения проникновения в систему. Зачастую новый способ прорыва долго циркулирует в частных кругах, до того как будет издано его официальное обновление. В течение этого времени ваши серверы остаются открытыми перед неожиданной атакой. Учитывая это, разумно принять превентивные меры по смягчению возможных последствий деятельности скомпрометированной службы. Один из способов достичь этого — запуск службы в окружении «песочницы» (sandbox environment). В идеальном случае скомпрометированная служба нанесет минимальный вред производительности системы.
Большинство систем, использующих Unix и Unix-подобные ОС, включают определенный тип системного вызова или иной механизм организации «песочницы», предлагающий различные уровни изоляции между узлом и этой «песочницей». Менее сдерживающей и простой в настройке является среда, создаваемая командой chrootC), которая доступна практически во всех Unix-подобных ОС. Помимо chrootC), ОС FreeBSD включает еще один механизм, называемый jail О, который имеет больше ограничений.
С помощью команды chrootO очень легко меняется корневой каталог процесса и всех его наследников. Несмотря на то что это очень мощная функция, существует множество противопоказаний для ее использования. Самое главное: у всего, что исполняется в «песочнице», не должно быть возможности изменить свой EUID (effective UID) на 0, соответствующий UID корневого каталога. Естественно, это подразумевает, что вы не собираетесь запускать в «тюрьме» ничего от  имени root. Если атакующий получит root-полномочия в «песочнице», то все усилия напрасны. Хотя он не сможет напрямик прорвать окружение «песочницы», но это не удержит его от запуска функции в адресном пространстве используемого процесса, что позволит прорваться в систему. Существует множество способов взлома «песочницы» chrootO. Однако все они основываются на возможности получения root-полномочий внутри этой «песочницы». Ахиллесовой пятой сИгооШявляется возможность получения UID 0 в «песочнице».
Существует ряд служб, поддерживающих среды chrootO за счет вызова этой функции из самой программы, но многие службы этого не позволяют. Для запуска таких служб внутри «песочницы» необходимо использовать команду enroot. Эта команда просто вызывает chrootO с первым аргументом командной строки и пытается выполнить программу, указанную в качестве второго аргумента. Если программа является статически связанным двоичным файлом, все, что необходимо сделать, — это скопировать программу в любое место внутри окружения «песочницы». Но если программа является динамически связываемой, то в окружение необходимо скопировать все поддерживающие ее библиотеки.
В качестве примера рассмотрим запуск bash в среде chrootO. Сначала попробуем запустить chroot без копирования библиотек, необходимых bash:
# mkdir -р /chroottest/bin
# ср /bin/bash /chroot_test/bin/
# chroot /chroot_test /bin/bash
chroot: /bin/bash: No such file or directory
Понятно, что для работы bash требуются библиотеки, которые можно найти с помощью команды Idd. После копирования библиотек снова попытаемся запустить chroot:
# Idd /bin/bash
libtermcap.so.2 => /lib/libtermcap.so.2  (0x4001a000) libdl.so.2 => /lib/libdl.so.2 (0x4001e000) libc.so.6 => /lib/tls/libc.so.6 (0x42000000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
# mkdir -p chroot_test/lib/tls && \
> (cd /lib: \
> cp libtermcap.so.2 libdl.so.2 ld-linux.so.2 /chroot_test/lib: \
> cd tls: cp libc.so.6 /chroot_test/lib/tls)
# chroot /chroot_test /bin/bash bash-2.05b#
bash-2.05b# echo /* /bin /lib
Настройка chroot-среды в основном состоит из попыток и ошибок при получении разрешений и приведении в порядок всех зависимых библиотек. Рассмотрите последствия помещения и других программ (таких как rnknod или mount) в chroot-окружение. Если бы это было возможно, то атакующий мог бы создать узлы устройств (device nodes) для непосредственного доступа к памяти или перемонтировать файловую систему, что привело бы к прорыву «песочницы»  и получению полного контроля над всей системой. Эту угрозу можно уменьшить, поместив каталог на файловую систему, монтируемую с параметрами, запрещающими использование файлов-устройств (device files) (трюк № 1), хотя это не всегда приемлемо. Желательно в chroot-каталоге иметь максимально возможное количество файлов и каталогов, принадлежащих root и доступных для записи только root, что сделает невозможным для процессов изменить любой из поддерживаемых файлов (к таким файлам относятся библиотеки и файлы настройки). В общем случае лучше иметь наиболее сильно ограничивающие разрешения и ослаблять их только в случае необходимости (например, если разрешения мешают нормальной работе демона).
Наилучшими кандидатами для chroot-среды являются службы, которым вообще не нужны root-полномочия. Например, MySQL по умолчанию «слушает» удаленные подключения на 3306-м порте. Поскольку номер порта больше 1024, демон mysqld может запускаться без root-привилегий, что позволит избежать риска быть использованным для получения root-доступа. Другие демоны, которым нужны root-привилегии, могут иметь параметр, позволяющий сбрасывать эти привилегии после завершения всех операций, для которых требуется root-доступ (например, привязки к порту с номером меньше 1024), но необходимо особое внимание, чтобы программа корректно сбрасывала полномочия. Если программа для сброса привилегий вместо setuidC) использует seteuidC), то по-прежнему сохраняется возможность получения root-доступа, которую может использовать атакующий. Специально изучите советы по обеспечению безопасности программ, которые запускаются только с root-привилегиями.
Может показаться, что если не помещать компиляторы, оболочки или такие утилиты, как rnknod, в окружение «песочницы», то их можно защитить в случае компрометации root-ограниченной среды. На самом деле атакующий может достичь такой же функциональности, сменив код из системы вызовов (/bin/sh) на вызов любой другой функции из библиотеки языка С или любой желаемый системный вызов. Если смонтировать файловую систему, которую программа из chroot -окружения запускает с использованием флага «только для чтения», это осложнит для атакующего установку собственного программного кода, но по-прежнему не станет броней. Если демон, который надо запустить в окружении, не удовлетворяет рассматриваемым ранее условиям, вам, вероятно, захочется использовать более мощный механизм «песочницы».
Один из таких механизмов доступен в ОС FreeBSD и реализуется он с помощью системного вызова jai 1 (). Этот вызов обеспечивает значительно больше ограничений при изоляции среды «песочницы» от основной системы и предоставляет дополнительные возможности, например назначение узлу IP-адресов виртуальных интерфейсов. Используя эту возможность, можно создать полностью виртуальный сервер либо просто запустить одну службу в среде «песочницы».
Так же, как и в случае с chrootO, система имеет команду jail, которая использует системный вызов jail О. Базовая форма этой команды:
jail new root   hostname ipaddr command

Метки: ,

Статьи по теме