Univention Bugzilla – Bug 23739
horde: Anmeldung mit uid ermöglichen
Last modified: 2011-12-13 15:51:15 CET
Folgende Änderungen waren nötig: univention-lib In python-univention-lib wurde das Skript "/usr/share/pyshared/univention/lib/getMailFromMailOrUid.py" aufgenommen. Dies bekommt eine UID oder primäre Mail Adresse übergeben und sucht dann im LDAP die passende primäre Mail Addresse (univention.uldap.getMachineConnection). univention-horde4 Hier gibt es nun den setuid Wrapper (root:www-data 4750) univention-horde-login-wrapper.c, der /usr/share/pyshared/univention/lib/getMailFromMailOrUid.py mit dem ersten Parameter (execvp) aufruft. Damit ermittelt horde die mail Adresse zu einer uid. /etc/horde4/imp/hooks.php wurd aus php-horde-webmail in ein UCR Template überführt. Dort wurde die Funktion "preauthenticate" ergänzt, in der der Wrapper "/usr/share/univention-horde4/univention-horde-login-wrapper" mit der im Webinterface angegebenen UserID aufgerufen wird. Das Ergebnis (die primäre Mailadresse) wird dann für den Login verwendet. Changelog Eintrag nicht notwendig.
(In reply to comment #1) > Folgende Änderungen waren nötig: > > univention-lib > > In python-univention-lib wurde das Skript > "/usr/share/pyshared/univention/lib/getMailFromMailOrUid.py" aufgenommen. Dies > bekommt eine UID oder primäre Mail Adresse übergeben und sucht dann im LDAP > die passende primäre Mail Addresse (univention.uldap.getMachineConnection). root@mas65:~# /usr/share/univention-horde4/univention-horde-login-wrapper 'max(' Traceback (most recent call last): File "/usr/share/pyshared/univention/lib/getMailFromMailOrUid.py", line 44, in <module> result = ldap.search(filter=filter, attr=["mailPrimaryAddress"]) File "/usr/lib/pymodules/python2.6/univention/uldap.py", line 307, in search timeout=timeout, sizelimit=sizelimit) File "/usr/lib/python2.6/dist-packages/ldap/ldapobject.py", line 495, in search_ext_s msgid = self.search_ext(base,scope,filterstr,attrlist,attrsonly,serverctrls,clientctrls,timeout,sizelimit) File "/usr/lib/python2.6/dist-packages/ldap/ldapobject.py", line 491, in search_ext timeout,sizelimit, File "/usr/lib/python2.6/dist-packages/ldap/ldapobject.py", line 96, in _ldap_call result = func(*args,**kwargs) ldap.FILTER_ERROR: {'desc': 'Bad search filter'} → der Suchfilter kann beliebig erweitert oder ungültig werden; hier sollten wir vorher eine Escaping-Funktion in Python anwenden → der Traceback sollte abgefangen und mit "None" beantwortet werden > univention-horde4 > > Hier gibt es nun den setuid Wrapper (root:www-data 4750) > univention-horde-login-wrapper.c, der > /usr/share/pyshared/univention/lib/getMailFromMailOrUid.py mit dem ersten > Parameter (execvp) aufruft. Damit ermittelt horde die mail Adresse zu einer > uid. → der Wrapper ist ok, es wird nur der erste Parameter übernommen und die Environment leer gesetzt; der Pfad ist hartkodiert > /etc/horde4/imp/hooks.php wurd aus php-horde-webmail in ein UCR Template > überführt. Dort wurde die Funktion "preauthenticate" ergänzt, in der der > Wrapper "/usr/share/univention-horde4/univention-horde-login-wrapper" mit der > im Webinterface angegebenen UserID aufgerufen wird. Das Ergebnis (die primäre > Mailadresse) wird dann für den Login verwendet. Folgendes im preauthenticate() können wir so nicht lassen: $handle = popen("/usr/share/univention-horde4/univention-horde-login-wrapper $userId","r"); Man braucht dann im Usernamenfeld nur eine eMail-Adresse gefolgt von seinen Befehlen eingeben. Z.B. der Login als: max@example.com ; touch /tmp/foobar legt in /tmp/ die Datei foobar an. Damit hat ein Angreifer in Nullzeit eine Shell auf dem System als User www-data. → REOPEN
... > ldap.FILTER_ERROR: {'desc': 'Bad search filter'} > > → der Suchfilter kann beliebig erweitert oder ungültig werden; hier sollten wir > vorher eine Escaping-Funktion in Python anwenden > → der Traceback sollte abgefangen und mit "None" beantwortet werden > Es wird nun vorher der Suchstring mit ldap.filter.escape_filter_chars() entsprechende maskiert. Tracebacks in der Suche selbst werden nun abgefangen und None zurückgegeben. > $handle = popen("/usr/share/univention-horde4/univention-horde-login-wrapper > $userId","r"); > > Man braucht dann im Usernamenfeld nur eine eMail-Adresse gefolgt von seinen > Befehlen eingeben. Z.B. der Login als: > > max@example.com ; touch /tmp/foobar > > legt in /tmp/ die Datei foobar an. Damit hat ein Angreifer in Nullzeit eine > Shell auf dem System als User www-data. Die $userID wird nun vor dem Aufruf mit escapeshellcmd behandelt. $userId = escapeshellcmd($userId); $handle = popen("/usr/share/univention-horde4/univention-horde-login-wrapper $userId","r"); Pakete bauen.
Grundsätzlich funktioniert es. Problematisch könnte der Filter sein: "(|(uid=%s)(mailPrimaryAddress=%s))" Nicht jeder uid=<benutzername> ist auch direkt der Benutzer. Hier sollte noch auf die Objektklasse univentionMail oder ähnliches geprüft werden.
(In reply to comment #4) > Grundsätzlich funktioniert es. > > Problematisch könnte der Filter sein: > > "(|(uid=%s)(mailPrimaryAddress=%s))" > > Nicht jeder uid=<benutzername> ist auch direkt der Benutzer. Hier sollte noch > auf die Objektklasse univentionMail oder ähnliches geprüft werden. Der Filter sieht jetzt so aus: (&(|(uid=%s)(mailPrimaryAddress=%s))(objectClass=univentionMail))
OK, Anmeldung funktioniert.
UCS 3.0-0 wurde veröffentlicht. Sollte der hier beschriebene Bug mit einer neueren Version von UCS erneut auftreten, so sollte dieser Bug dupliziert werden: "Clone This Bug"