Задача предельно ясная: внутри программы, запускаемой любым пользователем сделать setuid на любого другого пользователя (в т.ч. root).
Сразу приходят в голову такие варианты решения:
- Демон-процесс, запущенный под root и делающий fork->setuid->exec. И небольшой клиент, который говорит демону что делать
Недостатки:- Потенциальная дыра в безопасности в линиях связи клиент-сервер
- Порождённый процесс не будет потомком процесса исполняемого файла (т.е. клиента) со всеми вытекающими
- Модуль ядра, который передает управление юзерспейсу с uid=0. И так же небольшой клиент для него.
Недостатки:- Опять же дыра в связи
- Дыра в безопасности: передача управления юзерспейсу из кернелспейса.
- Зависимость от сборки ядра.
- SUID-бит. Просто, элегантно, легко.
Недостатки:- Бинарник должен принадлежать root
- No (shebang) scripts allowed
- Требуется вмешательство извне: установка соответствующих прав и владельца
- Exploit. Недостатки:
- Nuff said.
И попутно объясните пожалуйста чем отличается программа запущенная с (uid=***, euid=0) от той же программы но запущенной с (uid=0, euid=0) (кроме собственно uid)?
P.S. Да, я знаю, что это потенциальная дыра в безопасности, что уже есть sudo/PolicyKit и что при запуске такой программы в мире будет умирать котёнок. По этому избавьте от этих рассуждений.