Defer logging of the successful command until approval plugins have run.
This adds audit plugin support to the sudoers module, currently only used for accept events. As a result, the sudoers file is now initially parsed as an audit plugin.
This commit is contained in:
@@ -26,6 +26,7 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "sudoers.h"
|
#include "sudoers.h"
|
||||||
|
|
||||||
@@ -41,15 +42,12 @@
|
|||||||
|
|
||||||
char *audit_msg = NULL;
|
char *audit_msg = NULL;
|
||||||
|
|
||||||
int
|
static int
|
||||||
audit_success(int argc, char *argv[])
|
audit_success(char *const argv[])
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
debug_decl(audit_success, SUDOERS_DEBUG_AUDIT);
|
debug_decl(audit_success, SUDOERS_DEBUG_AUDIT);
|
||||||
|
|
||||||
if (!def_log_allowed)
|
|
||||||
debug_return_int(0);
|
|
||||||
|
|
||||||
if (argv != NULL) {
|
if (argv != NULL) {
|
||||||
#ifdef HAVE_BSM_AUDIT
|
#ifdef HAVE_BSM_AUDIT
|
||||||
if (bsm_audit_success(argv) == -1)
|
if (bsm_audit_success(argv) == -1)
|
||||||
@@ -60,7 +58,7 @@ audit_success(int argc, char *argv[])
|
|||||||
rc = -1;
|
rc = -1;
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SOLARIS_AUDIT
|
#ifdef HAVE_SOLARIS_AUDIT
|
||||||
if (solaris_audit_success(argc, argv) == -1)
|
if (solaris_audit_success(argv) == -1)
|
||||||
rc = -1;
|
rc = -1;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -69,52 +67,130 @@ audit_success(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
audit_failure(int argc, char *argv[], char const *const fmt, ...)
|
audit_failure(char *const argv[], char const *const fmt, ...)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int oldlocale, rc = 0;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
debug_decl(audit_success, SUDOERS_DEBUG_AUDIT);
|
debug_decl(audit_failure, SUDOERS_DEBUG_AUDIT);
|
||||||
|
|
||||||
|
/* Audit messages should be in the sudoers locale. */
|
||||||
|
sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale);
|
||||||
|
|
||||||
/* Set audit_msg for audit plugin. */
|
/* Set audit_msg for audit plugin. */
|
||||||
free(audit_msg);
|
free(audit_msg);
|
||||||
audit_msg = NULL;
|
audit_msg = NULL;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
if (vasprintf(&audit_msg, fmt, ap) == -1)
|
if (vasprintf(&audit_msg, _(fmt), ap) == -1)
|
||||||
rc = -1;
|
rc = -1;
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
if (!def_log_denied)
|
|
||||||
debug_return_int(0);
|
|
||||||
|
|
||||||
#if defined(HAVE_BSM_AUDIT) || defined(HAVE_LINUX_AUDIT)
|
#if defined(HAVE_BSM_AUDIT) || defined(HAVE_LINUX_AUDIT)
|
||||||
if (argv != NULL) {
|
if (def_log_denied && argv != NULL) {
|
||||||
int oldlocale;
|
|
||||||
|
|
||||||
/* Audit error messages should be in the sudoers locale. */
|
|
||||||
sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale);
|
|
||||||
|
|
||||||
#ifdef HAVE_BSM_AUDIT
|
#ifdef HAVE_BSM_AUDIT
|
||||||
va_start(ap, fmt);
|
if (bsm_audit_failure(argv, audit_msg) == -1)
|
||||||
if (bsm_audit_failure(argv, _(fmt), ap) == -1)
|
|
||||||
rc = -1;
|
rc = -1;
|
||||||
va_end(ap);
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LINUX_AUDIT
|
#ifdef HAVE_LINUX_AUDIT
|
||||||
va_start(ap, fmt);
|
|
||||||
if (linux_audit_command(argv, 0) == -1)
|
if (linux_audit_command(argv, 0) == -1)
|
||||||
rc = -1;
|
rc = -1;
|
||||||
va_end(ap);
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SOLARIS_AUDIT
|
#ifdef HAVE_SOLARIS_AUDIT
|
||||||
va_start(ap, fmt);
|
if (solaris_audit_failure(argv, audit_msg) == -1)
|
||||||
if (solaris_audit_failure(argc, argv, _(fmt), ap) == -1)
|
|
||||||
rc = -1;
|
rc = -1;
|
||||||
va_end(ap);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sudoers_setlocale(oldlocale, NULL);
|
|
||||||
}
|
}
|
||||||
#endif /* HAVE_BSM_AUDIT || HAVE_LINUX_AUDIT */
|
#endif /* HAVE_BSM_AUDIT || HAVE_LINUX_AUDIT */
|
||||||
|
|
||||||
|
sudoers_setlocale(oldlocale, NULL);
|
||||||
|
|
||||||
debug_return_int(rc);
|
debug_return_int(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
sudoers_audit_open(unsigned int version, sudo_conv_t conversation,
|
||||||
|
sudo_printf_t plugin_printf, char * const settings[],
|
||||||
|
char * const user_info[], int submit_optind, char * const submit_argv[],
|
||||||
|
char * const submit_envp[], char * const plugin_options[],
|
||||||
|
const char **errstr)
|
||||||
|
{
|
||||||
|
struct sudo_conf_debug_file_list debug_files = TAILQ_HEAD_INITIALIZER(debug_files);
|
||||||
|
struct sudoers_open_info info;
|
||||||
|
const char *cp, *plugin_path = NULL;
|
||||||
|
char * const *cur;
|
||||||
|
int ret;
|
||||||
|
debug_decl(sudoers_audit_open, SUDOERS_DEBUG_PLUGIN);
|
||||||
|
|
||||||
|
/* Initialize the debug subsystem. */
|
||||||
|
for (cur = settings; (cp = *cur) != NULL; cur++) {
|
||||||
|
if (strncmp(cp, "debug_flags=", sizeof("debug_flags=") - 1) == 0) {
|
||||||
|
cp += sizeof("debug_flags=") - 1;
|
||||||
|
if (!sudoers_debug_parse_flags(&debug_files, cp))
|
||||||
|
debug_return_int(-1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (strncmp(cp, "plugin_path=", sizeof("plugin_path=") - 1) == 0) {
|
||||||
|
plugin_path = cp + sizeof("plugin_path=") - 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!sudoers_debug_register(plugin_path, &debug_files))
|
||||||
|
debug_return_int(-1);
|
||||||
|
|
||||||
|
/* Call the sudoers init function. */
|
||||||
|
info.settings = settings;
|
||||||
|
info.user_info = user_info;
|
||||||
|
info.plugin_args = plugin_options;
|
||||||
|
ret = sudoers_init(&info, submit_envp);
|
||||||
|
|
||||||
|
/* The audit functions set audit_msg on failure. */
|
||||||
|
if (ret != 1 && audit_msg != NULL)
|
||||||
|
*errstr = audit_msg;
|
||||||
|
|
||||||
|
debug_return_int(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
sudoers_audit_accept(const char *plugin_name, unsigned int plugin_type,
|
||||||
|
char * const command_info[], char * const run_argv[],
|
||||||
|
char * const run_envp[], const char **errstr)
|
||||||
|
{
|
||||||
|
debug_decl(sudoers_audit_accept, SUDOERS_DEBUG_PLUGIN);
|
||||||
|
|
||||||
|
/* Only log the accept event from the sudo front-end */
|
||||||
|
if (plugin_type != SUDO_FRONT_END)
|
||||||
|
debug_return_bool(true);
|
||||||
|
|
||||||
|
if (!def_log_allowed)
|
||||||
|
debug_return_bool(true);
|
||||||
|
|
||||||
|
if (audit_success(run_argv) != 0 && !def_ignore_audit_errors)
|
||||||
|
debug_return_bool(false);
|
||||||
|
|
||||||
|
if (!log_allowed(VALIDATE_SUCCESS) && !def_ignore_logfile_errors)
|
||||||
|
debug_return_bool(false);
|
||||||
|
debug_return_bool(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
sudoers_audit_version(int verbose)
|
||||||
|
{
|
||||||
|
debug_decl(sudoers_audit_version, SUDOERS_DEBUG_PLUGIN);
|
||||||
|
|
||||||
|
sudo_printf(SUDO_CONV_INFO_MSG, "Sudoers audit plugin version %s\n",
|
||||||
|
PACKAGE_VERSION);
|
||||||
|
|
||||||
|
debug_return_int(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
__dso_public struct audit_plugin sudoers_audit = {
|
||||||
|
SUDO_AUDIT_PLUGIN,
|
||||||
|
SUDO_API_VERSION,
|
||||||
|
sudoers_audit_open,
|
||||||
|
NULL, /* audit_close */
|
||||||
|
sudoers_audit_accept,
|
||||||
|
NULL, /* audit_reject */
|
||||||
|
NULL, /* audit_error */
|
||||||
|
sudoers_audit_version,
|
||||||
|
NULL, /* register_hooks */
|
||||||
|
NULL /* deregister_hooks */
|
||||||
|
};
|
||||||
|
@@ -129,8 +129,7 @@ sudo_auth_init(struct passwd *pw)
|
|||||||
if (IS_DISABLED(auth))
|
if (IS_DISABLED(auth))
|
||||||
continue;
|
continue;
|
||||||
if (!IS_STANDALONE(auth)) {
|
if (!IS_STANDALONE(auth)) {
|
||||||
audit_failure(NewArgc, NewArgv,
|
audit_failure(NewArgv, N_("invalid authentication methods"));
|
||||||
N_("invalid authentication methods"));
|
|
||||||
log_warningx(SLOG_SEND_MAIL,
|
log_warningx(SLOG_SEND_MAIL,
|
||||||
N_("Invalid authentication methods compiled into sudo! "
|
N_("Invalid authentication methods compiled into sudo! "
|
||||||
"You may not mix standalone and non-standalone authentication."));
|
"You may not mix standalone and non-standalone authentication."));
|
||||||
@@ -253,7 +252,7 @@ verify_user(struct passwd *pw, char *prompt, int validated,
|
|||||||
|
|
||||||
/* Make sure we have at least one auth method. */
|
/* Make sure we have at least one auth method. */
|
||||||
if (auth_switch[0].name == NULL) {
|
if (auth_switch[0].name == NULL) {
|
||||||
audit_failure(NewArgc, NewArgv, N_("no authentication methods"));
|
audit_failure(NewArgv, N_("no authentication methods"));
|
||||||
log_warningx(SLOG_SEND_MAIL,
|
log_warningx(SLOG_SEND_MAIL,
|
||||||
N_("There are no authentication methods compiled into sudo! "
|
N_("There are no authentication methods compiled into sudo! "
|
||||||
"If you want to turn off authentication, use the "
|
"If you want to turn off authentication, use the "
|
||||||
@@ -303,7 +302,7 @@ verify_user(struct passwd *pw, char *prompt, int validated,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (num_methods == 0) {
|
if (num_methods == 0) {
|
||||||
audit_failure(NewArgc, NewArgv, N_("no authentication methods"));
|
audit_failure(NewArgv, N_("no authentication methods"));
|
||||||
log_warningx(SLOG_SEND_MAIL,
|
log_warningx(SLOG_SEND_MAIL,
|
||||||
N_("Unable to initialize authentication methods."));
|
N_("Unable to initialize authentication methods."));
|
||||||
debug_return_int(-1);
|
debug_return_int(-1);
|
||||||
|
@@ -195,16 +195,15 @@ bsm_audit_success(char *exec_args[])
|
|||||||
* Returns 0 on success or -1 on error.
|
* Returns 0 on success or -1 on error.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
bsm_audit_failure(char *exec_args[], char const *const fmt, va_list ap)
|
bsm_audit_failure(char *exec_args[], const char *errmsg)
|
||||||
{
|
{
|
||||||
auditinfo_addr_t ainfo_addr;
|
auditinfo_addr_t ainfo_addr;
|
||||||
char text[256];
|
|
||||||
token_t *tok;
|
token_t *tok;
|
||||||
long au_cond;
|
long au_cond;
|
||||||
au_id_t auid;
|
au_id_t auid;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int aufd;
|
int aufd;
|
||||||
debug_decl(bsm_audit_success, SUDOERS_DEBUG_AUDIT);
|
debug_decl(bsm_audit_failure, SUDOERS_DEBUG_AUDIT);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we are not auditing, don't cut an audit record; just return.
|
* If we are not auditing, don't cut an audit record; just return.
|
||||||
@@ -257,8 +256,7 @@ bsm_audit_failure(char *exec_args[], char const *const fmt, va_list ap)
|
|||||||
debug_return_int(-1);
|
debug_return_int(-1);
|
||||||
}
|
}
|
||||||
au_write(aufd, tok);
|
au_write(aufd, tok);
|
||||||
(void) vsnprintf(text, sizeof(text), fmt, ap);
|
tok = au_to_text(errmsg);
|
||||||
tok = au_to_text(text);
|
|
||||||
if (tok == NULL) {
|
if (tok == NULL) {
|
||||||
sudo_warn("au_to_text");
|
sudo_warn("au_to_text");
|
||||||
debug_return_int(-1);
|
debug_return_int(-1);
|
||||||
|
@@ -20,7 +20,7 @@
|
|||||||
#ifndef SUDOERS_BSM_AUDIT_H
|
#ifndef SUDOERS_BSM_AUDIT_H
|
||||||
#define SUDOERS_BSM_AUDIT_H
|
#define SUDOERS_BSM_AUDIT_H
|
||||||
|
|
||||||
int bsm_audit_success(char *argv[]);
|
int bsm_audit_success(char *const argv[]);
|
||||||
int bsm_audit_failure(char *argv[], char const * const, va_list);
|
int bsm_audit_failure(char *const argv[], const char *errmsg);
|
||||||
|
|
||||||
#endif /* SUDOERS_BSM_AUDIT_H */
|
#endif /* SUDOERS_BSM_AUDIT_H */
|
||||||
|
@@ -245,7 +245,7 @@ log_denial(int status, bool inform_user)
|
|||||||
message = N_("command not allowed");
|
message = N_("command not allowed");
|
||||||
|
|
||||||
/* Do auditing first (audit_failure() handles the locale itself). */
|
/* Do auditing first (audit_failure() handles the locale itself). */
|
||||||
audit_failure(NewArgc, NewArgv, "%s", message);
|
audit_failure(NewArgv, "%s", message);
|
||||||
|
|
||||||
if (def_log_denied || mailit) {
|
if (def_log_denied || mailit) {
|
||||||
/* Log and mail messages should be in the sudoers locale. */
|
/* Log and mail messages should be in the sudoers locale. */
|
||||||
@@ -351,7 +351,7 @@ log_auth_failure(int status, unsigned int tries)
|
|||||||
debug_decl(log_auth_failure, SUDOERS_DEBUG_LOGGING);
|
debug_decl(log_auth_failure, SUDOERS_DEBUG_LOGGING);
|
||||||
|
|
||||||
/* Do auditing first (audit_failure() handles the locale itself). */
|
/* Do auditing first (audit_failure() handles the locale itself). */
|
||||||
audit_failure(NewArgc, NewArgv, "%s", N_("authentication failure"));
|
audit_failure(NewArgv, "%s", N_("authentication failure"));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do we need to send mail?
|
* Do we need to send mail?
|
||||||
|
@@ -70,8 +70,7 @@ union sudo_defs_val;
|
|||||||
bool sudoers_warn_setlocale(bool restore, int *cookie);
|
bool sudoers_warn_setlocale(bool restore, int *cookie);
|
||||||
bool sudoers_setlocale(int newlocale, int *prevlocale);
|
bool sudoers_setlocale(int newlocale, int *prevlocale);
|
||||||
int sudoers_getlocale(void);
|
int sudoers_getlocale(void);
|
||||||
int audit_success(int argc, char *argv[]);
|
int audit_failure(char *const argv[], char const *const fmt, ...) __printflike(2, 3);
|
||||||
int audit_failure(int argc, char *argv[], char const *const fmt, ...) __printflike(3, 4);
|
|
||||||
bool log_allowed(int status);
|
bool log_allowed(int status);
|
||||||
bool log_auth_failure(int status, unsigned int tries);
|
bool log_auth_failure(int status, unsigned int tries);
|
||||||
bool log_denial(int status, bool inform_user);
|
bool log_denial(int status, bool inform_user);
|
||||||
|
@@ -38,15 +38,6 @@
|
|||||||
#include "sudoers_version.h"
|
#include "sudoers_version.h"
|
||||||
#include "interfaces.h"
|
#include "interfaces.h"
|
||||||
|
|
||||||
/*
|
|
||||||
* Info passed in from the sudo front-end.
|
|
||||||
*/
|
|
||||||
struct sudoers_policy_open_info {
|
|
||||||
char * const *settings;
|
|
||||||
char * const *user_info;
|
|
||||||
char * const *plugin_args;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Command execution args to be filled in: argv, envp and command info.
|
* Command execution args to be filled in: argv, envp and command info.
|
||||||
*/
|
*/
|
||||||
@@ -95,7 +86,7 @@ parse_bool(const char *line, int varlen, int *flags, int fval)
|
|||||||
int
|
int
|
||||||
sudoers_policy_deserialize_info(void *v, char **runas_user, char **runas_group)
|
sudoers_policy_deserialize_info(void *v, char **runas_user, char **runas_group)
|
||||||
{
|
{
|
||||||
struct sudoers_policy_open_info *info = v;
|
struct sudoers_open_info *info = v;
|
||||||
char * const *cur;
|
char * const *cur;
|
||||||
const char *p, *errstr, *groups = NULL;
|
const char *p, *errstr, *groups = NULL;
|
||||||
const char *remhost = NULL;
|
const char *remhost = NULL;
|
||||||
@@ -845,7 +836,7 @@ sudoers_policy_open(unsigned int version, sudo_conv_t conversation,
|
|||||||
const char **errstr)
|
const char **errstr)
|
||||||
{
|
{
|
||||||
struct sudo_conf_debug_file_list debug_files = TAILQ_HEAD_INITIALIZER(debug_files);
|
struct sudo_conf_debug_file_list debug_files = TAILQ_HEAD_INITIALIZER(debug_files);
|
||||||
struct sudoers_policy_open_info info;
|
struct sudoers_open_info info;
|
||||||
const char *cp, *plugin_path = NULL;
|
const char *cp, *plugin_path = NULL;
|
||||||
char * const *cur;
|
char * const *cur;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -879,7 +870,7 @@ sudoers_policy_open(unsigned int version, sudo_conv_t conversation,
|
|||||||
info.settings = settings;
|
info.settings = settings;
|
||||||
info.user_info = user_info;
|
info.user_info = user_info;
|
||||||
info.plugin_args = args;
|
info.plugin_args = args;
|
||||||
ret = sudoers_policy_init(&info, envp);
|
ret = sudoers_init(&info, envp);
|
||||||
|
|
||||||
/* The audit functions set audit_msg on failure. */
|
/* The audit functions set audit_msg on failure. */
|
||||||
if (ret != 1 && audit_msg != NULL) {
|
if (ret != 1 && audit_msg != NULL) {
|
||||||
|
@@ -44,8 +44,10 @@ static char cwd[PATH_MAX];
|
|||||||
static char cmdpath[PATH_MAX];
|
static char cmdpath[PATH_MAX];
|
||||||
|
|
||||||
static int
|
static int
|
||||||
adt_sudo_common(int argc, char *argv[])
|
adt_sudo_common(char *argv[])
|
||||||
{
|
{
|
||||||
|
int argc;
|
||||||
|
|
||||||
if (adt_start_session(&ah, NULL, ADT_USE_PROC_DATA) != 0) {
|
if (adt_start_session(&ah, NULL, ADT_USE_PROC_DATA) != 0) {
|
||||||
log_warning(SLOG_NO_STDERR, "adt_start_session");
|
log_warning(SLOG_NO_STDERR, "adt_start_session");
|
||||||
return -1;
|
return -1;
|
||||||
@@ -76,6 +78,9 @@ adt_sudo_common(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (argc = 0; argv[argc] != NULL; argc++)
|
||||||
|
continue;
|
||||||
|
|
||||||
event->adt_sudo.cmdpath = cmdpath;
|
event->adt_sudo.cmdpath = cmdpath;
|
||||||
event->adt_sudo.argc = argc - 1;
|
event->adt_sudo.argc = argc - 1;
|
||||||
event->adt_sudo.argv = &argv[1];
|
event->adt_sudo.argv = &argv[1];
|
||||||
@@ -89,11 +94,11 @@ adt_sudo_common(int argc, char *argv[])
|
|||||||
* Returns 0 on success or -1 on error.
|
* Returns 0 on success or -1 on error.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
solaris_audit_success(int argc, char *argv[])
|
solaris_audit_success(char *argv[])
|
||||||
{
|
{
|
||||||
int rc = -1;
|
int rc = -1;
|
||||||
|
|
||||||
if (adt_sudo_common(argc, argv) != 0) {
|
if (adt_sudo_common(argv) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (adt_put_event(event, ADT_SUCCESS, ADT_SUCCESS) != 0) {
|
if (adt_put_event(event, ADT_SUCCESS, ADT_SUCCESS) != 0) {
|
||||||
@@ -111,23 +116,20 @@ solaris_audit_success(int argc, char *argv[])
|
|||||||
* Returns 0 on success or -1 on error.
|
* Returns 0 on success or -1 on error.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
solaris_audit_failure(int argc, char *argv[], char const *const fmt, va_list ap)
|
solaris_audit_failure(char *argv[], const char *errmsg)
|
||||||
{
|
{
|
||||||
int rc = -1;
|
int rc = -1;
|
||||||
|
|
||||||
if (adt_sudo_common(argc, argv) != 0) {
|
if (adt_sudo_common(argv) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (vasprintf(&event->adt_sudo.errmsg, fmt, ap) == -1) {
|
|
||||||
log_warning(SLOG_NO_STDERR,
|
event->adt_sudo.errmsg = errmsg;
|
||||||
_("audit_failure message too long"));
|
|
||||||
}
|
|
||||||
if (adt_put_event(event, ADT_FAILURE, ADT_FAIL_VALUE_PROGRAM) != 0) {
|
if (adt_put_event(event, ADT_FAILURE, ADT_FAIL_VALUE_PROGRAM) != 0) {
|
||||||
log_warning(SLOG_NO_STDERR, "adt_put_event(ADT_FAILURE)");
|
log_warning(SLOG_NO_STDERR, "adt_put_event(ADT_FAILURE)");
|
||||||
} else {
|
} else {
|
||||||
rc = 0;
|
rc = 0;
|
||||||
}
|
}
|
||||||
free(event->adt_sudo.errmsg);
|
|
||||||
adt_free_event(event);
|
adt_free_event(event);
|
||||||
(void) adt_end_session(ah);
|
(void) adt_end_session(ah);
|
||||||
|
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
#ifndef SUDOERS_SOLARIS_AUDIT_H
|
#ifndef SUDOERS_SOLARIS_AUDIT_H
|
||||||
#define SUDOERS_SOLARIS_AUDIT_H
|
#define SUDOERS_SOLARIS_AUDIT_H
|
||||||
|
|
||||||
int solaris_audit_success(int argc, char *argv[]);
|
int solaris_audit_success(char *const argv[]);
|
||||||
int solaris_audit_failure(int argc, char *argv[], char const *const fmt, va_list);
|
int solaris_audit_failure(char *const argv[], const char *errmsg);
|
||||||
|
|
||||||
#endif /* SUDOERS_SOLARIS_AUDIT_H */
|
#endif /* SUDOERS_SOLARIS_AUDIT_H */
|
||||||
|
@@ -157,12 +157,15 @@ restore_nproc(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sudoers_policy_init(void *info, char * const envp[])
|
sudoers_init(void *info, char * const envp[])
|
||||||
{
|
{
|
||||||
struct sudo_nss *nss, *nss_next;
|
struct sudo_nss *nss, *nss_next;
|
||||||
int oldlocale, sources = 0;
|
int oldlocale, sources = 0;
|
||||||
int ret = -1;
|
static int ret = -1;
|
||||||
debug_decl(sudoers_policy_init, SUDOERS_DEBUG_PLUGIN);
|
debug_decl(sudoers_init, SUDOERS_DEBUG_PLUGIN);
|
||||||
|
|
||||||
|
if (ret == true)
|
||||||
|
debug_return_int(true);
|
||||||
|
|
||||||
bindtextdomain("sudoers", LOCALEDIR);
|
bindtextdomain("sudoers", LOCALEDIR);
|
||||||
|
|
||||||
@@ -350,7 +353,7 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
|
|||||||
/* Check for -C overriding def_closefrom. */
|
/* Check for -C overriding def_closefrom. */
|
||||||
if (user_closefrom >= 0 && user_closefrom != def_closefrom) {
|
if (user_closefrom >= 0 && user_closefrom != def_closefrom) {
|
||||||
if (!def_closefrom_override) {
|
if (!def_closefrom_override) {
|
||||||
audit_failure(NewArgc, NewArgv,
|
audit_failure(NewArgv,
|
||||||
N_("user not allowed to override closefrom limit"));
|
N_("user not allowed to override closefrom limit"));
|
||||||
sudo_warnx(U_("you are not permitted to use the -C option"));
|
sudo_warnx(U_("you are not permitted to use the -C option"));
|
||||||
goto bad;
|
goto bad;
|
||||||
@@ -381,15 +384,13 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
|
|||||||
|
|
||||||
/* Defer uid/gid checks until after defaults have been updated. */
|
/* Defer uid/gid checks until after defaults have been updated. */
|
||||||
if (unknown_runas_uid && !def_runas_allow_unknown_id) {
|
if (unknown_runas_uid && !def_runas_allow_unknown_id) {
|
||||||
audit_failure(NewArgc, NewArgv, N_("unknown user: %s"),
|
audit_failure(NewArgv, N_("unknown user: %s"), runas_pw->pw_name);
|
||||||
runas_pw->pw_name);
|
|
||||||
sudo_warnx(U_("unknown user: %s"), runas_pw->pw_name);
|
sudo_warnx(U_("unknown user: %s"), runas_pw->pw_name);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (runas_gr != NULL) {
|
if (runas_gr != NULL) {
|
||||||
if (unknown_runas_gid && !def_runas_allow_unknown_id) {
|
if (unknown_runas_gid && !def_runas_allow_unknown_id) {
|
||||||
audit_failure(NewArgc, NewArgv, N_("unknown group: %s"),
|
audit_failure(NewArgv, N_("unknown group: %s"), runas_gr->gr_name);
|
||||||
runas_gr->gr_name);
|
|
||||||
sudo_warnx(U_("unknown group: %s"), runas_gr->gr_name);
|
sudo_warnx(U_("unknown group: %s"), runas_gr->gr_name);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
@@ -431,14 +432,14 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
|
|||||||
|
|
||||||
/* Bail if a tty is required and we don't have one. */
|
/* Bail if a tty is required and we don't have one. */
|
||||||
if (def_requiretty && !tty_present()) {
|
if (def_requiretty && !tty_present()) {
|
||||||
audit_failure(NewArgc, NewArgv, N_("no tty"));
|
audit_failure(NewArgv, N_("no tty"));
|
||||||
sudo_warnx(U_("sorry, you must have a tty to run sudo"));
|
sudo_warnx(U_("sorry, you must have a tty to run sudo"));
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check runas user's shell. */
|
/* Check runas user's shell. */
|
||||||
if (!check_user_shell(runas_pw)) {
|
if (!check_user_shell(runas_pw)) {
|
||||||
audit_failure(NewArgc, NewArgv, N_("invalid shell for user %s: %s"),
|
audit_failure(NewArgv, N_("invalid shell for user %s: %s"),
|
||||||
runas_pw->pw_name, runas_pw->pw_shell);
|
runas_pw->pw_name, runas_pw->pw_shell);
|
||||||
log_warningx(SLOG_RAW_MSG, N_("invalid shell for user %s: %s"),
|
log_warningx(SLOG_RAW_MSG, N_("invalid shell for user %s: %s"),
|
||||||
runas_pw->pw_name, runas_pw->pw_shell);
|
runas_pw->pw_name, runas_pw->pw_shell);
|
||||||
@@ -503,16 +504,16 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
|
|||||||
|
|
||||||
/* Finally tell the user if the command did not exist. */
|
/* Finally tell the user if the command did not exist. */
|
||||||
if (cmnd_status == NOT_FOUND_DOT) {
|
if (cmnd_status == NOT_FOUND_DOT) {
|
||||||
audit_failure(NewArgc, NewArgv, N_("command in current directory"));
|
audit_failure(NewArgv, N_("command in current directory"));
|
||||||
sudo_warnx(U_("ignoring \"%s\" found in '.'\nUse \"sudo ./%s\" if this is the \"%s\" you wish to run."), user_cmnd, user_cmnd, user_cmnd);
|
sudo_warnx(U_("ignoring \"%s\" found in '.'\nUse \"sudo ./%s\" if this is the \"%s\" you wish to run."), user_cmnd, user_cmnd, user_cmnd);
|
||||||
goto bad;
|
goto bad;
|
||||||
} else if (cmnd_status == NOT_FOUND) {
|
} else if (cmnd_status == NOT_FOUND) {
|
||||||
if (ISSET(sudo_mode, MODE_CHECK)) {
|
if (ISSET(sudo_mode, MODE_CHECK)) {
|
||||||
audit_failure(NewArgc, NewArgv, N_("%s: command not found"),
|
audit_failure(NewArgv, N_("%s: command not found"),
|
||||||
NewArgv[0]);
|
NewArgv[0]);
|
||||||
sudo_warnx(U_("%s: command not found"), NewArgv[0]);
|
sudo_warnx(U_("%s: command not found"), NewArgv[0]);
|
||||||
} else {
|
} else {
|
||||||
audit_failure(NewArgc, NewArgv, N_("%s: command not found"),
|
audit_failure(NewArgv, N_("%s: command not found"),
|
||||||
user_cmnd);
|
user_cmnd);
|
||||||
sudo_warnx(U_("%s: command not found"), user_cmnd);
|
sudo_warnx(U_("%s: command not found"), user_cmnd);
|
||||||
}
|
}
|
||||||
@@ -521,8 +522,7 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
|
|||||||
|
|
||||||
/* If user specified a timeout make sure sudoers allows it. */
|
/* If user specified a timeout make sure sudoers allows it. */
|
||||||
if (!def_user_command_timeouts && user_timeout > 0) {
|
if (!def_user_command_timeouts && user_timeout > 0) {
|
||||||
audit_failure(NewArgc, NewArgv,
|
audit_failure(NewArgv, N_("user not allowed to set a command timeout"));
|
||||||
N_("user not allowed to set a command timeout"));
|
|
||||||
sudo_warnx(U_("sorry, you are not allowed set a command timeout"));
|
sudo_warnx(U_("sorry, you are not allowed set a command timeout"));
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
@@ -530,7 +530,7 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
|
|||||||
/* If user specified env vars make sure sudoers allows it. */
|
/* If user specified env vars make sure sudoers allows it. */
|
||||||
if (ISSET(sudo_mode, MODE_RUN) && !def_setenv) {
|
if (ISSET(sudo_mode, MODE_RUN) && !def_setenv) {
|
||||||
if (ISSET(sudo_mode, MODE_PRESERVE_ENV)) {
|
if (ISSET(sudo_mode, MODE_PRESERVE_ENV)) {
|
||||||
audit_failure(NewArgc, NewArgv,
|
audit_failure(NewArgv,
|
||||||
N_("user not allowed to set a preserve the environment"));
|
N_("user not allowed to set a preserve the environment"));
|
||||||
sudo_warnx(U_("sorry, you are not allowed to preserve the environment"));
|
sudo_warnx(U_("sorry, you are not allowed to preserve the environment"));
|
||||||
goto bad;
|
goto bad;
|
||||||
@@ -552,9 +552,6 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!log_allowed(validated) && !def_ignore_logfile_errors)
|
|
||||||
goto bad;
|
|
||||||
|
|
||||||
switch (sudo_mode & MODE_MASK) {
|
switch (sudo_mode & MODE_MASK) {
|
||||||
case MODE_CHECK:
|
case MODE_CHECK:
|
||||||
ret = display_cmnd(snl, list_pw ? list_pw : sudo_user.pw);
|
ret = display_cmnd(snl, list_pw ? list_pw : sudo_user.pw);
|
||||||
@@ -665,7 +662,7 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
|
|||||||
if (safe_cmnd == NULL) {
|
if (safe_cmnd == NULL) {
|
||||||
if (errno != ENOENT)
|
if (errno != ENOENT)
|
||||||
goto done;
|
goto done;
|
||||||
audit_failure(NewArgc, NewArgv, N_("%s: command not found"),
|
audit_failure(NewArgv, N_("%s: command not found"),
|
||||||
env_editor ? env_editor : def_editor);
|
env_editor ? env_editor : def_editor);
|
||||||
sudo_warnx(U_("%s: command not found"),
|
sudo_warnx(U_("%s: command not found"),
|
||||||
env_editor ? env_editor : def_editor);
|
env_editor ? env_editor : def_editor);
|
||||||
@@ -674,14 +671,9 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
|
|||||||
sudoers_gc_add(GC_VECTOR, edit_argv);
|
sudoers_gc_add(GC_VECTOR, edit_argv);
|
||||||
NewArgv = edit_argv;
|
NewArgv = edit_argv;
|
||||||
NewArgc = edit_argc;
|
NewArgc = edit_argc;
|
||||||
if (audit_success(NewArgc, NewArgv) != 0 && !def_ignore_audit_errors)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
/* We want to run the editor with the unmodified environment. */
|
/* We want to run the editor with the unmodified environment. */
|
||||||
env_swap_old();
|
env_swap_old();
|
||||||
} else {
|
|
||||||
if (audit_success(NewArgc, NewArgv) != 0 && !def_ignore_audit_errors)
|
|
||||||
goto done;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
goto done;
|
goto done;
|
||||||
@@ -883,7 +875,7 @@ set_cmnd(void)
|
|||||||
}
|
}
|
||||||
if (ret == NOT_FOUND_ERROR) {
|
if (ret == NOT_FOUND_ERROR) {
|
||||||
if (errno == ENAMETOOLONG) {
|
if (errno == ENAMETOOLONG) {
|
||||||
audit_failure(NewArgc, NewArgv, N_("command too long"));
|
audit_failure(NewArgv, N_("command too long"));
|
||||||
}
|
}
|
||||||
log_warning(0, "%s", NewArgv[0]);
|
log_warning(0, "%s", NewArgv[0]);
|
||||||
debug_return_int(ret);
|
debug_return_int(ret);
|
||||||
|
@@ -48,6 +48,15 @@
|
|||||||
#include "sudo_util.h"
|
#include "sudo_util.h"
|
||||||
#include "sudoers_debug.h"
|
#include "sudoers_debug.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Info passed in from the sudo front-end.
|
||||||
|
*/
|
||||||
|
struct sudoers_open_info {
|
||||||
|
char * const *settings;
|
||||||
|
char * const *user_info;
|
||||||
|
char * const *plugin_args;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Supplementary group IDs for a user.
|
* Supplementary group IDs for a user.
|
||||||
*/
|
*/
|
||||||
@@ -379,7 +388,7 @@ bool matches_env_pattern(const char *pattern, const char *var, bool *full_match)
|
|||||||
|
|
||||||
/* sudoers.c */
|
/* sudoers.c */
|
||||||
FILE *open_sudoers(const char *, bool, bool *);
|
FILE *open_sudoers(const char *, bool, bool *);
|
||||||
int sudoers_policy_init(void *info, char * const envp[]);
|
int sudoers_init(void *info, char * const envp[]);
|
||||||
int sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[], bool verbose, void *closure);
|
int sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[], bool verbose, void *closure);
|
||||||
void sudoers_cleanup(void);
|
void sudoers_cleanup(void);
|
||||||
extern struct sudo_user sudo_user;
|
extern struct sudo_user sudo_user;
|
||||||
|
Reference in New Issue
Block a user