使用Python调用libc.clone创建用户命名空间后,用户ID始终为65534(nobody)的问题求助
使用Python调用libc.clone创建用户命名空间后,用户ID始终为65534(nobody)的问题求助
我正在尝试用Python脚本调用clone系统调用创建一个新的用户命名空间,目标是将新生成的shell的用户ID映射到特定值,就像unshare命令那样。
当我运行unshare --user sh时,可以通过以下命令成功更新UID映射:
echo '0 502 1' > /proc/[PID]/uid_map echo '0 502 1' > /proc/[PID]/gid_map
之后在新shell里运行id会显示用户是root。
但当我尝试用Python的libc.clone做同样的操作时,即使更新了UID和GID映射,shell仍然显示用户ID为65534(nobody)。我的脚本如下:
import signal import os import ctypes import sys CLONE_NEWUTS = 0x04000000 CLONE_NEWUSER = 0x10000000 def write_file(path, content): try: with open(path, "w") as f: f.write(content) except Exception as e: sys.exit(f"[Error] Failed to write mapping {content} to {path}: {e}") def child_func(): input("...>") os.execlp("bash", "sh") # Start a new shell libc = ctypes.CDLL("libc.so.6", use_errno=True) STACK_SIZE = 1024 * 1024 stack = ctypes.create_string_buffer(STACK_SIZE) child_stack = ctypes.c_void_p(ctypes.addressof(stack) + STACK_SIZE) pid = libc.clone( ctypes.CFUNCTYPE(ctypes.c_int)(child_func), child_stack, CLONE_NEWUTS | CLONE_NEWUSER | signal.SIGCHLD, ) if pid == -1: sys.exit("Failed to create new namespace") print(pid) write_file(f"/proc/{pid}/setgroups", "deny\n") write_file(f"/proc/{pid}/uid_map", f"0 502 1\n") write_file(f"/proc/{pid}/gid_map", f"0 502 1\n") os.waitpid(pid, 0)
我已经检查过的内容:
- 脚本是用root权限执行的。
- UID和GID映射文件是在
clone调用之后更新的。
尽管做了这些步骤,命名空间内的用户仍然是nobody。我可能漏掉了什么?欢迎任何建议或见解。
备注:内容来源于stack exchange,提问作者Aoldguy
相关产品推荐
相关产品推荐

