标签: setuid

在 /dev 文件上设置 root-only 权限并构建二进制文件

作为构建过程的一部分,我想运行以下两个命令:

sudo chmod a+r /dev/cpu/*/msr
sudo setcap cap_sys_rawio=ep ./bench
Run Code Online (Sandbox Code Playgroud)

这会将内核模块/dev/cpu/*/msr公开的文件设置msr为世界可读,并设置./bench实际读取这些文件所需的二进制文件(作为构建的一部分生成)的额外权限。

问题是这需要 root 权限,因此sudo.

我想要一个类似于 setuid root 脚本的东西来完成这两个特定的事情,但是在现代 Linux 上不推荐和禁用setuid root 脚本

对于一个简单的解决方案,我有哪些选择?

仅适用于第二行 (the setcap)的解决方案也很有趣,因为我需要这个来运行每个构建,而chmod每次启动只需要运行一次。

linux bash x86 setuid msr

4
推荐指数
1
解决办法
168
查看次数

任何类Unix系统是否都意味着目录上的SUID位?

正如标题所说,任何类似Unix的系统都会对目录中的SUID位赋予意义,如果是这样,它意味着什么?

SVTX(保存的文本或粘滞)位有一个含义 - 除非您可以写入该文件,否则不能从该目录中删除文件.例如,它用在/ tmp上.

SGID(设置GID)位具有含义 - 在此目录中创建的文件应属于拥有该目录的组(尽管稍后可通过显式调用chown(2)来更改该分配).

SUID位怎么样?

unix linux macos freebsd setuid

3
推荐指数
1
解决办法
1390
查看次数

setuid位结果

我有一个要设置uid位的shell脚本。我将所有者设置为root并设置uid位。我在外壳程序中添加了“ whoami”以检查其是否正常运行,但是当我执行脚本时,whoami返回了用户名,而不是root。那是错的吧?如果uid设置正确,我应该已经root了,对吗?

setuid bit

3
推荐指数
1
解决办法
1020
查看次数

seteuid/geteuid:程序始终具有root id

我目前正试图弄清楚SUID位和相应的函数seteuid和geteuid是如何工作的.所以我写了这个小程序:

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

int main(int argc, char **argv) {

    printf("oldid %d\n", geteuid());
    if(seteuid(0) == -1)
        perror("seteuid faied");
    printf("newid %d\n", geteuid());

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

编译它,将其所有者更改为root,并将文件所有者的s位更改为:

[chris@myhost Test]$ ls -l test
-rwsr-xr-x 1 root root 4830 Apr  5 07:56 test
Run Code Online (Sandbox Code Playgroud)

但是产生的输出看起来像这样:

[chris@myhost Test]$ ./test
oldid 0
newid 0
Run Code Online (Sandbox Code Playgroud)

这是我不明白的事情.根据我发现的geteuid的第一次调用应该实际返回该程序的调用者的用户ID(即chris - 我的ID将是1000),但程序将root显示为有效用户id.任何人都可以解释为什么会这样吗?

c permissions setuid suid

3
推荐指数
1
解决办法
7729
查看次数

setgid()失败 - 不允许操作

我在C中创建了一个setuid程序.可执行文件如下所示:

-r-s-r-s--- 1 root users 13073 Jun 15 21:56 server
Run Code Online (Sandbox Code Playgroud)

我执行程序,userA/users并尝试将uid/gid设置为userB/otherUsers.setgid()失败,不允许操作.userA不属于otherUsers我如何更改有效的gid?


[编辑]以下是我所做的一个小小的总结.我的C程序,作为userA执行,将uid和gid设置为userB并创建一个文件.与预期不符,该文件属于组root,因为setgid()失败.

[userA@node uid]$ id
uid=11945(userA) gid=544(users) groups=544(users)
[userA@node uid]$ id userB
uid=11946(userB) gid=10792(otherUsers) groups=10792(otherUsers)
[userA@node uid]$ cat uid.c 
#include <stdio.h>
#include <unistd.h>

int main() {
  setuid(11946);
  setgid(10792);

FILE *f = fopen("userB_file", "w");
fclose(f);

return 0;
}
[userA@node uid]$ ls -l uid
-r-sr-sr-x 1 root root 7130 Jun 17 14:16 uid
[userA@node uid]$ ./uid 
[userA@node uid]$ ls …
Run Code Online (Sandbox Code Playgroud)

c linux permissions setuid

3
推荐指数
1
解决办法
8976
查看次数

PAM堆栈是否始终以root身份运行?

我正在为Linux PAM编写一个模块,该模块用于setuid()删除正在进行身份验证的用户的权限.当然,这只有在EUID是root的情况下才有效.那么,PAM堆栈是否始终以root身份运行,无论应用程序使用它?

c linux setuid pam

3
推荐指数
1
解决办法
852
查看次数

getresuid()和setresuid()有什么作用?

函数getresuid(&arg1,&arg2,&arg3)和setresuid(arg1,arg2,arg3)有什么作用?

如果给出这些函数的真正基本解释,那将是很好的.

unix linux setuid

3
推荐指数
1
解决办法
2182
查看次数

seteuid是Linux上的系统调用吗?

所有这一切我迄今阅读文献的setuid有关谈判seteuid,暗示它是一个系统调用的方式.第2节man页面从不说明函数是否是系统调用,因此seteuid(2)没有帮助.如果它不是系统调用,意味着内核不提供功能,那么如何实现"设置有效UID"呢?

linux setuid

3
推荐指数
1
解决办法
723
查看次数

以root身份运行的Perl脚本(通用)

我希望能够以root身份在我的系统上运行某些Perl脚本,即使调用它们的"用户"没有以root身份运行.

对于每个脚本,我可以编写一个C包装器,为该包装器设置setuid root; 包装器会将UID更改为0,然后调用Perl脚本,该脚本本身不会设置setuid位.这避免了在尝试运行setuid根脚本时出现的不幸障碍.

但我不想为每个脚本编写一个C包装器.我只想要一个C包装器来完成整个系统的工作.我也不希望任何脚本都能使用这个C包装器; C包装器本身应该能够检查Perl脚本的某些特定特性,以查看是否可以将UID更改为root.

我还没有看到任何解决此问题的其他Stack Overflow问题.

我知道风险,我拥有这个系统,而且我不想让任何东西随意地照顾我.

perl setuid

3
推荐指数
1
解决办法
603
查看次数

如果程序设置了 setuid 位,为什么 /proc/self 中的文件最终归 root 所有?

我有这个小程序:

#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <sys/prctl.h>

extern char **environ;

int main()
{
   char * const arglist[] = { "/bin/ls", "-l", "/proc/self/maps", NULL };
   uid_t uid, euid, suid;
   gid_t gid, egid, sgid;

   getresuid(&uid, &euid, &suid);
   printf("Before: uid: %u, euid: %u, suid: %u\n", uid, euid, suid);
   uid = euid;
   setresuid(uid, euid, suid);
   getresuid(&uid, &euid, &suid);
   printf(" After: uid: %u, euid: %u, suid: %u\n", uid, euid, suid);

   getresgid(&gid, &egid, &sgid);
   printf("Before: gid: %u, egid: %u, sgid: %u\n", gid, egid, sgid); …
Run Code Online (Sandbox Code Playgroud)

c linux security setuid

3
推荐指数
1
解决办法
1012
查看次数

标签 统计

setuid ×10

linux ×7

c ×4

permissions ×2

unix ×2

bash ×1

bit ×1

freebsd ×1

macos ×1

msr ×1

pam ×1

perl ×1

security ×1

suid ×1

x86 ×1