Это фактически три части вопроса, которые я объясню ниже, но вопросы:Отладка Setuid программы/«Доступ запрещен» с УИП
- Использование GDB, как я могу запустить часть программа с полномочиями root, а остальное с нормальным?
- Зачем мне «разрешено запрещать» с помощью mkstemp для создания файла в/tmp в программе setuid (to root)?
- Почему «sudo program_name» выполняет какие-либо разные действия только от ./program_name с помощью setuid для root?
У меня есть программа на C, работающая на Linux (несколько дистрибутивов), которая обычно запускается пользователем с нормальными привилегиями, но некоторые части программы должны работать с правами root. Для этого я использовал флаг set-UID, и это работает отлично, насколько это возможно.
Однако, теперь я хотел бы отлаживать программу с обычными полномочиями пользователей, и я считаю, что у меня есть catch-22. Я только что добавил функцию для создания временного файла (/ tmp/my_name-XXXXXX), и эта функция вызывается из многих точек внутри программы. По какой-то причине, эта функция выдает следующее сообщение при запуске:
sh: /tmp/my_name-hhnNuM: Permission denied
(конечно, фактическое имя изменяется.) И все же, программа способна выполнять сырец функцию сокета, что я абсолютно не знаю, может быть сделано пользователей, отличных от root. (Если я удаляю флаг setuid, программа терпит неудачу.)
Если я запускаю эту программу через gdb без sudo, она умирает от сырых сокетов (поскольку gdb, по-видимому, не делает - или, вероятно, не может - почитать флаг setuid в программе). Если я запустил его под «sudo gdb», тогда все будет хорошо. Если я запускаю его как «SUDO ./my_name, все работает отлично
Вот низкоспиновое -l выход для этой программы:.
-rwsr-xr-x 1 root root 48222 Jun 23 08:14 my_name
Так мои вопросы, в частности, нет порядка:
- (Как) могу ли я запускать разные части программы с различным эффективным UID под gdb?
- Почему «sudo ./program» отличается от «./program», когда ./program имеет set-uid для root?
- Почему mkstemp терпит неудачу при вызове обычного пользователя в программе setuid (to root)?
Замечательно! mkstemp() использовался для создания сообщения электронной почты, а затем sendmail должен был прочитать файл и отправить его. Мне не пришло в голову, что, конечно, процесс sendmail не принял полномочия его родителя. (На платформе, которую я обычно программирую для: AS/400/iSeries/System i, такое усыновление является естественным. Это мое оправдание, и я придерживаюсь этого!) Спасибо! И спасибо за напоминание о том, как отлаживать запущенный процесс! – Dennis