2016-02-11 1 views
0

Я работаю в Linux и пытаюсь выполнить программу на C с setuid на Linux. Вот мой код:setuid не меняется uid

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <errno.h> 

int main() 
{ 
    int ret; 
    fprintf (stderr, "Orig: %d Effective: %d\n", getuid(), geteuid()); 

    ret = setuid (122); 
    if (ret < 0) 
    { 
     perror ("Problem in setuid "); 
     return (1); 
    } 

    fprintf (stderr, "UID : %d Effective: %d\n", getuid(), geteuid()); 
    execlp ("/bin/id", "/bin/id", NULL); 

    fprintf (stderr, "Problem executing execlp\n"); 
    return (0); 
} 

После выполнения UID не изменяется. Выходной сигнал:

[[email protected] ~]$ ~sanjiv/bin/a.out 
Orig: 155 Effective: 122 
UID : 155 Effective: 122 
uid=155(hauschild) gid=100(users) euid=122(sanjiv) groups=100(users) 
[[email protected] ~]$ 

Я рассмотрел другие вопросы в формате SO, но не смог понять это. Разрешения на исполняемый файл: rwsr-sr-x. Обратите внимание, как код заканчивается, и статус выхода отображается как 0. Однако, когда я запускаю его через strace, он дает мне ошибку на setuid и существует с 1. следующим образом:

geteuid()        = 155 
getuid()        = 155 
write(2, "Orig: 155 Effective: 155\n", 27Orig: 155 Effective: 155 
) = 27 
setuid(122)        = -1 EPERM (Operation not permitted) 
write(2, "Problem in setuid : Operation n"..., 45Problem in setuid : Operation not permitted 
) = 45 
exit_group(1)       = ? 
+++ exited with 1 +++ 

Может ли кто-нибудь увидеть, что я могу делать неправильно?

+0

Ваш УИП вызов не имеет никакого эффекта. [Manpage for setuid] (http://man7.org/linux/man-pages/man2/setuid.2.html) говорит, что он устанавливает * эффективный * uid. Ваш 'a.out' является' rwsr-sr-x', и поэтому он автоматически выполняется с помощью 'setuid' (с использованием владельца файла), имея эффективный uid 122 при печати на строке« Orig: ». – Kenney

+1

Если вы попытаетесь найти программу, которая является setuid, она будет работать без setuid. Причина в том, что strace работает с использованием средств отслеживания процессов системы, которые предназначены для отладки и позволяют «отладчику» (в данном случае, strace) произвольно изменять память целевого процесса. Если непривилегированный пользователь может сделать это с программой, запущенной с привилегиями root, это будет плохая новость. –

ответ

1

В POSIX и Linux setuid() устанавливает только эффективный UID процесса, если только он не является корневым, и в этом случае он также устанавливает реальный UID и сохраненный идентификатор set-user-ID. Чтобы установить реальный UID, используйте setreuid(). BSD setuid устанавливает все из них независимо от действующего UID процесса.

Чтобы установить реальный UID, используйте setreuid:

ret = setreuid(122, 122); 

 Смежные вопросы

  • Нет связанных вопросов^_^