Как выполнять команды в chroot? - PullRequest
0 голосов
/ 09 ноября 2018

В моем исходном коде я делаю chroot, а затем имею некоторый код, выполняющий некоторые действия, затем я хочу выполнить команду linux. Но команда не работает, так как я изменил рут с помощью chroot.

здесь после исходного кода:

int main(void)
{

    if (chroot("/tmp") < 0)
        printf("error in chroot\n");

        /* some source code doing staffs */

    system("ls > /logloglog.txt"); // command failed

    return 0;
}

Как выполнить команду в chroot?

Или можно выйти из chrood, затем выполнить команду и снова вернуться в chroot?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

А как же:

system("chroot /tmp /bin/bash -c \"<COMMAND>\"");

Вы можете просто запустить chroot, используя систему напрямую и с помощью команды -c execute внутри / tmp environment

0 голосов
/ 09 ноября 2018

Если вы используете chroot(), вы должны учитывать последствия того, что вы делаете. Одним из основных последствий является то, что многие (большинство, все) обычно доступных команд недоступны, если вы не сделаете их доступными в среде chroot().

Правильно выполнять эту работу нетривиально. Вам может потребоваться, чтобы части /dev, /bin, /etc, /usr, /lib (и, возможно, другие тоже) были установлены соответствующим образом в новом корневом каталоге. Символические ссылки обратно «вне среды chroot()», как правило, не будут работать. Вы должны сделать копии того, что важно. Один из побочных эффектов всего этого: /tmp очень редко является подходящим местом для создания полностью операционной среды chroot(). Возможно, вам подойдет подкаталог с ограниченным доступом в /tmp, но помещение пользователя в /tmp не очень хорошо изолирует его от других пользователей или других пользователей.

Еще одна важная возможность: вы не предоставляете пользователю доступ к другим командам после выполнения chroot(). То есть вы не пытаетесь использовать system() в своем коде; и вы не предоставляете жертве пользователю доступ к оболочке или утилитам оболочки.

Использование chroot() - это не то, что вы делаете случайно, другими словами. Чтобы хорошо выполнять свою работу, нужно тщательно продумать и подготовиться.

Не лучше ли вам использовать какой-нибудь контейнер или виртуальную машину?

Используйте Google или любую другую поисковую систему для поиска таких терминов, как:

  • «Побег из тюрьмы»
  • 'chroot jail setup'
  • 'chroot jail vs docker'

Можно ли выйти из chroot, затем выполнить команду и снова вернуться к chroot?

Не совсем. Вы можете иметь управляющую программу, которая разветвляет дочерний элемент, который выполняет chroot() и обрабатывает материал, а затем завершает работу, так что управляющая программа может выполнять свою работу (выполнять команду), а затем вы можете разветвить другого дочернего элемента, который возвращается в chroot() тюрьма. Но это не то же самое, что текущий процесс выхода из тюрьмы - это сделает chroot() полностью неэффективным, если какая-либо программа может отменить время тюрьмы по прихоти и возобновить неопознанную активность.

...