Я работаю в 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 +++
Может ли кто-нибудь увидеть, что я могу делать неправильно?
Ваш УИП вызов не имеет никакого эффекта. [Manpage for setuid] (http://man7.org/linux/man-pages/man2/setuid.2.html) говорит, что он устанавливает * эффективный * uid. Ваш 'a.out' является' rwsr-sr-x', и поэтому он автоматически выполняется с помощью 'setuid' (с использованием владельца файла), имея эффективный uid 122 при печати на строке« Orig: ». – Kenney
Если вы попытаетесь найти программу, которая является setuid, она будет работать без setuid. Причина в том, что strace работает с использованием средств отслеживания процессов системы, которые предназначены для отладки и позволяют «отладчику» (в данном случае, strace) произвольно изменять память целевого процесса. Если непривилегированный пользователь может сделать это с программой, запущенной с привилегиями root, это будет плохая новость. –