새 사용자 네임스페이스에서 "newuidmap"이 금지되는 원인은 무엇입니까?

새 사용자 네임스페이스에서 "newuidmap"이 금지되는 원인은 무엇입니까?

나는 기대

uid=0(root) gid=0(root) groups=0(root)

둘 다의 출력입니다

$ rootlesskit id
$ unshare -U bash -c 'newuidmap $$ 0 '"$(id -u)"' 1; id'

그러나 좀 더 자세한 -x명령은

$ unshare -U bash -xc 'newuidmap $$ 0 '"$(id -u)"' 1; id'

출력은 변경되지 않습니다.

+ newuidmap 41372 0 1000 1
newuidmap: uid range [0-1) -> [1000-1001) not allowed
+ id
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)

newuidmap사용자를 새 사용자 네임스페이스 uid에 매핑하는 것이 허용되지 않는 것으로 간주되는 이유는 무엇 입니까?0

여기에 포함된 정보에 대한 나의 이해man 7 사용자 네임스페이스예, 모든 사용자( CONFIG_USER_NS_UNPRIVILEGED구성되어 있다고 가정)는 새로운 사용자 네임스페이스를 실행 unshare하거나 clone생성할 수 있습니다(플래그 설정 CLONE_NEWUSER).

이제 내 주요 "추가 가치"는 newuidmap지정된 범위를 매핑하는 것이지만 /etc/subuidstrace작업은 rootlesskit다음과 같습니다.

[pid 35921] execve("/usr/bin/newuidmap", ["newuidmap", "35909", "0", "1000", "1", "1", "200000", "65536"], 0xc000002480 /* 44 vars */ <unfinished ...>
[....]
[pid 35921] openat(3, "uid_map", O_WRONLY) = 5
[pid 35921] write(5, "0 1000 1\n1 200000 65536\n", 24) = 24

마지막으로

물론 그렇지 않더라도 매핑은 완전 가능하다.newuidmap

[user1@host tmp]$ cat > unshare.c << EOF
> #define _GNU_SOURCE
#include <sched.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    int fd_uidmap;
    char mapping[255];
    sprintf(mapping,"0 %ld 1\n",(unsigned int) geteuid());
    if (unshare(CLONE_NEWUSER) == -1)
    {
        puts("error\n");
        exit(1);
    }
    fd_uidmap = open("/proc/self/uid_map",O_RDWR,NULL);
    write(fd_uidmap,mapping,strlen(mapping));
    close(fd_uidmap);
    execvp(argv[1], argv+1);
    return 0;
}
EOF
[user1@host tmp]$ gcc unshare.c -o unshare
[user1@host tmp]$ ./unshare id
uid=0(root) gid=65534(nobody) groups=65534(nobody)

관련 정보