On Don, 28 Nov 2002 at 19:39 (+0100), Bernd Brodesser wrote:
* Erich Lindner schrieb am 28.Nov.2002:
Wie legst Du denn die Datei an? Wenn Du z.B system verwendest, funktioniert es, aus den gleichen Gründen wie bei der shell direkt,
^^^^^^^^^^^^^^
nicht. Siehe man system und da unter BUGS.
heisst das, dass der Programmaufruf als user "wwwrun" von der Kommandozeile das gleiche Problem verursacht, und wg. mangels Rechte die Ausfuehrung abgebrochen wird.
Du mußt Dein C-Programm umstricken. So wie Du es gemacht hast, also mit der Funktion system() funktioniert es nicht. Die Funktion system() nimmt das SUID-Bit weg. Genauso, wie es die bash tut, und mit genau der gleichen Begründung
Nein, das stimmt nicht. Die Ursache liegt im fehlenden setuid(0) Aufruf innerhalb des Programms. Siehe unten. [...]
/sbin/boxprog muß anders programmiert werden, ohne system() stattdessen mit fopen(), fclose() und fprintf() und gegebenenfalls auch mit execve() und fork()
Auch hier wieder: Nein. Der Weg über fork() und execve() ist sicher der sauberere, aber es funktioniert auch so - man muss eben nur die effektive UserID auch tatsächlich wechseln: jan@k500:~/tmp> cat sid.c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <errno.h> int main (int argc, char **argv) { if (system ("echo $$ >/var/run/sid") != 0) printf ("vor setuid: Fehler bei schreiben der PID\n"); else printf ("vor setuid(): OK!\n"); if (setuid (0) == -1) { printf ("Fehler bei setuid() (%d): %s\n", errno, strerror (errno)); return (0); } if (system ("echo $$ >/var/run/sid") != 0) printf ("nach setuid: Fehler bei schreiben der PID\n"); else printf ("nach setuid(): OK!\n"); return (0); } jan@k500:~/tmp> make sid cc sid.c -o sid jan@k500:~/tmp> ll sid -rwxr-xr-x 1 jan users 14270 Nov 28 22:45 sid jan@k500:~/tmp> ./sid sh: /var/run/sid: Keine Berechtigung vor setuid: Fehler bei schreiben der PID Fehler bei setuid() (1): Operation not permitted jan@k500:~/tmp> su Password: k500:/home/jan/tmp # ./sid vor setuid(): OK! nach setuid(): OK! k500:/home/jan/tmp # chown root:root sid k500:/home/jan/tmp # chmod 04755 sid k500:/home/jan/tmp # exit jan@k500:~/tmp> ./sid sh: /var/run/sid: Keine Berechtigung vor setuid: Fehler bei schreiben der PID nach setuid(): OK! jan@k500:~/tmp> cat /var/run/sid 1756 Jan