Bug 23739 - horde: Anmeldung mit uid ermöglichen
horde: Anmeldung mit uid ermöglichen
Status: CLOSED FIXED
Product: UCS
Classification: Unclassified
Component: Mail - Horde
UCS 3.0
Other Linux
: P5 normal (vote)
: UCS 3.0 - RC
Assigned To: Felix Botner
Stefan Gohmann
:
Depends on:
Blocks:
  Show dependency treegraph
 
Reported: 2011-09-21 15:23 CEST by Felix Botner
Modified: 2011-12-13 15:51 CET (History)
2 users (show)

See Also:
What kind of report is it?: ---
What type of bug is this?: ---
Who will be affected by this bug?: ---
How will those affected feel about the bug?: ---
User Pain:
Enterprise Customer affected?:
School Customer affected?:
ISV affected?:
Waiting Support:
Flags outvoted (downgraded) after PO Review:
Ticket number:
Bug group (optional):
Max CVSS v3 score:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Felix Botner univentionstaff 2011-09-21 15:23:37 CEST

    
Comment 1 Felix Botner univentionstaff 2011-10-06 19:40:50 CEST
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.
Comment 2 Sönke Schwardt-Krummrich univentionstaff 2011-11-07 19:12:25 CET
(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
Comment 3 Felix Botner univentionstaff 2011-11-08 09:14:28 CET
...
> 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.
Comment 4 Stefan Gohmann univentionstaff 2011-11-24 08:32:57 CET
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.
Comment 5 Felix Botner univentionstaff 2011-11-24 09:39:29 CET
(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))
Comment 6 Stefan Gohmann univentionstaff 2011-11-24 21:46:45 CET
OK, Anmeldung funktioniert.
Comment 7 Sönke Schwardt-Krummrich univentionstaff 2011-12-13 15:51:15 CET
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"