【问题标题】:can't get setuid bit to work on Ubuntu 14.04无法让 setuid 位在 Ubuntu 14.04 上工作
【发布时间】:2014-10-09 03:15:46
【问题描述】:

我有一个非常简单的程序:

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

void error(char *msg) {
  printf(msg);
  exit(-1);
}

int main(int argc, char **argv) {
    uid_t ruid, euid, suid;

    if (getresuid(&ruid, &euid, &suid) < 0)
        error("Error getting process uids");

    printf("%d %d %d\n", ruid, euid, suid);
}

编译如下:

gcc -o print print.c

它归root所有,并设置了setuid位:

-rwsrwxr-x 1 root root 8648 Oct 8 20:10 ./print*

但是,当我运行它时,我获得了以下权限:

1000 1000 1000

所以真正的、有效的和保存的 set-uid 权限都是我 (1000) 而不是 root。 有没有人遇到过这个?有什么建议吗?

【问题讨论】:

    标签: setuid


    【解决方案1】:

    好的,想通了。问题是二进制文件存在于加密文件系统中。 (例如将其移动到 /tmp 即可修复它)。值得注意的是,在挂载加密文件系统时不会显示 nosuid。

    【讨论】:

      【解决方案2】:

      您是否以 root 身份执行代码?

      在您的描述中,您说您运行它(不是根运行它)。如果是这样,getresuid() 应该返回“你的”UID,例如,调用进程的 UID。

      我在我的“Ubuntu”机器上运行了该程序(但实际上 dist 并不重要,因为它是一个系统调用)并获得了预期的结果。当我以 root 身份执行时,我得到了“0 0 0”,当我以“我自己”身份执行时,我得到了“1000 1000 1000”

      【讨论】:

      • 我希望最后一个数字应该是 0,而不是 1000。也就是说保存的 suid 应该是 0。
      • 你是对的。你是如何确定你设置了 setuid 位的?我将模式更改为 u+s 并得到结果 "1000, 0, 0"
      猜你喜欢
      • 2014-10-05
      • 2016-02-06
      • 2016-02-09
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多