РЕШЕНО: setuid() выполняеться не для всех?

Модератор: Модераторы разделов

Аватара пользователя
LuckyStr
Сообщения: 159
ОС: Fedora

РЕШЕНО: setuid() выполняеться не для всех?

Сообщение LuckyStr »

Есть не большая программа. где используется функция setuid(). Программа запускается под рутом. и для одних uid она выполняется успешно а для других нет. По какому принципу она решает кому вернуть 0 а кому нет?
Это наш химический дом для печальных жителей Земли!
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: РЕШЕНО: setuid() выполняеться не для всех?

Сообщение nesk »

LuckyStr писал(а):
26.08.2009 22:15
Есть не большая программа. где используется функция setuid(). Программа запускается под рутом. и для одних uid она выполняется успешно а для других нет. По какому принципу она решает кому вернуть 0 а кому нет?


Анализируйте errno в случае ошибки setuid.
Насколько я помню, из рута можно переключиться в кого угодно.
А из обычного пользователя только в действительный или сохраненный id.
То есть переключившись от рута на пользователя, можно потом себе вернуть рута.
( но это так. на вскидку, я точно не помню. в общем случае man 2 setuid )

А вообще могли бы и показать программу и результаты её работы. А то все это вилами по воде :)
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
LuckyStr
Сообщения: 159
ОС: Fedora

Re: РЕШЕНО: setuid() выполняеться не для всех?

Сообщение LuckyStr »

Код: Выделить всё

#include <iostream>
using namespace std;
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>


int main() {

        pid_t result = fork();

    if (result==-1)   {
             cout<<"error fork()"<<endl;
         return 1;
                 }

    if (result==0)
         {
           int status=setuid(501);

             if (status==0)
               {
                          sleep(20);
                          system("whoami >/media/disk/log");
                }

         }
    return 0;
}


вот такая программа. И почему-то от пользователя 501 можно выполнить, а от 500 нельзя.
setuid пишет: Operation not permitted

Справка пишет: If uid is not the same as the real UID of the process, setuid() succeeds only if the process has appropriate privileges.
т.е. setuid может установить любого пользователя если процесс имеет соответствующие привилегии. Имеет ли такие привилегии процесс запущенный под рутом или их надо как-то иначе назначать?
Это наш химический дом для печальных жителей Земли!
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: РЕШЕНО: setuid() выполняеться не для всех?

Сообщение diesel »

Это в Федоре? Приколами SELinux это не может быть?
Спасибо сказали:
Аватара пользователя
LuckyStr
Сообщения: 159
ОС: Fedora

Re: РЕШЕНО: setuid() выполняеться не для всех?

Сообщение LuckyStr »

нет это не приколы selinux т.к. selinux отключен. Это мой косяк, т.к. программа приведенная здесь не совсем та, в настоящей программе я использую многопоточность и каждый поток пытаеться использовать свой uid и как далее выяснилось один процесс может получить лишь один uid, от кого бы он не был запущен. Признаю свою вину, что ввел вас в заблуждение приведя не верный код, правда меня можно понять, я думал что они практически идентичны.
Это наш химический дом для печальных жителей Земли!
Спасибо сказали: