chroot + execvp + bash - PullRequest
       16

chroot + execvp + bash

8 голосов
/ 31 октября 2008

Обновление

Понял! Смотрите мое решение (пятый комментарий)

Вот моя проблема:

Я создал небольшой двоичный файл под названием «jail» и в / etc / password я сделал его оболочкой по умолчанию для тестового пользователя.

Вот - упрощенный - исходный код:

#define HOME "/home/user"
#define SHELL "/bin/bash"
...
if(chdir(HOME) || chroot(HOME)) return -1;
...
char *shellargv[] = { SHELL, "-login", "-rcfile", "/bin/myscript", 0 };
execvp(SHELL, shellargv);

Что бы я ни старался, похоже, что когда мой тестовый пользователь входит в систему, / bin / myscript никогда не будет получен. Аналогичным образом, если я уроню файл .bashrc в домашний каталог пользователя, он также будет проигнорирован.

С чего бы паршивым снобам эти парни?

-

Некоторые точности, не обязательно относящиеся к делу, но для прояснения некоторых моментов, высказанных в комментариях:

  • Двоичный файл 'jail' на самом деле suid, что позволяет ему успешно выполнять chroot ().
  • Я использовал 'ln', чтобы сделать соответствующие двоичные файлы доступными - моя тюремная камера хорошо заполнена:)
  • Кажется, проблема не в том, чтобы синхронизировать пользователя ... что-то еще - упущение.

Ответы [ 5 ]

4 голосов
/ 31 октября 2008

Как говорит Джейсон С., исполняемая оболочка не является интерактивной.

Его решение заставит оболочку быть интерактивной, если она примет -i, что означает (и bash делает):

char *shellargv[] = { SHELL, "-i", "-login", ... };
execvp(SHELL, shellargv);

Я хочу добавить, что традиционно оболочка будет действовать как оболочка входа в систему, если ARGV[0] начинается с тире.

char *shellargv[] = {"-"SHELL, "-i", ...};
execvp(SHELL, shellargv);

Обычно, однако, Bash автоматически определяет, должен ли он работать в интерактивном режиме или нет. Его сбой в вашем случае может быть из-за отсутствия /dev/* узлов.

2 голосов
/ 31 октября 2008

Я могу отождествить себя с желанием сделать это самостоятельно, но если вы еще этого не сделали, проверьте проект jail chroot и jailkit , чтобы узнать о некоторых инструментах для создания оболочки тюрьмы. ,

2 голосов
/ 31 октября 2008

Оболочка не является интерактивной. Попробуйте добавить -i в список аргументов.

1 голос
/ 01 ноября 2008

Спасибо за вашу помощь, ребята,

Я понял это:

Я забыл setuid () / setgid () , chroot (), setuid () / setgid () обратно, затем передать правильную среду, используя execve ()

О, и, если я не передам аргумент bash, он получит ~ / .bashrc

Если я передам "-l", если будет источник / etc / profile

Ура!

1 голос
/ 31 октября 2008

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

Кроме того, привязка к домашнему каталогу пользователя сделает его оболочку бесполезной, так как (если у него там много всего), он не будет иметь доступа ни к каким двоичным файлам. Полезные вещи, например ls.

...