setuid 不改变 uid
setuid not changing uid
我在 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 );
}
执行后,UID没有改变。输出是:
[hauschild@hoare7 ~]$ ~sanjiv/bin/a.out
Orig: 155 Effective: 122
UID : 155 Effective: 122
uid=155(hauschild) gid=100(users) euid=122(sanjiv) groups=100(users)
[hauschild@hoare7 ~]$
我查看了 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和已保存的设置用户 ID。要设置真实的 UID,请使用 setreuid()
。 BSD setuid
设置所有这些而不考虑进程的有效 UID。
要设置真实的UID,使用setreuid
:
ret = setreuid(122, 122);
我在 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 );
}
执行后,UID没有改变。输出是:
[hauschild@hoare7 ~]$ ~sanjiv/bin/a.out
Orig: 155 Effective: 122
UID : 155 Effective: 122
uid=155(hauschild) gid=100(users) euid=122(sanjiv) groups=100(users)
[hauschild@hoare7 ~]$
我查看了 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和已保存的设置用户 ID。要设置真实的 UID,请使用 setreuid()
。 BSD setuid
设置所有这些而不考虑进程的有效 UID。
要设置真实的UID,使用setreuid
:
ret = setreuid(122, 122);