suid-Bit



  • -rwsr-sr-t  1 root root 27590 2005-02-07 18:34 switch.cgi
    

    Ich muss für einen Lehrer ein kleines Programm fürs Schuldnetzwerk schreiben. Da dieses Programm 'smbpasswd' als root ausführen soll, um ein Samba Passwort zu setzen habe ich ihm wie oben zu sehen dieses suid-bit gegeben...
    Wenn ich jedoch nun über system(...) ein smbpasswd ausführen möchte, funktioniert dies nicht. Führe ich 'whoami' aus, zeigt er mir an, ich sei 'Foo'. Warum? Das Programm selbst hat seine root-Rechte, ich kann die /etc/shadow ohne probleme auslesen, aber sobald ich über system() ein weiters Programme starte, hat dieses keine root-Rechte mehr. Wie krieg ich das hin?



  • Mit sudo.



  • Mit sudo hab ich das gleiche problem, dass sudo selber nicht als root ausgeführt wird und er dann das passwort verlangt... oder meinst du, per sudo das programm starten? das erweißt sich nämlich als realtiv schwirig, da das programm als .cgi übers intranet gestartet werden soll



  • Foo schrieb:

    Wenn ich jedoch nun über system(...) ein smbpasswd ausführen möchte, funktioniert dies nicht.

    Genau das ist das Problem. system() startet eine Shell "/bin/sh", unter Linux entspricht das der bash2. Die bash2 gibt aber das SUID-Bit nicht weiter (sieh' mal in den man-Pages bei system() nach, irgendwo ist das dort beschrieben).

    Verwende statt system() die Kombination fork() und exec**(), dann müsste es gehen.

    Martin

    (NEU: "C und Linux in der 3. Auflage -- jetzt auch mit Netzwerkprogrammierung!)



  • Ok, das werd ich nahermal probieren, ich meld mich, falls ich zu doof sein sollte 🙂



  • Teste das mal mit: execl()
    Diese ersetzt den aktuellen code mit dem, was execl übergeben wurde. Daher müsste das gehen. Ich vermute mal, dass das programm weiterhin mit der aktuelen pid fortgesetzt wird.

    Siehe dazu man 3 execl

    Je nach prog musst du vielleicht forken.

    Gruss



  • habs jetzt mit execl() und fork() probiert...
    Jetzt meldet mir smbpasswd "smbpasswd must *NOT* be setuid root."
    juhu!

    denk ich: nimmste halt sudo smbpasswd...
    aber dort will er wieder das root-pw haben...

    gibt es denn keine möglichkeit?



  • Du musst /etc/sudoers richtig konfigurieren, dann brauchst du auch kein Root-PWD.



  • ah verstehe ^^ dann werd ich das mal probieren... 🙂



  • Hat zwar nicht viel dammit zu tun, nur mal nebenbeibemerkt: Ich weis zwar nicht genau was du da programmierst, aber vielleicht hilft dir auch ein Lösung mithilfe von pipes. Diese dienen zur komunikation zwischen prozessen. Dazu muss natürlich der andere prozess auch laufen.



  • nein nein, danke, aber das hilft mir nicht unbedingt weiter, da es kein anderes eigenes programm gibt, mit dem ich kommunzieren könnte... jednefalls hab ich net vor sowas zu schreiben...


Anmelden zum Antworten