Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C setuid不更改uid_C_Linux_Setuid - Fatal编程技术网

C setuid不更改uid

C setuid不更改uid,c,linux,setuid,C,Linux,Setuid,我在Linux上工作,试图在Linux上执行一个带有setuid的C程序。这是我的密码: #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() )

我在Linux上工作,试图在Linux上执行一个带有
setuid
的C程序。这是我的密码:

#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 );
}
我在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 +++

有人知道我做错了什么吗?

在POSIX和Linux中,
setuid()
只设置进程的有效UID,除非有效UID是root,在这种情况下,它还设置真实UID和保存的set-user-ID。要设置真实UID,请使用
setreuid()
。BSD
setuid
设置所有这些值,而不考虑进程的有效UID

要设置实际UID,请使用
setreuid

ret = setreuid(122, 122);

在POSIX和Linux中,
setuid()
仅设置进程的有效UID,除非有效UID是root,在这种情况下,它还设置真实UID和保存的set-user-ID。要设置真实UID,请使用
setreuid()
。BSD
setuid
设置所有这些值,而不考虑进程的有效UID

要设置实际UID,请使用
setreuid

ret = setreuid(122, 122);

您的setuid调用无效。表示它设置了有效的uid。您的
a.out
rwsr-sr-x
,因此它会使用
setuid
(使用文件所有者)自动执行,并在
Orig:
行上打印时具有有效的uid 122。如果您尝试选择一个setuid的程序,它将在没有setuid的情况下运行。原因是strace通过使用系统的进程跟踪工具来工作,该工具用于调试,并允许“调试器”(本例中为strace)任意修改目标进程的内存。如果一个没有权限的用户可以对一个以root权限运行的程序这样做,那将是个坏消息。你的setuid调用没有任何效果。表示它设置了有效的uid。您的
a.out
rwsr-sr-x
,因此它会使用
setuid
(使用文件所有者)自动执行,并在
Orig:
行上打印时具有有效的uid 122。如果您尝试选择一个setuid的程序,它将在没有setuid的情况下运行。原因是strace通过使用系统的进程跟踪工具来工作,该工具用于调试,并允许“调试器”(本例中为strace)任意修改目标进程的内存。如果一个没有权限的用户可以对一个以root权限运行的程序这样做,那将是个坏消息。