Из Глубины На Поверхность: Как, Зачем И Что Делать?

Основано на реальных событиях.

Представьте, что у вас есть большой проект, для которого вам нужно собрать программное обеспечение.

А еще у вас есть желание организовать сборочную ферму, где ваши подчиненные будут собирать необходимое программное обеспечение.

И все это происходит под Linux, и каждому необходимо с минимумом затрат организовать «чистую» среду.

Как это сделать? Несколько человек в зале подняли руки и воскликнули: «Chroot!» Вы согласились, что это просто, быстро и каждый получает все ресурсы хост-машины.

Все аплодировали, решение было принято.

И вот через неделю после внедрения этого решения и после увольнения сотрудника «Х» вы просыпаетесь, а на сервере девственно чистый жёсткий диск.

Злодей уничтожил труды разработчиков, работа остановилась.

Почему он смог удалить все, если находился в «защищенном» «заблокированном» chroot? Вся суть в том, что злодей мог взломать программы.

Или у него просто были рут права в приложении.

Начнем издалека.

В Linux помимо реальных файловых систем есть виртуальные.

Одной из таких систем является /proc/, файловая система информации ядра.

Например, команда

$ zcat /proc/config.gz

покажет нам содержимое конфига, с помощью которого было собрано загруженное ядро.

В этой файловой системе содержится масса информации, и она почти всегда необходима, когда вы что-то создаете под Linux. Соответственно, он монтировался в chroot, в котором сидел наш воин.

А поскольку chroot не предполагает загрузку собственного ядра, то он монтировался из хост-системы командой типа

mount -t proc proc /mnt/chrootme/proc/

и, что немаловажно, содержит информацию о хост-системе! В /proc есть папки типа /proc/$pid/cwd, в которых можно просмотреть содержимое папки, актуальной для данного процесса (а для текущего процесса также есть ярлык /proc/self/pid) .

Такие папки есть для всех запущенных процессов, включая init. Какая папка является текущей для init? Верно, /! А так как наш init хостовый, то задача «выйти наверх» сводится к тому, чтобы сделать

# chroot /proc/1/cwd/

и потираю руки: вуаля, мы на улице! Дальнейшая свобода действий ограничена лишь фантазией человека, воспользовавшегося уязвимостью.



Как не попасть в такую ситуацию?

  • Никогда не используйте chroot для незнакомцев!
  • Используйте виртуализацию для создания ферм сборок.

    Медленно, но безопасно (а с технологиями svm/vtx - не медленно).

  • Не давайте root (или даже малейшую возможность его получить) в chroot, даже тем, кому вы доверяете.

Теги: #linux #security #chroot #информационная безопасность
Вместе с данным постом часто просматривают: