[Pkg-openldap-devel] Bug#803197: libldap built against GNUTLS breaks SOGo

Ludovic Marcotte lmarcotte at inverse.ca
Mon Nov 2 20:46:56 UTC 2015


Hi Ryan,

First of all, thanks for your investigation.

I've reverted for now the patch in SOPE (from PR#4). We might want to 
re-integrate this change once libldap is fixed.

Thanks,

On 29/10/2015 23:53, Ryan Tandy wrote:
> On Tue, Oct 27, 2015 at 02:54:10PM -0700, Ryan Tandy wrote:
>> Can you please generate that trace again with libgnutls28-dbg 
>> installed, so that we can see more details?
>
> #0  close () at ../sysdeps/unix/syscall-template.S:81
> #1  0x00007f2d3a300013 in _rnd_system_entropy_deinit () at 
> rnd-common.c:254
> #2  0x00007f2d3a300126 in wrap_nettle_rnd_deinit (ctx=<optimized out>) 
> at rnd.c:157
> #3  0x00007f2d3a2612b6 in _gnutls_global_deinit (destructor=0) at 
> gnutls_global.c:364
> #4  0x00007f2d3a27225f in gnutls_global_set_mutex (init=0x3, 
> deinit=0x0, lock=0x7f2d3a53ce08 <gnutls_rnd_ctx>,
>    unlock=0x7f2d391bbaa0 <tlsg_mutex_unlock>) at locks.c:60
> #5  0x00007f2d391b9d66 in tls_init (impl=0x7f2d393d2440 
> <ldap_int_tls_impl>) at tls2.c:170
> #6  0x00007f2d391bae53 in ldap_int_tls_start 
> (ld=ld at entry=0x7f2d3fe88b60, conn=conn at entry=0x7f2d3fe91fd0,
>    srv=srv at entry=0x7f2d3fe889b0) at tls2.c:838
> #7  0x00007f2d39194f6d in ldap_int_open_connection (ld=0x7f2d3fe88b60, 
> conn=0x7f2d3fe91fd0, srv=0x7f2d3fe889b0,
>    async=<optimized out>) at open.c:448
> #8  0x00007f2d391a81bd in ldap_new_connection (ld=0x7f2d3fe88b60, 
> srvlist=0x0, srvlist at entry=0x7f2d3fe88ca8,
>    use_ldsb=978570760, use_ldsb at entry=1, connect=0, bind=0x0, m_req=0, 
> m_res=0) at request.c:484
> #9  0x00007f2d3919464a in ldap_open_defconn 
> (ld=ld at entry=0x7f2d3fe88b60) at open.c:41
> #10 0x00007f2d391a95e8 in ldap_send_initial_request 
> (ld=0x7f2d3fe88b60, msgtype=<optimized out>, dn=<optimized out>,
>    ber=0x7f2d3fe90f80, msgid=1) at request.c:130
> #11 0x00007f2d3919def5 in ldap_sasl_bind (ld=0x7f2d3fe88b60, 
> dn=0x7f2d3fe90f28 "uid=ryan,dc=example,dc=com",
>    mechanism=0x0, cred=0x7ffe77d8a7f0, sctrls=0x7f2d3a53bfa0 
> <global_init_mutex>, cctrls=0x7f2d3fe90f80,
>    msgidp=0x7ffe77d8a784) at sasl.c:148
> #12 0x00007f2d3919e46b in ldap_sasl_bind_s (ld=0x7f2d3fe88b60, 
> dn=0x7f2d3fe90f28 "uid=ryan,dc=example,dc=com",
>    mechanism=0x0, cred=0x7ffe77d8a7f0, sctrls=0x0, 
> cctrls=0x7ffe77d8a2f0, servercredp=0x0) at sasl.c:182
> #13 0x00007f2d3919ecd2 in ldap_simple_bind_s (ld=0x7f2d3fe88b60, 
> dn=0x7f2d3fe90f28 "uid=ryan,dc=example,dc=com",
>    passwd=0x7f2d3fe90f68 "test") at sbind.c:113
>
> http://sources.debian.net/src/gnutls28/3.3.8-6%2Bdeb8u3/lib/nettle/rnd-common.c/#L254 
>
>
> http://sources.debian.net/src/gnutls28/3.3.8-6%2Bdeb8u3/lib/locks.c/#L60
>
> So that's very much not great, and worth looking at again from 
> upstream PoV whether we actually need to be doing the 
> gnutls_global_set_mutex stuff. (Especially in light of the comment 
> above it: "Do not call this function from a library [...]") This in 
> some ways a recurrence of the "whose job is it to initialize libraries 
> with global state?" problem that we had with gcrypt, not so long ago.
>
> The really problematic bit, though, is this:
>
> https://github.com/inverse-inc/sope/blob/e870145b7ed381c1bdef5945075ed48948b86d5b/sope-appserver/NGObjWeb/WOWatchDogApplicationMain.m#L1014 
>
>
> The order of operations here is:
>
> 1. libraries are loaded
> 2. gnutls' constructor does the global init, open("/dev/urandom") -> 3
> 3. WOWatchDogApplicationMain runs, closes everything
> 4. libldap goes to set up gnutls
> 5. gnutls prepares to re-init itself, closes the remembered urandom fd
> 6. things go downhill from here.
>
> Actually this exact scenario is mentioned on a gnutls author's blog:
>
> http://nmav.gnutls.org/2014/12/a-quick-overview-of-gnutls-development.html 
>
>
> There were some patches pulled into gnutls in jessie to address an 
> application closing the urandom socket and then calling 
> gnutls_global_init again, but no such handling around 
> gnutls_global_*de*init.
>
> http://sources.debian.net/src/gnutls28/3.3.8-6%2Bdeb8u3/debian/patches/35_recheck_urandom_fd.diff/ 
>
>
> So: this could be addressed in libldap, by not calling 
> gnutls_global_set_mutex any more, or in sope, by not closing fds so 
> aggressively at startup. I admit I didn't look as deeply at the 
> history of that code in libldap as I could have, when I updated it for 
> gnutls28; I'll do that now.
>
> Ludovic, thoughts from your end?


-- 
Ludovic Marcotte
lmarcotte at inverse.ca  ::  +1.514.755.3630  ::  http://inverse.ca
Inverse inc. :: Leaders behind SOGo (http://sogo.nu) and PacketFence (http://packetfence.org)



More information about the Pkg-openldap-devel mailing list