Това всъщност е въпрос от три части, който ще обясня по-долу, но въпросите са:
- Използвайки gdb, как мога да стартирам част от програма с root права, а останалата част с нормални?
- Защо бих получил „отказано разрешение“ с помощта на mkstemp за създаване на файл в /tmp в програма setuid (за root)?
- Защо "sudo program_name" ще работи по различен начин от просто ./program_name със 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 има set-uid на root?
- Защо mkstemp ще се провали, когато се извика от нормален потребител в програма setuid (за root)?