Зачем мне нужен setuid (0) внутри программы setuid-root C, которая вызывает административную программу с помощью system ()? - PullRequest
11 голосов
/ 27 июня 2009

Я должен был сделать грязный взлом Linux для кого-то, чтобы он мог запустить принтер с помощью команды оболочки cupsenable printername, не будучи пользователем root. Я не хотел, чтобы они могли использовать весь синтаксис cupsenable в качестве пользователя root, поэтому я просто написал оболочку C, которая очищает входные данные в argv[1] и вызывает system("cupsenable sanitizedprintername").

Я установил в программе setuid root, но даже в этом случае cupsenable завершился неудачно с «отказано в доступе». Затем я вставил вызов setuid(0) перед system(), и вот, это сработало.

Не обращайте внимания на то, что существует лучший способ предоставить пользователям контроль над принтером. Там, вероятно, есть лучший способ. Меня интересуют тонкости chmod u+s против setuid(0) против system(). Почему он так себя вел?

1 Ответ

19 голосов
/ 27 июня 2009

С man system:

Не используйте system() из программы с привилегиями set-user-ID или set-group-ID, потому что странные значения для некоторых переменных среды могут использоваться для нарушения целостности системы. Вместо этого используйте семейство функций exec(3), но не execlp(3) или execvp(3). system() фактически не будет работать должным образом с программами с привилегиями set-user-ID или set-group-ID в системах, в которых /bin/sh является bash версии 2, поскольку bash 2 отбрасывает привилегии при запуске.

А с man bash:

Если оболочка запущена с эффективным идентификатором пользователя (группы), не равным реальному идентификатору пользователя (группы), и опция -p не указана, файлы запуска не читаются, функции оболочки не наследуются от environment, переменная SHELLOPTS, если она появляется в среде, игнорируется, и эффективный идентификатор пользователя устанавливается равным реальному идентификатору пользователя.

Похоже, ваш setuid(0) вызов обошел эту защиту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...