【问题标题】:why setresuid / setresgid works different in Python versus C为什么 setresuid / setresgid 在 Python 和 C 中的工作方式不同
【发布时间】:2016-01-17 08:58:21
【问题描述】:

一些实验似乎 setresuid / setresgid 在 C 和 Python 中的工作方式不同,我不太清楚为什么。如果我有以下简短的 C 程序:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    setresuid(999, 999, 999);
    setresgid(999, 999, 999);
    system("/some/program");
    return 0;
}

并且该二进制文件设置了 setuid 位,并且该二进制文件位于组 999 和所有者 999 中,以另一个用户身份运行此二进制文件将以用户 999 身份运行 /some/program,这是您所期望的,因为我相信背后的想法setuid 位是允许程序以文件的组/所有者权限运行。

另一方面,如果我有以下简短的 Python 程序:

#!/usr/bin/python
import os
import subprocess

os.setresuid(999,999,999)
subprocess.check_output('/some/program', shell=True)

并且 python 脚本设置了 setuid 位,位于组 999 中并由用户 999 拥有,以另一个用户身份运行脚本会出现错误:

Traceback (most recent call last):
  File "/foo/bar/sample.py", line 5, in <module>
    os.setresuid(999,999,999)
OSError: [Errno 1] Operation not permitted

知道为什么会这样吗?

【问题讨论】:

  • 是的,Python 脚本也设置了 setuid 位。我更新了我的描述。
  • 我的猜测是 Python 运行时抱怨无效操作,而 C 系统调用只返回 -1。可以打印setresuid()的返回值吗?
  • 你可能更喜欢问这样的问题:“我怎样才能像setuid 一个已编译的二进制文件那样向 python 程序授予系统权限?”因为现在您的问题已得到解答,但您可能仍有问题需要解决。

标签: python c setuid


【解决方案1】:

执行解释脚本不同于执行编译二进制文件。在解释脚本的情况下,实际执行的是解释器,而不是脚本本身。因此,脚本上的setuid 没有任何影响。你必须setuid解释器,在这种情况下是python。不建议这样做。

【讨论】:

  • 文件系统功能,例如CAP_SETUID 可能适用于脚本。
  • 这似乎是合理的,但有趣的是,实际运行脚本的常用用户和组权限会得到尊重,但 setuid 功能却没有。如果必须在解释器而不是脚本上设置 setuid,为什么权限在脚本级别完全有效?
  • @blischalk 我来晚了,但那是因为对于脚本,它与阅读脚本有关。考虑差异。要执行 ./script.py,script.py 必须至少为 0500。但是,要执行 python ./script.py,script.py 可以位于 0400。没有办法(除非您是 root!或者解析器本身是 suid)执行脚本,无论是独立的还是作为解析器的输入,至少没有读取权限 - 因为它在脚本的 content 上运行,而不是在脚本的 execution 上运行。 (有点。)这有帮助吗?
猜你喜欢
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2016-06-21
  • 2021-01-16
  • 2012-12-25
相关资源
最近更新 更多