您尚未登录。

#1 2018-07-21 12:17:13

xtricman
喵了个咪
注册时间: 2012-12-26
帖子: 545

unshare -U是怎么把用户变成nobody的?

用strace看了一下,这是execve("/usr/bin/id")之前的所有输出,并没有看见没有看见setuid或者setgid之类的syscall啊,那unshare系统调用后进入新的user namespace显示的uid不是还应该是xtricman么?为啥最后显示的会是nobody用户?

[xtricman@archlinux ~]$ strace unshare -U id
execve("/usr/bin/unshare", ["unshare", "-U", "id"], 0x7ffeb591aee0 /* 41 vars */) = 0
brk(NULL)                               = 0x55c74f6c8000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (没有那个文件或目录)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=115050, ...}) = 0
mmap(NULL, 115050, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f9edbf14000
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\2001\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2105608, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9edbf12000
mmap(NULL, 3914128, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f9edb951000
mprotect(0x7f9edbb04000, 2093056, PROT_NONE) = 0
mmap(0x7f9edbd03000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b2000) = 0x7f9edbd03000
mmap(0x7f9edbd09000, 14736, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f9edbd09000
close(3)                                = 0
arch_prctl(ARCH_SET_FS, 0x7f9edbf13540) = 0
mprotect(0x7f9edbd03000, 16384, PROT_READ) = 0
mprotect(0x55c74e971000, 4096, PROT_READ) = 0
mprotect(0x7f9edbf31000, 4096, PROT_READ) = 0
munmap(0x7f9edbf14000, 115050)          = 0
geteuid()                               = 1000
getegid()                               = 985
brk(NULL)                               = 0x55c74f6c8000
brk(0x55c74f6e9000)                     = 0x55c74f6e9000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=5283840, ...}) = 0
mmap(NULL, 5283840, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f9edb447000
close(3)                                = 0
unshare(CLONE_NEWUSER)                  = 0
execve("/usr/local/sbin/id", ["id"], 0x7ffec5354f88 /* 41 vars */) = -1 ENOENT (没有那个文件或目录)
execve("/usr/local/bin/id", ["id"], 0x7ffec5354f88 /* 41 vars */) = -1 ENOENT (没有那个文件或目录)
execve("/usr/bin/id", ["id"], 0x7ffec5354f88 /* 41 vars */) = 0

lxc-unshare也是一样的效果,是不是我搞错了什么?unshare(CLONE_NEWUSER)调用之后进程即处于新的user namespace中,按照man7.org系统调用文档,

When a user namespace is created, it starts out without a mapping of user IDs (group IDs) to the parent user namespace.

UID之前是多少,在新user namespace不应该还是多少么?

最近编辑记录 xtricman (2018-07-21 12:26:13)

离线

#2 2018-07-22 19:00:38

依云
a.k.a. 百合仙子
所在地: 一个等待妹纸出现的地方
注册时间: 2011-08-21
帖子: 4,886
个人网站

Re: unshare -U是怎么把用户变成nobody的?

65534 似乎是一个特殊值,用于在没有 id 可以用的时候。

离线

#3 2018-07-23 12:24:36

xtricman
喵了个咪
注册时间: 2012-12-26
帖子: 545

Re: unshare -U是怎么把用户变成nobody的?

依云 说:

65534 似乎是一个特殊值,用于在没有 id 可以用的时候。

昨天查了一下,是,内核设定的一个溢出值,通过/sys运行可更改的。如果没有映射,里面看就是这个值,外面看就是namespace的owner uid.
但是内核默认是65534这个值太奇怪,可能是某种历史痕迹,

离线

页脚