【问题标题】:setuid(0) with CAP_SETUID带有 CAP_SETUID 的 setuid(0)
【发布时间】:2010-09-29 14:30:55
【问题描述】:

我正在尝试使用 CAP_SETUID 功能将我的 uid 更改为 0 作为非 root 用户。我有以下程序:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/capability.h>
#include <sys/prctl.h>

int main(int argc, char *argv[])
{
    printf("cap setuid in bset: %d\n", prctl(PR_CAPBSET_READ, CAP_SETUID, 0, 0, 0));
    printf("%s\n", cap_to_text(cap_get_file(argv[0]), NULL));
    printf("%s\n", cap_to_text(cap_get_proc(), NULL));
    printf("uid: %d\n", (int) getuid());
    setresuid(0, 0, 0);
    printf("uid: %d\n", (int) getuid());
    return 0;
}

我按如下方式分配 setuid 功能:

sudo /sbin/setcap cap_setuid=ep ./capsetuid

我得到以下输出

cap setuid in bset: 1
= cap_setuid+ep
=
uid: 1000
uid: 1000

我希望第二个 printf() 也显示CAP_SETUID 功能。不知何故,我的进程没有获得 setuid 文件功能。我在这里做错了什么?

【问题讨论】:

  • 这可能会有所帮助:blog.famzah.net/tag/cap_setuid
  • 这似乎也有相关信息——尤其是接近尾声:linux.die.net/man/7/capabilities
  • 看起来该进程必须具有 CAP_SETUID 权限(以及,或代替文件)。
  • @Jonathan:我刚刚更新了问题,您可能一直在查看旧问题。我发现问题是该进程没有获得文件功能,请参阅更新的问题。

标签: linux privileges linux-capabilities


【解决方案1】:

刚刚发现需要在内核命令行上使用 file_caps=1 启用文件功能。

【讨论】:

    【解决方案2】:

    setuid() 设置进程的有效 user-id,但getuid() 获取real user-id。

    getuid() 更改为geteuid(),它应该可以工作。

    【讨论】:

    • 如果setuid()设置了有效UID,seteuid()函数有什么作用?部分答案是“相同”;不同之处在于setuid() 确实将真实有效且保存的 UID 值设置为给定的 UID,如果该进程具有“适当的权限”。那么下一个问题是“拥有 CAP_SETUID 权限是否授予适当的权限”?
    • euid 也没有改变。手册页说:“如果调用者的有效 UID 是 root,则还设置了真正的 UID 和保存的 set-user-ID。”不过,我不是root,我有特权。所以我不确定我的情况会发生什么。我发现问题在于我的过程中没有获得 cap_setuid 功能。我已经更新了问题
    • @Fabian:您的内核是否启用了文件功能 (CONFIG_SECURITY_FILE_CAPABILITIES=y)? `prctl(PR_CAPBSET_READ, CAP_SETUID, 0, 0, 0)` 返回什么?
    • 我的内核确实具有文件功能。 prctl() 返回 1。所以根据我从手册页的理解,这意味着我的进程没有得到 cap_setuid,因为它被边界能力集阻止了。对?如何更改边界帽集?
    • 问题是必须在内核命令行上启用文件功能。
    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 2015-02-16
    • 2011-09-10
    • 2012-03-03
    • 2015-04-08
    • 2013-11-03
    • 2017-01-14
    • 2013-09-07
    相关资源
    最近更新 更多