Основано на реальных событиях.
Представьте себе, что у вас есть крупный проект, для которого необходимо собирать софт. А ещё у вас есть желание замутить сборочную ферму, на которой ваши подчинённые будут собирать нужный софт. А ещё это всё происходит под 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-е даже тем, кому доверяешь.
Автор: ImperfectCadenca