diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2013-03-20 01:38:28 -0400 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2013-03-20 14:08:41 -0400 |
commit | d34cd374905a40e65769351a2808b741b5418bf1 (patch) | |
tree | 5dbd6761c13de63a6d5b1c0733d82990abb46aef /src/core/execute.c | |
parent | 1f048a6b6bcc30d2e157711b3d231d7a944e6ffb (diff) |
Make PrivateTmp dirs also inaccessible from the outside
Currently, PrivateTmp=yes means that the service cannot see the /tmp
shared by rest of the system and is isolated from other services using
PrivateTmp, but users can access and modify /tmp as seen by the
service.
Move the private /tmp and /var/tmp directories into a 0077-mode
directory. This way unpriviledged users on the system cannot see (or
modify) /tmp as seen by the service.
Diffstat (limited to 'src/core/execute.c')
-rw-r--r-- | src/core/execute.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/src/core/execute.c b/src/core/execute.c index 18e25fa6e6..bc876a3292 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -40,6 +40,7 @@ #include <sys/poll.h> #include <linux/seccomp-bpf.h> #include <glob.h> +#include <libgen.h> #ifdef HAVE_PAM #include <security/pam_appl.h> @@ -1551,19 +1552,22 @@ void exec_context_init(ExecContext *c) { } void exec_context_tmp_dirs_done(ExecContext *c) { - assert(c); + char* dirs[] = {c->tmp_dir ? c->tmp_dir : c->var_tmp_dir, + c->tmp_dir ? c->var_tmp_dir : NULL, + NULL}; + char **dirp; - if (c->tmp_dir) { - rm_rf_dangerous(c->tmp_dir, false, true, false); - free(c->tmp_dir); - c->tmp_dir = NULL; - } + for(dirp = dirs; *dirp; dirp++) { + char *dir; + rm_rf_dangerous(*dirp, false, true, false); - if (c->var_tmp_dir) { - rm_rf_dangerous(c->var_tmp_dir, false, true, false); - free(c->var_tmp_dir); - c->var_tmp_dir = NULL; + dir = dirname(*dirp); + rmdir(dir); + + free(*dirp); } + + c->tmp_dir = c->var_tmp_dir = NULL; } void exec_context_done(ExecContext *c, bool reloading_or_reexecuting) { |