From bde87883f667d86a64b67ce7e793c33890b00f3e Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Fri, 2 Nov 2018 10:21:00 +0100 Subject: [PATCH] Add tool setuid Add a simple tool to execute a command with another uid. --- .gitignore | 1 + Makefile | 10 ++++++---- install.sh | 1 + setuid/setuid.c | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 .gitignore create mode 100644 setuid/setuid.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f683ef --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +setuid/setuid diff --git a/Makefile b/Makefile index baa247b..ef0ff8e 100644 --- a/Makefile +++ b/Makefile @@ -64,10 +64,12 @@ INSTALL=install -v INSTALL_PROGRAM = $(INSTALL) INSTALL_DATA = $(INSTALL) -m 644 -all: - @echo 'Nothing to be done. Ready for "make install"' +all: setuid/setuid -install: +clean: + @rm setuid/setuid 2>/dev/null || true + +install: all @prefix="$(prefix)" usr_prefix="$(usr_prefix)" usrlocal_prefix="$(usrlocal_prefix)" \ root_exec_prefix="$(root_exec_prefix)" root_bindir="$(root_bindir)" root_sbindir="$(root_sbindir)" \ usr_exec_prefix="$(usr_exec_prefix)" use_bindir="$(usr_bindir)" usr_sbindir="$(usr_sbindir)" \ @@ -79,6 +81,6 @@ install: DESTDIR="$(DESTDIR)" \ ./install.sh -.PHONY: all install +.PHONY: all install clean diff --git a/install.sh b/install.sh index 798c1f6..c5a45ed 100755 --- a/install.sh +++ b/install.sh @@ -125,4 +125,5 @@ install_data blink/blinkd.service "$DESTDIR$systemdunitdi install_data blink/51-blink.rules "$DESTDIR$udev_rulesdir/51-blink.rules" install_data clusterd/clusterd.service "$DESTDIR$systemdunitdir/clusterd.service" install_exec clusterd/clusterd "$DESTDIR$usr_sbindir/clusterd" +install_exec setuid/setuid "$DESTDIR$usr_sbindir/setuid" exit diff --git a/setuid/setuid.c b/setuid/setuid.c new file mode 100644 index 0000000..3480c9d --- /dev/null +++ b/setuid/setuid.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +int main(int argc,char **argv) { + uid_t uid; + char *end; + int status; + + if (argc<3) { + fprintf(stderr,"usage: %s uid cmd...\n",argv[0]); + exit(1); + } + uid=strtoul(argv[1],&end,10); + if (end==argv[1] || *end != '\0') { + fprintf(stderr,"%s: %s: invalid uid\n",argv[0],argv[1]); + exit(1); + } + status=setuid(uid); + if (status==-1) { + perror(argv[0]); + exit(1); + } + + status=execvp(argv[2],&argv[2]); + if (status==-1) { + perror(argv[0]); + exit(1); + } + exit(0); +}