标签: setuid

将子进程作为不同用户从长时间运行的Python进程运行

我有一个长期运行的,守护进程的Python进程,它使用子进程在发生某些事件时生成新的子进程.长时间运行的进程由具有超级用户权限的用户启动.我需要它生成的子进程作为不同的用户(例如,"nobody")运行,同时保留父进程的超级用户权限.

我正在使用

su -m nobody -c <program to execute as a child>
Run Code Online (Sandbox Code Playgroud)

但这似乎是重量级的,并不会非常干净地死去.

有没有办法以编程方式完成此操作而不是使用su?我正在查看os.set*uid方法,但Python std lib中的doc在该领域非常稀少.

python fork subprocess setuid

43
推荐指数
3
解决办法
4万
查看次数

RealUID,已保存的UID,有效的UID.这是怎么回事?

这是一个set-root-uid程序

$ls -l
-rwsr-sr-x 1 root root 7406 2011-12-13 22:37 ./x*
Run Code Online (Sandbox Code Playgroud)

源代码:

int main(void) {
    printf(
        "         UID           GID  \n"
        "Real      %d  Real      %d  \n"
        "Effective %d  Effective %d  \n",
             getuid (),     getgid (),
             geteuid(),     getegid()
    );

seteuid(600);
    printf(
        "         UID           GID  \n"
        "Real      %d  Real      %d  \n"
        "Effective %d  Effective %d  \n",
             getuid (),     getgid (),
             geteuid(),     getegid()
    );

setuid(1000);

    printf(
        "         UID           GID  \n"
        "Real      %d  Real      %d  \n"
        "Effective %d  Effective %d  \n",
             getuid (),     getgid (), …
Run Code Online (Sandbox Code Playgroud)

linux privileges setuid

36
推荐指数
3
解决办法
3万
查看次数

从setuid root C程序调用脚本 - 脚本不以root身份运行

我需要以root身份运行bash脚本(无密码sudo或su不可行),因为你无法在Linux中设置脚本,我想从可执行文件调用它并使其成为 setuid:

$ cat wrapper.c
int main(void)
{
        system("/bin/bash ./should_run_as_root.sh");
}
$ gcc -o wrapper wrapper.c
$ sudo chown root wrapper
$ sudo chmod ug+s wrapper
$ ll wrapper
-rwsr-sr-x 1 root users 6667 2009-02-17 11:11 wrapper
$
Run Code Online (Sandbox Code Playgroud)

这有效 - 就像正确运行脚本一样 - 但脚本以执行"./wrapper"的用户身份运行.

为什么?以及如何正确实现这一点?

谢谢!

c scripting setuid

25
推荐指数
2
解决办法
4万
查看次数

获取消息"sudo:必须是setuid root",但sudo已经由root拥有

我正在尝试运行sudo,它失败了:

gregd@david $ sudo ls
sudo: must be setuid root
gregd@david $ which sudo
/usr/bin/sudo
gregd@david $ ll /usr/bin/sudo
-rwxr-xr-x 1 root root 165K 2012-05-16 00:25 /usr/bin/sudo*
Run Code Online (Sandbox Code Playgroud)

对于如何解决这个问题,有任何的建议吗?

linux sudo setuid

15
推荐指数
2
解决办法
5万
查看次数

将$ ORIGIN与setuid应用程序一起使用不会按预期失败

我有一个librandom.so库和一个mainexectuable,编译如下:

$ clang++ -o main main.o -lrandom -L. -Wl,-rpath,"\$ORIGIN"
Run Code Online (Sandbox Code Playgroud)

它们都在同一目录中.由于main$ORIGIN在其中rpath,它工作正常 - ./main返回没有错误.

现在,我设置main与运行setuidroot:

$ sudo chown root main
$ sudo chmod a+s main
$ ./main
Run Code Online (Sandbox Code Playgroud)

我预计main会失败,因为$ORIGIN没有在setuid应用程序中扩展.令人惊讶的是,它有效.

如果我运行main从另一个目录,但是,它不会如预期失败:

$ cd /tmp    
$ /path/to/main
/path/to/main: error while loading shared libraries: librandom.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

当我main从包含目录运行时为什么它可以工作?

c++ setuid shared-libraries clang++

15
推荐指数
1
解决办法
461
查看次数

Linux C编程以用户身份执行

我有一个以root身份运行的程序.我希望该程序作为普通用户执行另一个应用程序.我尝试过setgid()它可以工作,但我不能再回到root用户或其他用户.目前的计划非常简单;

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

 int main(int argc, char *argv[] )
 {
     if ( argc != 2) {
         printf("usage: %s command\n",argv[0]);
         exit(1);
     }
     setgid(100);
     setuid(1000);
     putenv("HOME=/home/caroline");
     putenv("DISPLAY=:0");
     system(argv[1]);
     seteuid(1001);
     putenv("HOME=/home/john");
     putenv("DISPLAY=:1");
     system(argv[1]);
     return 0;
 }
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?这就像命令的行动su $user-c $command

c linux setuid su

14
推荐指数
1
解决办法
5599
查看次数

Setuid位于python脚本:Linux vs Solaris

作为一个没有特权的用户在linux和Solaris上运行这个小的python脚本:

#!/usr/bin/python
import os
print 'uid,euid =',os.getuid(),os.geteuid()
Run Code Online (Sandbox Code Playgroud)

在运行之前,setuid位在脚本上设置(而不是在python解释器上):

chown root:myusergrp getuid.py
chmod 4750 getuid.py
Run Code Online (Sandbox Code Playgroud)

在Solaris上,由于setuid位而设置了有效uid:

uid,euid = 10002 0
Run Code Online (Sandbox Code Playgroud)

但不是在Linux上:

uid,euid = 10002 10002
Run Code Online (Sandbox Code Playgroud)

请注意,Solaris和Linux的python版本均为2.6

是否可以让Python Linux作为Python Solaris运行?

python linux solaris setuid

12
推荐指数
1
解决办法
2万
查看次数

为什么我需要setuid-root C程序中的setuid(0)来调用带有system()的管理程序?

我不得不为某人做一个肮脏的Linux黑客攻击,这样他们就可以cupsenable printername在非root用户的情况下使用shell命令启动打印机.我不希望他们能够以cupsenableroot 身份使用整个语法,所以我只写了一个C包装器来清理输入argv[1]和调用system("cupsenable sanitizedprintername").

我使程序setuid root,但即便如此,cupsenable失败了"权限被拒绝".然后我setuid(0)在之前插入了一个电话system(),并且看,它起作用了.

忽视有更好的方法让用户控制打印机的问题.可能有更好的方法.我感兴趣的是chmod u+svs setuid(0)vs. 的错综复杂system().为什么这样做?

c unix setuid privilege-elevation

11
推荐指数
1
解决办法
7778
查看次数

如何从root用户使用setuid()成为用户,以后可能再次成为root用户?

我正在尝试做安全的事情,并且有一个程序需要以root身份运行才能在不需要它时删除它的权限.如果我chmod的SUID位是二进制,并且它属于root,那么这很有效,因为现在我有UID =某个用户,而EUID = root,所以我可以使用seteuid(0)seteuid(getuid())分别提升和删除管理员权限.

但是,如果我使用sudo而不是设置SUID,那么UID == EUID == 0,因此调用seteuid(getuid())不会有任何影响.而且我不能仅仅UID从一些随机用户那里改变一些价值,因为setuid()手册页明确指出,如果从以root身份运行的程序调用它,那么就会失去权利,没有希望让他们回来.

那么,如何让我的程序在运行时暂时失去其权限sudo

c linux security setuid root

11
推荐指数
2
解决办法
9456
查看次数

Git post-receive hook用于更新不同用户拥有的本地克隆

我正在尝试设置一个git post-receive钩子,这样当收到提交时,机器上另一个存储库的克隆会更新(即确实如此git pull origin master).我正在使用gitosis来服务于存储库,因此我相信post-receive hook将作为gitosis用户运行,而我想要在receive上更新的存储库是由www-data.我应该怎么做呢?

我听说过setuid脚本,但我不确定这是否会带来安全风险?如果这不是安全风险,我将如何做到这一点?我猜我会做一些像脚本所拥有的东西www-data,让它成为世界可执行的并启用setuid位?我想这个脚本几乎无害,因为它只是更新存储库,但我想确定.谢谢!

编辑:有没有办法使用sudo?这比那更安全setuid吗?我的意思是,我不认为setuid如果用户不是root用户会有很多问题,但是看起来好像我必须跳过一些箍setuid才能运行脚本.

第二次编辑:似乎我可以通过一些/etc/sudoers魔术来做到这一点sudo -u.也许我应该在ServerFault上发布这个,但至少我从这一努力中学到了一些东西.

git hook setuid

10
推荐指数
1
解决办法
5640
查看次数