X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fexecute.c;h=e6c19993aefd4cf769c3fa11e81d4adce92ffaa4;hb=c21b92ffe7ef939dd32502ac912cf8ad1c5638fd;hp=8b9bb27137c24b3cefbbbb4deca9bcae122deff6;hpb=e63ff941eaa012ffd003e3791438c73b8a26227d;p=elogind.git diff --git a/src/core/execute.c b/src/core/execute.c index 8b9bb2713..e6c19993a 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -83,6 +83,7 @@ #include "af-list.h" #include "mkdir.h" #include "apparmor-util.h" +#include "smack-util.h" #include "bus-kernel.h" #include "label.h" @@ -1444,8 +1445,10 @@ static int exec_child(ExecCommand *command, } #endif -#ifdef HAVE_PAM - if (params->cgroup_path && context->user && context->pam_name) { + /* If delegation is enabled we'll pass ownership of the cgroup + * (but only in systemd's own controller hierarchy!) to the + * user of the new process. */ + if (params->cgroup_path && context->user && params->cgroup_delegate) { err = cg_set_task_access(SYSTEMD_CGROUP_CONTROLLER, params->cgroup_path, 0644, uid, gid); if (err < 0) { *error = EXIT_CGROUP; @@ -1459,7 +1462,6 @@ static int exec_child(ExecCommand *command, return err; } } -#endif if (!strv_isempty(context->runtime_directory) && params->runtime_prefix) { char **rt; @@ -1545,7 +1547,10 @@ static int exec_child(ExecCommand *command, context->protect_home, context->protect_system, context->mount_flags); - if (err < 0) { + + if (err == -EPERM) + log_warning_unit(params->unit_id, "Failed to set up file system namespace due to lack of privileges. Execution sandbox will not be in effect: %s", strerror(-err)); + else if (err < 0) { *error = EXIT_NAMESPACE; return err; } @@ -1614,6 +1619,16 @@ static int exec_child(ExecCommand *command, } } +#ifdef HAVE_SMACK + if (context->smack_process_label) { + err = mac_smack_apply_pid(0, context->smack_process_label); + if (err < 0) { + *error = EXIT_SMACK_PROCESS_LABEL; + return err; + } + } +#endif + if (context->user) { err = enforce_user(context, uid); if (err < 0) { @@ -1666,7 +1681,7 @@ static int exec_child(ExecCommand *command, #endif #ifdef HAVE_SELINUX - if (use_selinux()) { + if (mac_selinux_use()) { if (context->selinux_context) { err = setexeccon(context->selinux_context); if (err < 0 && !context->selinux_context_ignore) { @@ -1678,7 +1693,7 @@ static int exec_child(ExecCommand *command, if (params->selinux_context_net && socket_fd >= 0) { _cleanup_free_ char *label = NULL; - err = label_get_child_mls_label(socket_fd, command->path, &label); + err = mac_selinux_get_child_mls_label(socket_fd, command->path, &label); if (err < 0) { *error = EXIT_SELINUX_CONTEXT; return err; @@ -1694,11 +1709,11 @@ static int exec_child(ExecCommand *command, #endif #ifdef HAVE_APPARMOR - if (context->apparmor_profile && use_apparmor()) { + if (context->apparmor_profile && mac_apparmor_use()) { err = aa_change_onexec(context->apparmor_profile); if (err < 0 && !context->apparmor_profile_ignore) { *error = EXIT_APPARMOR_PROFILE; - return err; + return -errno; } } #endif @@ -1782,7 +1797,7 @@ int exec_spawn(ExecCommand *command, n_fds = params->n_fds; } - err = exec_context_load_environment(context, &files_env); + err = exec_context_load_environment(context, params->unit_id, &files_env); if (err < 0) { log_struct_unit(LOG_ERR, params->unit_id, @@ -2011,7 +2026,7 @@ void exec_command_free_array(ExecCommand **c, unsigned n) { } } -int exec_context_load_environment(const ExecContext *c, char ***l) { +int exec_context_load_environment(const ExecContext *c, const char *unit_id, char ***l) { char **i, **r = NULL; assert(c); @@ -2068,7 +2083,7 @@ int exec_context_load_environment(const ExecContext *c, char ***l) { } /* Log invalid environment variables with filename */ if (p) - p = strv_env_clean_log(p, pglob.gl_pathv[n]); + p = strv_env_clean_log(p, unit_id, pglob.gl_pathv[n]); if (r == NULL) r = p; @@ -2399,6 +2414,21 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) { prefix, c->apparmor_profile_ignore ? "-" : "", c->apparmor_profile); } +bool exec_context_maintains_privileges(ExecContext *c) { + assert(c); + + /* Returns true if the process forked off would run run under + * an unchanged UID or as root. */ + + if (!c->user) + return true; + + if (streq(c->user, "root") || streq(c->user, "0")) + return true; + + return false; +} + void exec_status_start(ExecStatus *s, pid_t pid) { assert(s);