setgid/setuid: Daemon existiert mit zwei PIDs?

Antworten
Nachricht
Autor
TomoT

setgid/setuid: Daemon existiert mit zwei PIDs?

#1 Beitrag von TomoT » 04. Aug 2010 12:51

Hi,

mal eine Verständnisfrage:

Ich habe einen Daemon, der wird mit root-Rechten gestartet, öffnet sein Logfile und legt einen Serversocket an. Anschließend werden seine Rechte durch Aufruf von setgid()/setuid() auf die von "nobody" beschränkt.

Das führt lustigerweise dazu, dass dieser Prozess mit zwei PIDs in der ps-Aufstellung auftaucht, jeweils mit unterschiedlichen Userkennungen. Ist das normal so? Bzw. ist das in Ordnung, dass speziell der Prozess mit den root-Rechten weiterhin auftaucht?

Benutzeravatar
Janka
Beiträge: 3581
Registriert: 11. Feb 2006 19:10

#2 Beitrag von Janka » 05. Aug 2010 9:56

Das kommt drauf an, wie der Daemon implementiert ist. Ein naiver Daemon würde einfach den Benutzer setzen und fertig. Er hätte dann aber niemals mehr die Chance wieder an root-Rechte zu gelangen, ohne dass ihn root neu startet. Das kann zum Problem werden, wenn der nichtpriviligierte Prozess abstürzt. Im allgemeinen möchte man, dass ein Daemon neu startet, wenn er durch irgendein unbedachtes Ereignis beendet wurde.

Also wird jener Daemon so implementiert sein, dass er fork()ed, dann nur das Kind setuid() ausführt und der Elternprozess dann mittels wait() auf einen eventuellen Absturz des Kindes wartet, um es in jenem Fall sofort wieder neu starten zu können. So macht das auch die Servicefunktion daemon().

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

TomoT

#3 Beitrag von TomoT » 10. Aug 2010 7:21

Ja, der Daemon macht das so, er ruft setuid()/setgid() auf und macht dann ohne jegliches daemon() oder fork() weiter - er braucht ab diesem Punkt keine root-Rechte mehr und soll deswegen auch nicht "versehentlich" an welche gelangen. Dennoch bleibt diese eine PID mit der root-User-ID zurück.

Benutzeravatar
Janka
Beiträge: 3581
Registriert: 11. Feb 2006 19:10

#4 Beitrag von Janka » 11. Aug 2010 22:50

daemon() oder fork() müssten wenn überhaupt *vor* setuid() stehen, nicht danach.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Antworten