Normally, sudo disables core dumps while it is running. This
behavior can now be modified at run time with a line in sudo.conf like "Set disable_coredumps false"
This commit is contained in:
10
NEWS
10
NEWS
@@ -72,6 +72,16 @@ What's new in Sudo 1.8.4?
|
|||||||
now run "visudo -c". Previously, write permissions were required
|
now run "visudo -c". Previously, write permissions were required
|
||||||
even though no writing is down in check-only mode.
|
even though no writing is down in check-only mode.
|
||||||
|
|
||||||
|
* It is now possible to prevent the disabling of core dumps from
|
||||||
|
within sudo itself by adding a line to the sudo.conf file like
|
||||||
|
"Set disable_coredump false".
|
||||||
|
|
||||||
|
What's new in Sudo 1.8.3p2?
|
||||||
|
|
||||||
|
* Fixed a format string vulnerability when the sudo binary (or a
|
||||||
|
symbolic link to the sudo binary) contains printf format escapes
|
||||||
|
and the -D (debugging) flag is used.
|
||||||
|
|
||||||
What's new in Sudo 1.8.3p1?
|
What's new in Sudo 1.8.3p1?
|
||||||
|
|
||||||
* Fixed a crash in the monitor process on Solaris when NOPASSWD
|
* Fixed a crash in the monitor process on Solaris when NOPASSWD
|
||||||
|
@@ -59,6 +59,8 @@
|
|||||||
# define _PATH_SUDO_ASKPASS NULL
|
# define _PATH_SUDO_ASKPASS NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern bool atobool(const char *str); /* atobool.c */
|
||||||
|
|
||||||
struct sudo_conf_table {
|
struct sudo_conf_table {
|
||||||
const char *name;
|
const char *name;
|
||||||
unsigned int namelen;
|
unsigned int namelen;
|
||||||
@@ -74,19 +76,23 @@ struct sudo_conf_paths {
|
|||||||
static bool set_debug(const char *entry);
|
static bool set_debug(const char *entry);
|
||||||
static bool set_path(const char *entry);
|
static bool set_path(const char *entry);
|
||||||
static bool set_plugin(const char *entry);
|
static bool set_plugin(const char *entry);
|
||||||
|
static bool set_variable(const char *entry);
|
||||||
|
|
||||||
static struct sudo_conf_table sudo_conf_table[] = {
|
static struct sudo_conf_table sudo_conf_table[] = {
|
||||||
{ "Debug", sizeof("Debug") - 1, set_debug },
|
{ "Debug", sizeof("Debug") - 1, set_debug },
|
||||||
{ "Path", sizeof("Path") - 1, set_path },
|
{ "Path", sizeof("Path") - 1, set_path },
|
||||||
{ "Plugin", sizeof("Plugin") - 1, set_plugin },
|
{ "Plugin", sizeof("Plugin") - 1, set_plugin },
|
||||||
|
{ "Set", sizeof("Set") - 1, set_variable },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sudo_conf_data {
|
static struct sudo_conf_data {
|
||||||
|
bool disable_coredump;
|
||||||
const char *debug_flags;
|
const char *debug_flags;
|
||||||
struct sudo_conf_paths paths[3];
|
struct sudo_conf_paths paths[3];
|
||||||
struct plugin_info_list plugins;
|
struct plugin_info_list plugins;
|
||||||
} sudo_conf_data = {
|
} sudo_conf_data = {
|
||||||
|
true,
|
||||||
NULL,
|
NULL,
|
||||||
{
|
{
|
||||||
#define SUDO_CONF_ASKPASS_IDX 0
|
#define SUDO_CONF_ASKPASS_IDX 0
|
||||||
@@ -99,6 +105,26 @@ static struct sudo_conf_data {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "Set variable_name value"
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
set_variable(const char *entry)
|
||||||
|
{
|
||||||
|
#undef DC_LEN
|
||||||
|
#define DC_LEN (sizeof("disable_coredump") - 1)
|
||||||
|
/* Currently the only variable supported is "disable_coredump". */
|
||||||
|
if (strncmp(entry, "disable_coredump", DC_LEN) == 0 &&
|
||||||
|
isblank((unsigned char)entry[DC_LEN])) {
|
||||||
|
entry += DC_LEN + 1;
|
||||||
|
while (isblank((unsigned char)*entry))
|
||||||
|
entry++;
|
||||||
|
sudo_conf_data.disable_coredump = atobool(entry);
|
||||||
|
}
|
||||||
|
#undef DC_LEN
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "Debug progname debug_file debug_flags"
|
* "Debug progname debug_file debug_flags"
|
||||||
*/
|
*/
|
||||||
@@ -217,6 +243,12 @@ sudo_conf_plugins(void)
|
|||||||
return &sudo_conf_data.plugins;
|
return &sudo_conf_data.plugins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
sudo_conf_disable_coredump(void)
|
||||||
|
{
|
||||||
|
return sudo_conf_data.disable_coredump;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reads in /etc/sudo.conf
|
* Reads in /etc/sudo.conf
|
||||||
* Returns a list of plugins.
|
* Returns a list of plugins.
|
||||||
|
@@ -5,6 +5,8 @@
|
|||||||
# Plugin plugin_name plugin_path
|
# Plugin plugin_name plugin_path
|
||||||
# Path askpass /path/to/askpass
|
# Path askpass /path/to/askpass
|
||||||
# Path noexec /path/to/noexec.so
|
# Path noexec /path/to/noexec.so
|
||||||
|
# Debug sudo /var/log/sudo_debug all@warn
|
||||||
|
# Set disable_coredump true
|
||||||
#
|
#
|
||||||
# Sudo plugins:
|
# Sudo plugins:
|
||||||
#
|
#
|
||||||
@@ -40,3 +42,13 @@ Plugin sudoers_io sudoers.so
|
|||||||
# if you rename or move the sudo_noexec.so file.
|
# if you rename or move the sudo_noexec.so file.
|
||||||
#
|
#
|
||||||
#Path noexec /usr/libexec/sudo_noexec.so
|
#Path noexec /usr/libexec/sudo_noexec.so
|
||||||
|
|
||||||
|
#
|
||||||
|
# Core dumps:
|
||||||
|
#
|
||||||
|
# By default, sudo disables core dumps while it is executing (they
|
||||||
|
# are re-enabled for the command that is run).
|
||||||
|
# To aid in debugging sudo problems, you may wish to enable core
|
||||||
|
# dumps by setting "disable_coredump" to false.
|
||||||
|
#
|
||||||
|
#Set disable_coredump false
|
||||||
|
15
doc/sudo.pod
15
doc/sudo.pod
@@ -425,6 +425,7 @@ which corresponds to the following F<@sysconfdir@/sudo.conf> file.
|
|||||||
# Path askpass /path/to/askpass
|
# Path askpass /path/to/askpass
|
||||||
# Path noexec /path/to/noexec.so
|
# Path noexec /path/to/noexec.so
|
||||||
# Debug sudo /var/log/sudo_debug all@warn
|
# Debug sudo /var/log/sudo_debug all@warn
|
||||||
|
# Set disable_coredump true
|
||||||
#
|
#
|
||||||
# The plugin_path is relative to @prefix@/libexec unless
|
# The plugin_path is relative to @prefix@/libexec unless
|
||||||
# fully qualified.
|
# fully qualified.
|
||||||
@@ -553,6 +554,20 @@ commands via B<sudo> to verify that the command does not inadvertently
|
|||||||
give the user an effective root shell. For more information, please
|
give the user an effective root shell. For more information, please
|
||||||
see the C<PREVENTING SHELL ESCAPES> section in L<sudoers(5)>.
|
see the C<PREVENTING SHELL ESCAPES> section in L<sudoers(5)>.
|
||||||
|
|
||||||
|
To prevent the disclosure of potentially sensitive information,
|
||||||
|
B<sudo> disables core dumps by default while it is executing (they
|
||||||
|
are re-enabled for the command that is run). To aid in debugging
|
||||||
|
B<sudo> crashes, you may wish to re-enable core dumps by setting
|
||||||
|
"disable_coredump" to false in the F<@sysconfdir@/sudo.conf> file.
|
||||||
|
|
||||||
|
Set disable_coredump false
|
||||||
|
|
||||||
|
Note that by default, most operating systems disable core dumps
|
||||||
|
from setuid programs, which includes B<sudo>. To actually get a
|
||||||
|
B<sudo> core file you may need to enable core dumps for setuid
|
||||||
|
processes. On BSD and Linux systems this is accomplished via the
|
||||||
|
sysctl command, on Solaris the coreadm command can be used.
|
||||||
|
|
||||||
=head1 ENVIRONMENT
|
=head1 ENVIRONMENT
|
||||||
|
|
||||||
B<sudo> utilizes the following environment variables. The security
|
B<sudo> utilizes the following environment variables. The security
|
||||||
|
@@ -35,5 +35,6 @@ const char *sudo_conf_askpass_path(void);
|
|||||||
const char *sudo_conf_noexec_path(void);
|
const char *sudo_conf_noexec_path(void);
|
||||||
const char *sudo_conf_debug_flags(void);
|
const char *sudo_conf_debug_flags(void);
|
||||||
struct plugin_info_list *sudo_conf_plugins(void);
|
struct plugin_info_list *sudo_conf_plugins(void);
|
||||||
|
bool sudo_conf_disable_coredump(void);
|
||||||
|
|
||||||
#endif /* _SUDO_CONF_H */
|
#endif /* _SUDO_CONF_H */
|
||||||
|
35
src/sudo.c
35
src/sudo.c
@@ -137,9 +137,9 @@ static void iolog_close(struct plugin_container *plugin, int exit_status,
|
|||||||
int error);
|
int error);
|
||||||
static int iolog_show_version(struct plugin_container *plugin, int verbose);
|
static int iolog_show_version(struct plugin_container *plugin, int verbose);
|
||||||
|
|
||||||
#if defined(RLIMIT_CORE) && !defined(SUDO_DEVEL)
|
#ifdef RLIMIT_CORE
|
||||||
static struct rlimit corelimit;
|
static struct rlimit corelimit;
|
||||||
#endif /* RLIMIT_CORE && !SUDO_DEVEL */
|
#endif /* RLIMIT_CORE */
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
static struct rlimit nproclimit;
|
static struct rlimit nproclimit;
|
||||||
#endif
|
#endif
|
||||||
@@ -188,10 +188,9 @@ main(int argc, char *argv[], char *envp[])
|
|||||||
if (geteuid() != 0)
|
if (geteuid() != 0)
|
||||||
errorx(1, _("must be setuid root"));
|
errorx(1, _("must be setuid root"));
|
||||||
|
|
||||||
/* Reset signal mask, disable core dumps and make sure fds 0-2 are open. */
|
/* Reset signal mask and make sure fds 0-2 are open. */
|
||||||
(void) sigemptyset(&mask);
|
(void) sigemptyset(&mask);
|
||||||
(void) sigprocmask(SIG_SETMASK, &mask, NULL);
|
(void) sigprocmask(SIG_SETMASK, &mask, NULL);
|
||||||
disable_coredumps();
|
|
||||||
fix_fds();
|
fix_fds();
|
||||||
|
|
||||||
/* Fill in user_info with user name, uid, cwd, etc. */
|
/* Fill in user_info with user name, uid, cwd, etc. */
|
||||||
@@ -201,6 +200,9 @@ main(int argc, char *argv[], char *envp[])
|
|||||||
/* Read sudo.conf. */
|
/* Read sudo.conf. */
|
||||||
sudo_conf_read();
|
sudo_conf_read();
|
||||||
|
|
||||||
|
/* Disable core dumps if not enabled in sudo.conf. */
|
||||||
|
disable_coredumps();
|
||||||
|
|
||||||
/* Parse command line arguments. */
|
/* Parse command line arguments. */
|
||||||
sudo_mode = parse_args(argc, argv, &nargc, &nargv, &settings, &env_add);
|
sudo_mode = parse_args(argc, argv, &nargc, &nargv, &settings, &env_add);
|
||||||
sudo_debug_printf(SUDO_DEBUG_DEBUG, "sudo_mode %d", sudo_mode);
|
sudo_debug_printf(SUDO_DEBUG_DEBUG, "sudo_mode %d", sudo_mode);
|
||||||
@@ -287,9 +289,10 @@ main(int argc, char *argv[], char *envp[])
|
|||||||
if (ISSET(sudo_mode, MODE_BACKGROUND))
|
if (ISSET(sudo_mode, MODE_BACKGROUND))
|
||||||
SET(command_details.flags, CD_BACKGROUND);
|
SET(command_details.flags, CD_BACKGROUND);
|
||||||
/* Restore coredumpsize resource limit before running. */
|
/* Restore coredumpsize resource limit before running. */
|
||||||
#if defined(RLIMIT_CORE) && !defined(SUDO_DEVEL)
|
#ifdef RLIMIT_CORE
|
||||||
(void) setrlimit(RLIMIT_CORE, &corelimit);
|
if (sudo_conf_disable_coredump())
|
||||||
#endif /* RLIMIT_CORE && !SUDO_DEVEL */
|
(void) setrlimit(RLIMIT_CORE, &corelimit);
|
||||||
|
#endif /* RLIMIT_CORE */
|
||||||
if (ISSET(command_details.flags, CD_SUDOEDIT)) {
|
if (ISSET(command_details.flags, CD_SUDOEDIT)) {
|
||||||
exitcode = sudo_edit(&command_details);
|
exitcode = sudo_edit(&command_details);
|
||||||
} else {
|
} else {
|
||||||
@@ -722,7 +725,7 @@ command_info_to_details(char * const info[], struct command_details *details)
|
|||||||
static void
|
static void
|
||||||
disable_coredumps(void)
|
disable_coredumps(void)
|
||||||
{
|
{
|
||||||
#if defined(__linux__) || (defined(RLIMIT_CORE) && !defined(SUDO_DEVEL))
|
#if defined(__linux__) || defined(RLIMIT_CORE)
|
||||||
struct rlimit rl;
|
struct rlimit rl;
|
||||||
#endif
|
#endif
|
||||||
debug_decl(disable_coredumps, SUDO_DEBUG_UTIL)
|
debug_decl(disable_coredumps, SUDO_DEBUG_UTIL)
|
||||||
@@ -741,15 +744,17 @@ disable_coredumps(void)
|
|||||||
(void)setrlimit(RLIMIT_NPROC, &rl);
|
(void)setrlimit(RLIMIT_NPROC, &rl);
|
||||||
}
|
}
|
||||||
#endif /* __linux__ */
|
#endif /* __linux__ */
|
||||||
#if defined(RLIMIT_CORE) && !defined(SUDO_DEVEL)
|
#ifdef RLIMIT_CORE
|
||||||
/*
|
/*
|
||||||
* Turn off core dumps.
|
* Turn off core dumps?
|
||||||
*/
|
*/
|
||||||
(void) getrlimit(RLIMIT_CORE, &corelimit);
|
if (sudo_conf_disable_coredump()) {
|
||||||
memcpy(&rl, &corelimit, sizeof(struct rlimit));
|
(void) getrlimit(RLIMIT_CORE, &corelimit);
|
||||||
rl.rlim_cur = 0;
|
memcpy(&rl, &corelimit, sizeof(struct rlimit));
|
||||||
(void) setrlimit(RLIMIT_CORE, &rl);
|
rl.rlim_cur = 0;
|
||||||
#endif /* RLIMIT_CORE && !SUDO_DEVEL */
|
(void) setrlimit(RLIMIT_CORE, &rl);
|
||||||
|
}
|
||||||
|
#endif /* RLIMIT_CORE */
|
||||||
debug_return;
|
debug_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user