diff options
author | Jakob Kaivo <jkk@ung.org> | 2021-02-18 11:18:49 -0500 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2021-02-18 11:18:49 -0500 |
commit | 48ce6ddfde98185060510a021cde369933246191 (patch) | |
tree | 265b25c9b96322cc6e01f8dcbbe5a38797b389bf | |
parent | 72f77b8941d9a7cd3f625938c704c1e6c1dd75f3 (diff) |
add logging of user and command when executed
-rw-r--r-- | exec/exec.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/exec/exec.c b/exec/exec.c index 4a8b22f..f00f768 100644 --- a/exec/exec.c +++ b/exec/exec.c @@ -1,12 +1,34 @@ -#define _POSIX_C_SOURCE 200809L +#define _XOPEN_SOURCE 700 #include <errno.h> +#include <inttypes.h> +#include <limits.h> #include <stdio.h> #include <string.h> +#include <syslog.h> #include <unistd.h> +#define PRIVEXEC_LOG_ID "privexec" #define NOT_RUN (126) #define NOT_FOUND (127) +#ifndef ARG_MAX +#define ARG_MAX _POSIX_ARG_MAX +#endif + +void log_execution(int argc, char *argv[]) +{ + char cmd[ARG_MAX] = ""; + strncat(cmd, argv[1], sizeof(cmd) - 1); + for (int i = 2; i < argc; i++) { + strncat(cmd, " ", sizeof(cmd) - 1); + strncat(cmd, argv[i], sizeof(cmd) - 1); + } + + openlog(PRIVEXEC_LOG_ID, LOG_PID, LOG_AUTH); + syslog(LOG_INFO, "UID %jd running \"%s\"", (intmax_t)getuid(), cmd); + closelog(); +} + int main(int argc, char *argv[]) { if (argc < 2 || argv == NULL) { @@ -14,6 +36,8 @@ int main(int argc, char *argv[]) return NOT_RUN; } + log_execution(argc, argv); + setuid(geteuid()); execvp(argv[1], argv + 1); fprintf(stderr, "%s: %s: %s\n", argv[0], argv[1], strerror(errno)); |