Pull to refresh

Из чрута — на поверхность: как, почему и что делать?

Reading time 2 min
Views 25K
Основано на реальных событиях.

Представьте себе, что у вас есть крупный проект, для которого необходимо собирать софт. А ещё у вас есть желание замутить сборочную ферму, на которой ваши подчинённые будут собирать нужный софт. А ещё это всё происходит под Linux-ом, и каждому надо организовать «чистое» окружение с минимумом затрат. Как это сделать?

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

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

Почему же он сумел удалить всё, если был в «защищённом» «запертом» чруте?


Вся суть — в том, что злодей мог ставить в чрут программы. Или же просто обладал в чруте правами root.

Начнём издалека. В 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-е даже тем, кому доверяешь.
Tags:
Hubs:
+47
Comments 34
Comments Comments 34

Articles