Page 1 of 1

apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)

Posted: 2009-11-04 17:08
by fabfour
Hi,

ich komme hier grad nicht weiter und wollt fragen ob einer ne Idee hat.
Folgendes Problem: Mein Apache soll in ner chroot umgebung laufen. Startet auch soweit und statische Seiten sind kein Problem.
Wenn ich versuche über Suexec meinen fcgi-wrapper zu starten quittiert der den Dienst mit crit: invalid uid: (33) - er behauptet also er kann den User www-data nicht finden.
Das liegt daran, dass die funktion getpwuid() NULL liefert. Ich weiss aber nicht wie ich das weiter handlen soll. Eine /etc/passwd in der Chroot umgebung mit dem User gibt es aber das scheint ihn nicht zu interessieren.
Manuelles su www-data in der chrootumgebung wenn ich per busybox reingehe geht auch.
Hat einer nen Tipp wo ich da ansetzen kann?
Ich hab keine Lust die ganze suexec.c umzupatchen...

Viele Grüße

Re: apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)

Posted: 2009-11-04 19:57
by daemotron
Moin,

ich hab Dir mal ein kleines Diagnose-Programm für getpwuid() zusammengehackt. Einfach kompilieren und in der Chroot-Umgebung ausführen (braucht nur die libc); als Argument die numerische UID angeben. Das Programm hat drei mögliche Ausgänge:
  • User-Eintrag wird gefunden (und der zugehörige Name ausgegeben)
  • Es wird kein Eintrag gefunden, es tritt aber ansonsten kein Fehler auf
  • Es tritt bei getpwuid() ein Fehler auf, dann bekommst Du die Diagnosemeldung ausgegeben (z. B. "Permission denied" wenn /etc/passwd nicht zugreifbar ist)
Meine Hoffnung ist jetzt, dass es zu einem Fehler kommt und Dir die Diagnosemeldung weiterhilft.

Code: Select all

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <pwd.h>

int main(int argc, char **argv)
{
	struct passwd *pw = NULL;

	if (argc != 2)
	{
		fprintf(stderr, "Usage: pwtest UIDnn  UID: numeric user IDn");
		return(EXIT_FAILURE);
	}

	errno = 0;
	pw = getpwuid((uid_t)atoi(argv[1]));

	if (pw)
	{
		printf("User zu UID %d gefunden: %sn", (int)pw->pw_uid, pw->pw_name);
		return(EXIT_SUCCESS);
	}
	else
	{
		if (errno)
			printf("Fehler: %sn", strerror(errno));
		else
			printf("Kein User-Eintrag gefunden.n");

		return(EXIT_FAILURE);
	}
}

Re: apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)

Posted: 2009-11-05 00:05
by fabfour
hi jfreund,

vielen Dank für deine Antwort und dein kleines Tool.
Ich musste es etwas modifizieren, da ich es um die Testumgebung nachzubauen anstatt suexec laufen lassen musste und stderr in keinem der logs auftaucht (zumindest hab ichs nicht gefunden)

Das sieht jetzt wie folgt aus:

Code: Select all

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <pwd.h>

static FILE *log = NULL;

int main(int argc, char **argv)
{
   struct passwd *pw = NULL;

        if ((log = fopen("/tmp/suexec.log", "a")) == NULL) {
            fprintf(stderr, "suexec failure: could not open log filen");
            perror("fopen");
            exit(1);
        }

   if (argc != 4)
   {
      fprintf(log, "Usage: pwtest UIDnn  UID: numeric user IDn");
      return(EXIT_FAILURE);
   }

   errno = 0;
   pw = getpwuid((uid_t)atoi(argv[2]));

   if (pw)
   {
      fprintf(log, "User zu UID %d gefunden: %sn", (int)pw->pw_uid, pw->pw_name);
      return(EXIT_SUCCESS);
   }
   else
   {
      if (errno)
         fprintf(log, "Fehler: %sn", strerror(errno));
      else
         fprintf(log, "Kein User-Eintrag gefunden.n");

      return(EXIT_FAILURE);
   }
}
Mit der Ergebnis:
Fehler: No such file or directory

Ich werd mich dann wohl mal auf die Suche nach dem Quelltext von getpwuid machen... und mir anschauen was da passiert und wo genau das problem liegt. Genau das wollte ich eigentlich vermeiden...

http://www.kernel.org/doc/man-pages/onl ... uid.3.html
Laut dem Kollegen manual hier müsste das eigentlich /etc/passwd sein und die gibts definitiv in der chroot Umgebung.

Vielen Dank nochmal!

Re: apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)

Posted: 2009-11-05 00:20
by Roger Wilco
fabfour wrote:Laut dem Kollegen manual hier müsste das eigentlich /etc/passwd sein und die gibts definitiv in der chroot Umgebung.
Ist die passwd wirklich an der richtigen Stelle und haben alle beteiligten Benutzer Zugriff darauf und auf das etc-Verzeichnis?

Re: apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)

Posted: 2009-11-05 00:51
by fabfour
okay bin dem ganzen inzwischen mit strace auf die schliche gekommen... irgendwo in der libc6.so wird ein fopen auf libnss_files.so.2 gemacht und die hat er nicht gefunden. daher der not found error. das hatte überhaupt nix mit der /etc/passwd zu tun.
wenn man am falschen ende sucht...

Vielen Dank für den Denkanstoß!