Commit 56f8ff00 by Patrick Toomey

Set UID/GID to parent value for lxc-execute

parent e06155c9
...@@ -2604,6 +2604,9 @@ struct lxc_conf *lxc_conf_init(void) ...@@ -2604,6 +2604,9 @@ struct lxc_conf *lxc_conf_init(void)
for (i = 0; i < LXC_NS_MAX; i++) for (i = 0; i < LXC_NS_MAX; i++)
new->inherit_ns_fd[i] = -1; new->inherit_ns_fd[i] = -1;
new->parent_uid = getuid();
new->parent_gid = getgid();
return new; return new;
} }
......
...@@ -365,6 +365,10 @@ struct lxc_conf { ...@@ -365,6 +365,10 @@ struct lxc_conf {
/* init command */ /* init command */
char *init_cmd; char *init_cmd;
/* The UID/GID of the process creating the container */
uid_t parent_uid;
gid_t parent_gid;
}; };
#ifdef HAVE_TLS #ifdef HAVE_TLS
......
...@@ -667,13 +667,15 @@ static int do_start(void *data) ...@@ -667,13 +667,15 @@ static int do_start(void *data)
* privilege over our namespace. We don't become root for lxc-execute, as * privilege over our namespace. We don't become root for lxc-execute, as
* the intent is to execute a command as the original user. * the intent is to execute a command as the original user.
*/ */
if (!handler->conf->is_execute && !lxc_list_empty(&handler->conf->id_map)) { if (!lxc_list_empty(&handler->conf->id_map)) {
NOTICE("switching to gid/uid 0 in new user namespace"); gid_t new_gid = handler->conf->is_execute ? handler->conf->parent_gid : 0;
if (setgid(0)) { gid_t new_uid = handler->conf->is_execute ? handler->conf->parent_uid : 0;
NOTICE("switching to gid/uid %d/%d in new user namespace", new_gid, new_uid);
if (setgid(new_gid)) {
SYSERROR("setgid"); SYSERROR("setgid");
goto out_warn_father; goto out_warn_father;
} }
if (setuid(0)) { if (setuid(new_uid)) {
SYSERROR("setuid"); SYSERROR("setuid");
goto out_warn_father; goto out_warn_father;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment