2009-06-26 3 views
11

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

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

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

ответ

17

От man system:

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

И от man bash:

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

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

+2

Whoa. Ну, я сказал, что это грязно. Кажется, что я сделал, это убедить процесс bash, порожденный system(), что я на самом деле, действительно, честно был root, клянусь Богом. Кажется, что некоторые рефакторинги в порядке. – JCCyC