subprocess.call(..., user=xx, group=xxx) is not able to gain privileges
未关闭
还没有人认领这个 Issue。
stdlib
topic-subprocess
type-bug
- 主要语言
- Python
- 星标
- 77.2k
- 派生
- 36k
- PR 合并指标
- PR 指标待抓取
描述
#!/usr/bin/python3
from os import getresuid, initgroups, setresgid, setresuid
from pwd import getpwnam
from subprocess import check_call
def drop_permissions():
user = 'nobody'
info = getpwnam(user)
uid = info.pw_uid
gid = info.pw_gid
assert uid
assert gid
initgroups(user, gid)
setresgid(gid, gid, gid)
setresuid(uid, uid, 0)
def run_privileged_proc():
def restore():
setresuid(0, 0, 0)
setresgid(0, 0, 0)
initgroups('root', 0)
check_call(['id'], preexec_fn=restore)
def main():
assert getresuid() == (0, 0, 0)
# This on works (dropping permissions in child process)
check_call(['id'], user=65534, group=65534)
drop_permissions()
# This one works:
run_privileged_proc()
# This does not:
check_call(['id'], user=0, group=0)
main()
for the last subprocess, strace of child process:
set_robust_list(0x7eff7bfaea20, 24) = 0
close(7) = 0
close(9) = 0
close(11) = 0
dup2(6, 0) = 0
dup2(8, 1) = 1
dup2(10, 2) = 2
rt_sigaction(SIGPIPE, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_ONSTACK, sa_restorer=0x7eff7b83ea30}, {sa
rt_sigaction(SIGXFSZ, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_ONSTACK, sa_restorer=0x7eff7b83ea30}, {sa
setgroups(0, []) = -1 EPERM (Операция не позволена)
write(12, "OSError:", 8) = 8
write(12, "1", 1) = 1
write(12, ":", 1) = 1
write(12, "noexec", 6) = 6
exit_group(255) = ?
+++ exited with 255 +++
Python 3.10.7
Linked PRs
- gh-134400
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从使用 user、group 和 preexec_fn 的 subprocess.check_call 调用开始,然后将它们的子进程行为与提供的 strace 输出进行比较。权限降低后,最终的特权子进程能够成功运行即表示完成;该 issue 还列出了关联的 PR gh-134400。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- operating-systems
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 需要澄清
- 新手友好度
- 25/100