Make sure the plugin provides a command, argv and envp.

This commit is contained in:
Todd C. Miller
2022-07-14 09:49:00 -06:00
parent e5652fc65a
commit 75e97fd5b2
2 changed files with 47 additions and 19 deletions

View File

@@ -271,7 +271,7 @@ bad:
*/ */
static char ** static char **
update_command_info(char * const *old_command_info, const char *cmnd, update_command_info(char * const *old_command_info, const char *cmnd,
const char *runcwd, char **cmnd_out) const char *runcwd, char **cmnd_out, struct intercept_closure *closure)
{ {
char **command_info; char **command_info;
char * const *oci; char * const *oci;
@@ -281,7 +281,7 @@ update_command_info(char * const *old_command_info, const char *cmnd,
/* Rebuild command_info[] with new command and add a runcwd. */ /* Rebuild command_info[] with new command and add a runcwd. */
for (n = 0; old_command_info[n] != NULL; n++) for (n = 0; old_command_info[n] != NULL; n++)
continue; continue;
command_info = reallocarray(NULL, n + 2, sizeof(char *)); command_info = reallocarray(NULL, n + 3, sizeof(char *));
if (command_info == NULL) { if (command_info == NULL) {
goto bad; goto bad;
} }
@@ -290,19 +290,12 @@ update_command_info(char * const *old_command_info, const char *cmnd,
switch (*cp) { switch (*cp) {
case 'c': case 'c':
if (strncmp(cp, "command=", sizeof("command=") - 1) == 0) { if (strncmp(cp, "command=", sizeof("command=") - 1) == 0) {
if (cmnd != NULL) { if (cmnd == NULL) {
command_info[n] = sudo_new_key_val("command", cmnd); /* No new command specified, use old value. */
if (command_info[n] == NULL) { cmnd = cp + sizeof("command=") - 1;
goto bad;
} }
n++; /* Filled in at the end. */
continue; continue;
} else if (cmnd_out != NULL) {
*cmnd_out = strdup(cp + sizeof("command=") - 1);
if (*cmnd_out == NULL) {
goto bad;
}
}
} }
break; break;
case 'r': case 'r':
@@ -318,16 +311,38 @@ update_command_info(char * const *old_command_info, const char *cmnd,
} }
n++; n++;
} }
/* Append actual runcwd. */
command_info[n] = sudo_new_key_val("runcwd", runcwd); /* Append new command. */
if (command_info[n] == NULL) { if (cmnd == NULL) {
closure->errstr = N_("command not set by the security policy");
goto bad; goto bad;
} }
command_info[n] = sudo_new_key_val("command", cmnd);
if (command_info[n] == NULL) {
goto oom;
}
n++;
/* Append actual runcwd. */
command_info[n] = sudo_new_key_val("runcwd", runcwd ? runcwd : "unknown");
if (command_info[n] == NULL) {
goto oom;
}
n++; n++;
command_info[n] = NULL; command_info[n] = NULL;
if (cmnd_out != NULL) {
*cmnd_out = strdup(cmnd);
if (*cmnd_out == NULL) {
goto oom;
}
}
debug_return_ptr(command_info); debug_return_ptr(command_info);
oom:
closure->errstr = N_("unable to allocate memory");
bad: bad:
if (command_info != NULL) { if (command_info != NULL) {
for (n = 0; command_info[n] != NULL; n++) { for (n = 0; command_info[n] != NULL; n++) {
@@ -370,7 +385,7 @@ intercept_check_policy(const char *command, int argc, char **argv, int envc,
case 1: case 1:
/* Rebuild command_info[] with runcwd and extract command. */ /* Rebuild command_info[] with runcwd and extract command. */
command_info_copy = update_command_info(command_info, NULL, command_info_copy = update_command_info(command_info, NULL,
runcwd ? runcwd : "unknown", &closure->command); runcwd, &closure->command, closure);
if (command_info_copy == NULL) if (command_info_copy == NULL)
goto oom; goto oom;
command_info = command_info_copy; command_info = command_info_copy;
@@ -397,7 +412,7 @@ intercept_check_policy(const char *command, int argc, char **argv, int envc,
/* Rebuild command_info[] with new command and runcwd. */ /* Rebuild command_info[] with new command and runcwd. */
command_info = update_command_info(closure->details->info, command_info = update_command_info(closure->details->info,
command, runcwd ? runcwd : "unknown", NULL); command, runcwd, NULL, closure);
if (command_info == NULL) if (command_info == NULL)
goto oom; goto oom;
closure->state = POLICY_ACCEPT; closure->state = POLICY_ACCEPT;

View File

@@ -1021,6 +1021,19 @@ run_command(struct command_details *details)
cstat.type = CMD_INVALID; cstat.type = CMD_INVALID;
cstat.val = 0; cstat.val = 0;
if (details->command == NULL) {
sudo_warnx(U_("command not set by the security policy"));
debug_return_int(status);
}
if (details->argv == NULL) {
sudo_warnx(U_("argv not set by the security policy"));
debug_return_int(status);
}
if (details->envp == NULL) {
sudo_warnx(U_("envp not set by the security policy"));
debug_return_int(status);
}
sudo_execute(details, &cstat); sudo_execute(details, &cstat);
switch (cstat.type) { switch (cstat.type) {