На самом деле это вопрос из трех частей, который я объясню ниже, но вопросы таковы:
- Как с помощью gdb запустить часть программы с root-правами, а остальные с обычными?
- Почему я получаю «отказ в доступе» с помощью mkstemp для создания файла в /tmp в программе setuid (для root)?
- Почему «sudo имя_программы» будет работать иначе, чем просто ./имя_программы с setuid для root?
У меня есть программа C, работающая в Linux (несколько дистрибутивов), которая обычно запускается пользователем с обычными привилегиями, но некоторые части программы должны запускаться с правами root. Для этого я использовал флаг set-UID, и он прекрасно работает.
Однако теперь я хотел бы отладить программу с правами обычного пользователя, и обнаружил, что у меня есть уловка-22. Я только что добавил функцию для создания временного файла (/tmp/my_name-XXXXXX), и эта функция вызывается из многих точек программы. По какой-то причине эта функция выдает следующее сообщение при запуске:
sh: /tmp/my_name-hhnNuM: Permission denied
(конечно, фактическое имя может быть разным.) И тем не менее, программа может выполнять необработанные функции сокета, которые, как я точно знаю, не могут быть выполнены другими пользователями, кроме root. (Если я удалю флаг setuid, программа с треском провалится.)
Если я запускаю эту программу через gdb без sudo, она умирает из-за необработанных сокетов (поскольку gdb, по-видимому, не - или, вероятно, не может - учитывать флаг setuid в программе). Если я запускаю его под «sudo gdb», то все работает нормально. Если я запускаю его как «sudo ./my_name, все работает нормально.
Вот вывод ls -l для этой программы:
-rwsr-xr-x 1 root root 48222 Jun 23 08:14 my_name
Итак, мои вопросы в произвольном порядке:
- (Как) я могу запускать разные части программы с разными эффективными UID в gdb?
- Почему «sudo ./program» отличается от «./program», если ./program имеет root-uid?
- Почему mkstemp не работает при вызове обычным пользователем в программе setuid (для root)?