/* Just a "stupid", secure SUID wrapper around autobuild.sh */ /* Copyright (C) 2014 Luke Shumaker * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #define _GNU_SOURCE /* for environment functions */ #include /* for alloca(3) */ #include /* for errno */ #include /* for error(3) */ #include /* for getpwuid(3) */ #include /* for environment functions */ #include /* for strlen(3), strcpy(3) */ #include /* for geteuid(3), execv(3) */ void mysetenv(const char *name, const char *value) { if (value != NULL) { if (setenv(name, value, 1) != 0) { error(127, errno, "could not set %s", name); } } } int main(int argc, char **argv) { struct passwd *user = getpwuid(geteuid()); setreuid(geteuid(), -1); const char *env_term = getenv("TERM"); const char *env_lang = getenv("LANG"); const char *env_lc_all = getenv("LC_ALL"); const char *env_lc_collate = getenv("LC_COLLATE"); const char *env_lc_ctype = getenv("LC_CTIME"); const char *env_lc_messages = getenv("LC_MESSAGES"); const char *env_lc_monetary = getenv("LC_MONETARY"); const char *env_lc_numeric = getenv("LC_NUMERIC"); const char *env_lc_time = getenv("LC_TIME"); clearenv(); mysetenv("USER" , user->pw_name ); mysetenv("LOGNAME" , user->pw_name ); mysetenv("HOME" , user->pw_dir ); mysetenv("TERM" , env_term ); mysetenv("LANG" , env_lang ); mysetenv("LC_ALL" , env_lc_all ); mysetenv("LC_COLLATE" , env_lc_collate ); mysetenv("LC_CTIME" , env_lc_ctype ); mysetenv("LC_MESSAGES", env_lc_messages); mysetenv("LC_MONETARY", env_lc_monetary); mysetenv("LC_NUMERIC" , env_lc_numeric ); mysetenv("LC_TIME" , env_lc_time ); const char *script_suffix = "/bin/autobuild.sh"; char *script = alloca(strlen(user->pw_dir)+strlen(script_suffix)); strcpy(script, user->pw_dir); strcpy(&(script[strlen(user->pw_dir)]), script_suffix); execv(script, argv); error(127, errno, "%s", script); }