diff --git a/Makefile b/Makefile index 35cf67e..b663cc8 100644 --- a/Makefile +++ b/Makefile @@ -171,6 +171,8 @@ test: $(BIN) $(TEST_BINS) test-cmdline ifeq ($(UID),0) $(call run_test, setpriv --reuid 1000 --regid 1000 --groups 1234 -- ./nsjail -q -Mo --user 65534 --group 65534 --disable_clone_newnet --disable_clone_newcgroup --disable_clone_newns --disable_clone_newpid --disable_clone_newipc --disable_clone_newuts --disable_proc -- /bin/true, 255) $(call run_test, setpriv --reuid 1000 --regid 1000 --clear-groups -- ./nsjail -q -Mo --user 65534 --group 65534 --disable_clone_newnet --disable_clone_newcgroup --disable_clone_newns --disable_clone_newpid --disable_clone_newipc --disable_clone_newuts --disable_proc -- /bin/true, 0) + $(call run_test, setsid --fork --wait ./nsjail -q -Me --disable_clone_newuser --disable_clone_newnet --disable_clone_newcgroup --disable_clone_newns --disable_clone_newpid --disable_clone_newipc --disable_clone_newuts --disable_proc --chroot / -- /bin/true, 0) + $(call run_test, strace -f -qq -e inject=setsid:error=EPERM ./nsjail -q -Me --disable_clone_newuser --disable_clone_newnet --disable_clone_newcgroup --disable_clone_newns --disable_clone_newpid --disable_clone_newipc --disable_clone_newuts --disable_proc --chroot / -- /bin/true, 255) endif $(call run_test, ./nsjail -q -Mo --chroot / --user 99999 --group 99999 -- /bin/true < /tmp, 255) $(call run_test, ./nsjail -q -Mo --chroot / --user 99999 --group 99999 --pass_fd 0 -- /bin/true < /tmp, 0) diff --git a/contain.cc b/contain.cc index 8ad6f57..06c7534 100644 --- a/contain.cc +++ b/contain.cc @@ -147,7 +147,16 @@ static bool containPrepareEnv(nsj_t* nsj, int parent_fd, pid_t expected_parent) PLOG_W("setpriority(%d)", nsj->njc.nice_level()); } if (!nsj->njc.skip_setsid()) { - setsid(); + if (setsid() == -1) { + const int saved_errno = errno; + if (saved_errno == EPERM && getsid(0) == getpid()) { + LOG_D("Process is already a session leader (SID == PID)"); + } else { + errno = saved_errno; + PLOG_E("setsid()"); + return false; + } + } } return true; }