非共享用户命名空间中os.setuid报错[Errno 22] Invalid argument求助
解决非共享用户命名空间中os.setuid(0)报Invalid Argument的问题
问题原因
调用os.unshare(os.CLONE_NEWUSER)创建新用户命名空间后,内核默认不会自动将外部的UID/GID映射到命名空间内部的UID/GID(比如root的0)。此时直接调用os.setuid(0),内核找不到对应的映射关系,就会抛出[Errno 22] Invalid argument错误。
修复方案
需要手动配置UID/GID映射,步骤如下:
- 普通用户运行时必须先禁用setgroups,避免写入gid_map时失败;
- 将外部当前UID映射到内部的0;
- 将外部当前GID映射到内部的0;
- 再调用setuid/setgid。
修改后的代码:
import os # 创建新用户命名空间 os.unshare(os.CLONE_NEWUSER) # 普通用户运行时需先禁用setgroups,否则写入gid_map会失败 with open('/proc/self/setgroups', 'w') as f: f.write('deny') # 获取当前外部的UID和GID external_uid = os.getuid() external_gid = os.getgid() # 配置UID映射:将外部UID映射到内部0 with open('/proc/self/uid_map', 'w') as f: f.write(f'0 {external_uid} 1') # 配置GID映射:将外部GID映射到内部0 with open('/proc/self/gid_map', 'w') as f: f.write(f'0 {external_gid} 1') # 现在可成功切换到命名空间内的root os.setuid(0) os.setgid(0) # 启动bash验证权限 os.system('/bin/bash')
额外说明
- 若以root用户运行,
/proc/self/setgroups的步骤可省略,保留也不影响; uid_map和gid_map的格式为内部UID 外部UID 范围,这里1表示仅映射单个UID/GID;- 配置映射后,你在新命名空间内拥有root权限,但这是命名空间内的伪权限,不会影响主机系统的实际权限。
内容的提问来源于stack exchange,提问作者Xandaaah
相关产品推荐
相关产品推荐

