Hey guys,

just to help play with user namespaces some more I pushed a C version
of Eric's script for completely unprivileged use of user namespaces to
https://code.launchpad.net/~serge-hallyn/+junk/nsexec and to the
nsexec package in ppa:serge-hallyn/userns-natty.  Appending the code
below as well.  The point is:  you unshare a new user namespace, and
in there you map uid 0 to your host uid, then start a shell.  This
requires zero setup on the host (so the shadow package updates to define
per-user subuids are not needed for these games).  From that shell you
can unshare mounts, network, uts namespace, etc, and basically be root
in your fake little domain.

It's fun.  I just './usernsselfmap', and I can pretend I'm root.

BTW, Eric, where the heck does one find the latest version of
util-linux?  Latest I could find did not yet know about userns.
(Once that lands in ubuntu I can drop my nsexec altogether, as well
as lxc-unshare)

Anyway, enjoy!

#include <stdio.h>
#include <sched.h>
#include <linux/sched.h>
#include <stdlib.h>
#include <errno.h>

int writemaps(pid_t pid)
{
        FILE *fout;
        char path[1024];
        int origuid = getuid();
        int origgid = getgid();
        int ret;

        printf("starting from uid %d gid %d\n", origuid, origgid);
        snprintf(path, 1024, "/proc/%d/uid_map", pid);
        fout = fopen(path, "w");
        ret = fprintf(fout, "0 %d 1\n", origuid);
        if (ret < 0) {
                perror("writing uidmap\n");
                return -1;
        }
        ret = fclose(fout);
        if (ret < 0) {
                perror("closing uidmap\n");
                return -1;
        }

        snprintf(path, 1024, "/proc/%d/gid_map", pid);
        fout = fopen(path, "w");
        ret = fprintf(fout, "0 %d 1\n", origgid);
        if (ret < 0) {
                perror("writing gidmap\n");
                return -1;
        }
        ret = fclose(fout);
        if (ret < 0) {
                perror("closing gidmap\n");
                return -1;
        }

        return 0;
}

int main(int argc, char *argv[])
{
        char *args[] = { "/bin/bash", NULL };
        int ret, fromchildpipe[2], tochildpipe[2];
        pid_t pid;

        ret = pipe(fromchildpipe);
        if (ret < 0)
                exit(1);
        ret = pipe(tochildpipe);
        if (ret < 0)
                exit(1);

        pid = fork();
        if (pid < 0)
                exit(1);
        int x = 0;

        if (pid > 0) {
                int status;

                close(fromchildpipe[1]);
                close(tochildpipe[0]);
                read(fromchildpipe[0], &x, sizeof(x));
                if (x == 1)
                        exit(1);
                close(fromchildpipe[0]);
                ret = writemaps(pid);
                if (ret < 0) {
                        printf("Error writing maps for %d\n", pid);
                        x = 1;
                }
                write(tochildpipe[1], &x, sizeof(x));
                close(tochildpipe[1]);
                waitpid(pid, &status, __WALL);
                exit(x);
        }
        close(fromchildpipe[0]);
        close(tochildpipe[1]);
        ret = unshare(CLONE_NEWUSER);
        if (ret < 0) {
                perror("unshare");
                x = 1;
                write(fromchildpipe[1], &x, sizeof(x));
                exit(1);
        }
        write(fromchildpipe[1], &x, sizeof(x));
        read(tochildpipe[0], &x, sizeof(x));
        if (x == 1) {
                printf("error in parent writing uid maps\n");
                exit(1);
        }
        close(fromchildpipe[1]);
        close(tochildpipe[0]);
        ret = setgid(0);
        if (ret < 0)
                perror("setgid");
        ret = setuid(0);
                perror("setuid");
        printf("execing bash (I am  now %d %d)\n", getuid(), getgid());
        execv(args[0], args);
}

------------------------------------------------------------------------------
Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester  
Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the  
endpoint security space. For insight on selecting the right partner to 
tackle endpoint security challenges, access the full report. 
http://p.sf.net/sfu/symantec-dev2dev
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to