diff options
| author | Thomas Guyot-Sionnest <dermoth@aei.ca> | 2014-01-25 04:22:09 -0500 |
|---|---|---|
| committer | Thomas Guyot-Sionnest <dermoth@aei.ca> | 2014-01-25 04:22:09 -0500 |
| commit | 68fe713335183dd37ced78821711c2a3f1ea2cc7 (patch) | |
| tree | b558cc2a200249002d2716a9e3803c272fb01aaf | |
| parent | 25a289f307270bb8f814a2df923aeab50acd50c6 (diff) | |
| download | monitoring-plugins-68fe713335183dd37ced78821711c2a3f1ea2cc7.tar.gz | |
Ignore MP_STATE_DIRECTORY in suid plugins
If a plugin still has suid privileges at the time np_enable_state() is
called, the MP_STATE_DIRECTORY environment will be ignored.
There is no need for a NEWS entry as no suid plugins use np_enable_state
yet.
| -rw-r--r-- | lib/tests/test_utils.c | 4 | ||||
| -rw-r--r-- | lib/utils_base.c | 22 | ||||
| -rw-r--r-- | lib/utils_base.h | 4 |
3 files changed, 21 insertions, 9 deletions
diff --git a/lib/tests/test_utils.c b/lib/tests/test_utils.c index 12252f48..8c3ee229 100644 --- a/lib/tests/test_utils.c +++ b/lib/tests/test_utils.c | |||
| @@ -38,7 +38,7 @@ main (int argc, char **argv) | |||
| 38 | state_data *temp_state_data; | 38 | state_data *temp_state_data; |
| 39 | time_t current_time; | 39 | time_t current_time; |
| 40 | 40 | ||
| 41 | plan_tests(150); | 41 | plan_tests(151); |
| 42 | 42 | ||
| 43 | ok( this_monitoring_plugin==NULL, "monitoring_plugin not initialised"); | 43 | ok( this_monitoring_plugin==NULL, "monitoring_plugin not initialised"); |
| 44 | 44 | ||
| @@ -440,6 +440,8 @@ main (int argc, char **argv) | |||
| 440 | 440 | ||
| 441 | ok( this_monitoring_plugin==NULL, "Free'd this_monitoring_plugin" ); | 441 | ok( this_monitoring_plugin==NULL, "Free'd this_monitoring_plugin" ); |
| 442 | 442 | ||
| 443 | ok( mp_suid() == FALSE, "test aren't suid" ); | ||
| 444 | |||
| 443 | return exit_status(); | 445 | return exit_status(); |
| 444 | } | 446 | } |
| 445 | 447 | ||
diff --git a/lib/utils_base.c b/lib/utils_base.c index 304b732b..5c838d1d 100644 --- a/lib/utils_base.c +++ b/lib/utils_base.c | |||
| @@ -30,6 +30,8 @@ | |||
| 30 | #include <ctype.h> | 30 | #include <ctype.h> |
| 31 | #include <fcntl.h> | 31 | #include <fcntl.h> |
| 32 | #include <sys/stat.h> | 32 | #include <sys/stat.h> |
| 33 | #include <unistd.h> | ||
| 34 | #include <sys/types.h> | ||
| 33 | 35 | ||
| 34 | #define np_free(ptr) { if(ptr) { free(ptr); ptr = NULL; } } | 36 | #define np_free(ptr) { if(ptr) { free(ptr); ptr = NULL; } } |
| 35 | 37 | ||
| @@ -415,14 +417,18 @@ void _cleanup_state_data() { | |||
| 415 | char* _np_state_calculate_location_prefix(){ | 417 | char* _np_state_calculate_location_prefix(){ |
| 416 | char *env_dir; | 418 | char *env_dir; |
| 417 | 419 | ||
| 418 | /* FIXME: Undocumented */ | 420 | /* Do not allow passing MP_STATE_DIRECTORY in setuid plugins |
| 419 | env_dir = getenv("MP_STATE_DIRECTORY"); | 421 | * for security reasons */ |
| 420 | if(env_dir && env_dir[0] != '\0') | 422 | if (mp_suid() == FALSE) { |
| 421 | return env_dir; | 423 | /* FIXME: Undocumented */ |
| 422 | /* This is the former ENV, for backward-compatibility */ | 424 | env_dir = getenv("MP_STATE_DIRECTORY"); |
| 423 | env_dir = getenv("NAGIOS_PLUGIN_STATE_DIRECTORY"); | 425 | if(env_dir && env_dir[0] != '\0') |
| 424 | if(env_dir && env_dir[0] != '\0') | 426 | return env_dir; |
| 425 | return env_dir; | 427 | /* This is the former ENV, for backward-compatibility */ |
| 428 | env_dir = getenv("NAGIOS_PLUGIN_STATE_DIRECTORY"); | ||
| 429 | if(env_dir && env_dir[0] != '\0') | ||
| 430 | return env_dir; | ||
| 431 | } | ||
| 426 | 432 | ||
| 427 | return NP_STATE_DIR_PREFIX; | 433 | return NP_STATE_DIR_PREFIX; |
| 428 | } | 434 | } |
diff --git a/lib/utils_base.h b/lib/utils_base.h index 86adecf8..b4bd92ee 100644 --- a/lib/utils_base.h +++ b/lib/utils_base.h | |||
| @@ -102,4 +102,8 @@ void np_init(char *, int argc, char **argv); | |||
| 102 | void np_set_args(int argc, char **argv); | 102 | void np_set_args(int argc, char **argv); |
| 103 | void np_cleanup(); | 103 | void np_cleanup(); |
| 104 | 104 | ||
| 105 | /* mp_suid() returns true if the real and effective uids differs, such as when | ||
| 106 | * running a suid plugin */ | ||
| 107 | #define mp_suid() (getuid() != geteuid()) | ||
| 108 | |||
| 105 | #endif /* _UTILS_BASE_ */ | 109 | #endif /* _UTILS_BASE_ */ |
