Perlscript mit Rootrechten

(Lutz Donnerhacke) lutz at iks-jena.de
Die Mar 7 09:40:01 CET 2000


* Nils Juenemann wrote:
>Ich moechte ein Perlscript auf einem Apache mit Rootrechten laufen lassen.
>Dieses Script benutzt Befehle wie useradd, groupadd, setquota usw.

Du möchtest einen Wrapper für Dein Perl Script schreiben, der folgender-
maßen aussieht und der +s ist.

************************************************************************
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>

const char pathtoscript[] = "/usr/local/sbin/";
char * const enviroment[] = {
   "PATH=/bin:/sbin:/usr/bin:/usr/sbin",
   "IFS=' \t\r\n'",
   "SHELL=/bin/sh",
   NULL
};

int main (int argc, char ** argv) {
   char command[80] = "";
   char *pc;

   if (argc < 2) {
      fprintf (stderr, "Usage: %s Scriptname Args\n", argv[0]);
      exit(1);
   }
   
   /* Prevent attacks fooling isalnum(3) */
   if (NULL == setlocale(LC_CTYPE, "C")) {
      perror ("Can't reset locale");
      exit(2);
   }

   for (pc = argv[1]; *pc; pc++) {     /* test auf illegale Zeichen */
      if(!isalnum(*pc)) {
	 fprintf (stderr, "Scriptname contain illegal char = %u\n",
		  (unsigned) *pc);
	 exit(3);
      }
   }
   
   /* Buffer Overflow beachten! */
   if (pc - argv[1] + sizeof(pathtoscript) >= sizeof(command)) {
      fprintf (stderr, "Scriptname too long.\n");
      exit(4);
   }
   
   /* buffer overflow can not happen */
   strcat (strcpy (command, pathtoscript), argv[1]);
   
   /* test, ob ppid() wirklich der Webserver ist, muß hier rein */
   
   execve(command, argv+1, enviroment);/* execve(2), nicht exec(3) */
   perror("Executing command failed"); /* adds error message */
   exit(5);
}
************************************************************************