diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 58 |
1 files changed, 58 insertions, 0 deletions
@@ -0,0 +1,58 @@ +#define _GNU_SOURCE +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <unistd.h> +#include <sys/types.h> +#include <sched.h> +#include <errno.h> +#include <assert.h> +#include <string.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <sys/mount.h> +#include <sys/wait.h> +#include "utils.h" + +void sigint_handler(int sig) { } + +int main(int argc, char **argv) { + pid_t ppid = getpid(); + + if (!fork()) { + system(aprintf("newuidmap %d 0 %d 1 1 65537 65536", ppid, getuid())); + system(aprintf("newgidmap %d 0 %d 1 1 65537 65536", ppid, getgid())); + kill(ppid, SIGINT); + return 0; + } + + unshare(CLONE_NEWNS | CLONE_NEWUSER | CLONE_NEWPID); + + signal(SIGINT, sigint_handler); + pause(); + errno = 0; // Just clear error from pause() + + pid_t chpid = fork(); + if (chpid) { + int stat; + waitpid(chpid, &stat, 0); + return stat; + } + + // mount /sys and /proc + mount("none", "/", NULL, MS_REC | MS_PRIVATE, NULL); + assert_perror(errno); + mount("none", "/proc", NULL, MS_REC | MS_PRIVATE, NULL); + assert_perror(errno); + mount("none", "/sys", NULL, MS_REC | MS_PRIVATE, NULL); + assert_perror(errno); + mount("proc", "/proc", "proc", MS_NOSUID|MS_NODEV|MS_NOEXEC, NULL); + assert_perror(errno); + + // mount proc to root + // rbind mount dev and sys to root + + // TODO verify that all upper directories have +rx rights + // TODO chroot + execv("/bin/sh", NULL); +} |