[Date Prev][Date Next] [Chronological] [Thread] [Top]

(ITS#4956) slapd cores with a SEGFAULT after a failed proxy authorization



Full_Name: Paul Turgyan
Version: 2.3.35
OS: linux - 2.6 kernal
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (141.213.231.201)



slapd cores with a SEGFAULT after a failed proxy authorization,
with a core file like:

(gdb) bt
#0  0xb7c74be5 in *__GI___libc_free (mem=0xab5fc714) at malloc.c:3402
#1  0x0807aa96 in ch_free (ptr=0xab5fc714) at ch_malloc.c:139
#2  0x080a5886 in slap_sasl_authorize (sconn=0xacb03000, context=0xada20428, 
    requested_user=0xacb03910 "pturgyan@UMICH.EDU", rlen=18, 
    auth_identity=0xacb03a11 "pturgyan@UMICH.EDU", alen=18, 
    def_realm=0xacb049e0 "UMICH.EDU", urlen=9, props=0x0) at sasl.c:673
#3  0xb7ea2ba3 in do_authorization (s_conn=0xacb03000) at server.c:1163
#4  0xb7ea2d18 in sasl_server_step (conn=0xacb03000, 
    clientin=0xacb01dae "`?\006\t*\206H\206?\022\001\002\002\002\001\004", 
    clientinlen=0, serverout=0xad61d114, serveroutlen=0x1) at server.c:1420
#5  0x080a6654 in slap_sasl_bind (op=0x830fad0, rs=0xad61d240) at sasl.c:1395
#6  0x0807cdaa in fe_op_bind (op=0x830fad0, rs=0xad61d240) at bind.c:276
#7  0x0807c5b3 in do_bind (op=0x830fad0, rs=0xad61d240) at bind.c:200
#8  0x0806176f in connection_operation (ctx=0x0, arg_v=0x830fad0)
    at connection.c:1133
#9  0x08133e28 in ldap_int_thread_pool_wrapper (xpool=0x81ff4e0) at tpool.c:478
#10 0xb7e83c6b in start_thread (arg=0xad61dbb0) at pthread_create.c:261
#11 0xb7cc9d9e in clone () from /lib/libc.so.6

We are using cyrus-sasl-2.1.21
             heimdahl-0.6.2
             
During a proxy auth,  c_sasl_dn is set at sasl.c:682.
If the proxy auth fails for some reason,  then c_sasl_dn
is never cleared.  Sometime later, when that connection block is reused for
another sasl bind,  slap_sasl_authorize attempts to free the memory pointed to
by c_sasl_dn.bv_val  at sasl.c:673 and free SEGFAULTs.

This can be duplicated by looping a ldapsearch that does a sasl bind with an
invalid proxy authorization.
You have to loop long enough to force a reuse of a connection struct.


The following patch NULL's out c_sasl_dn at sasl.c:702 when the proxy auth is
disallowed. 


*** sasl.c-     Thu Jan 25 07:42:38 2007
--- sasl.c      Fri May 11 13:47:19 2007
***************
*** 699,704 ****
--- 699,705 ----
                        "proxy authorization disallowed (%d)\n",
                        (long) (conn ? conn->c_connid : -1), rc, 0 );
  
+               BER_BVZERO( &conn->c_sasl_dn );
                sasl_seterror( sconn, 0, "not authorized" );
                ch_free( authzDN.bv_val );
                return SASL_NOAUTHZ;