[lxc-devel] [PATCH RFC] chroot_into_slave: move tmp-/ before chrooting to it
Serge Hallyn
serge.hallyn at ubuntu.com
Sun Oct 5 04:21:59 UTC 2014
First, make sure to remount MS_SHARED mounts as MS_SLAVE
before doing chroot_into_slave.
Then, move-mount our tmp-/ to / before chrooting to it. This
ensures that the new root is mounted on top of "/" rather than
on top of our old chroot, which allows chroot escape.
Without this, lxc users who have / on a ramfs are able to
break out of the container roots (unless otherwise protected,
i.e. by apparmor/selinux). This does not affect users who
do not have / on ramfs.
Note 1: This has only been compile-tested.
Note 2: As I mentioned we may want to do this in all cases, not
only when we detect we are on ramfs. In a case where the user
is already running out of a chroot (which could be the case in some
weird rootfs setups) container users may otherwise be able to break
out of the container chroot.
Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
---
src/lxc/conf.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index e8979c9..dbd09bd 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -1499,12 +1499,16 @@ static int chroot_into_slave(struct lxc_conf *conf)
SYSERROR("Failed to make tmp-/ at %s rslave", path);
return -1;
}
- if (chroot(path)) {
- SYSERROR("Failed to chroot into tmp-/");
+ if (chdir(path) < 0) {
+ SYSERROR("Failed to chdir into tmp-/");
return -1;
}
- if (chdir("/")) {
- SYSERROR("Failed to chdir into tmp-/");
+ if (mount(".", "/", NULL, MS_MOVE, 0) < 0) {
+ SYSERROR("Failed to move-mount tmp-/");
+ return -1;
+ }
+ if (chroot(".")) {
+ SYSERROR("Failed to chroot into tmp-/");
return -1;
}
INFO("Chrooted into tmp-/ at %s", path);
@@ -3952,6 +3956,8 @@ int do_rootfs_setup(struct lxc_conf *conf, const char *name, const char *lxcpath
}
}
+ remount_all_slave();
+
if (detect_ramfs_rootfs()) {
if (chroot_into_slave(conf)) {
ERROR("Failed to chroot into slave /");
@@ -3959,8 +3965,6 @@ int do_rootfs_setup(struct lxc_conf *conf, const char *name, const char *lxcpath
}
}
- remount_all_slave();
-
if (run_lxc_hooks(name, "pre-mount", conf, lxcpath, NULL)) {
ERROR("failed to run pre-mount hooks for container '%s'.", name);
return -1;
--
2.1.0
More information about the lxc-devel
mailing list