gpt4 book ai didi

c - setuid 不改变 uid

转载 作者:太空宇宙 更新时间:2023-11-04 08:16:48 24 4
gpt4 key购买 nike

我在 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 和保存的 set-user- ID。要设置真实的 UID,请使用 setreuid()。 BSD setuid 设置所有这些,而不管进程的有效 UID。

要设置真实的 UID,使用 setreuid:

ret = setreuid(122, 122);

关于c - setuid 不改变 uid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35351520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com