【问题标题】:setuid() returns 0 but has no effectsetuid() 返回 0 但没有效果
【发布时间】:2016-08-28 09:05:45
【问题描述】:

我有以下代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void main(int argc, char* argv[]) {
    printf("uid=%u euid=%u\n", getuid(), geteuid());
    printf("%d = setuid(euid)\n", setuid(geteuid()));
    printf("uid=%u euid=%u\n", getuid(), geteuid());
}

这样编译运行:

 val@particle:/tmp $ sudo gcc foo.c
 val@particle:/tmp $ sudo chown dev-misc:dev-misc a.out
 val@particle:/tmp $ sudo chmod u+s a.out
 val@particle:/tmp $ ./a.out
uid=1000 euid=1006
0 = setuid(euid)
uid=1000 euid=1006

为什么uid保持不变?为什么 setuid 报告成功? (根据手册页,0 表示成功)

【问题讨论】:

    标签: c linux permissions operating-system setuid


    【解决方案1】:

    setuid() 设置有效的用户 ID,而不是真正的进程 ID。来自manual

    setuid() 设置调用进程的有效用户ID。如果 调用者的有效 UID 是 root(更准确地说:如果调用者 有 CAP_SETUID 能力),真实的 UID 和保存的 set-user-ID 也设置好了。

    为了能够更改真实用户 ID,该进程必须将有效用户 ID 设置为 0。因为在您的示例中不是这种情况,所以它不会更改。 setuid() 成功,因为您只是将其设置为进程已有的有效用户 ID。

    【讨论】:

      猜你喜欢
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      相关资源
      最近更新 更多