2008-10-31 3 views
8

Updateкорневым + execvp + баш

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

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

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

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

#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 в домашнем каталоге пользователя, он также будет проигнорирован.

Почему бы вам не помочь этим людям?

-

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

  • «Тюрьма» двоичный файл на самом деле SUID, тем самым позволяя ему Chroot() успешно.
  • Я использовал 'ln', чтобы сделать подходящие бинарные файлы доступными - моя ячейка для jake красиво дополнена :)
  • Проблема, похоже, не в том, чтобы chrooting пользователь ... что-то еще является недостатком.

ответ

2

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

4

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

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

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

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

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

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

1

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

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

2

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

1

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

Я понял это:

Я забыл УИП()/setgid(), корневым(), УИП()/setgid() назад, затем пройти соответствующую среду с помощью execve()

Ой, и, если я не передать никакого аргумента, чтобы колотить, он будет источником ~/.bashrc

Если я прохожу «-l», если будет источником /etc/profile

Cheers!

+0

Ах, я (ложно) предположил, что либо ваш chroot имел все в тех же местах, что и обычная система, или вы сначала исправляли окружающую среду. Недостаток setuid/gid back не должен нарушать это (хотя это устранит преимущество безопасности для chrooting). – ephemient 2008-11-01 04:34:46

 Смежные вопросы

  • Нет связанных вопросов^_^