On Thu, 23 Oct 2014, Martijn van Duren wrote:
> Hello misc@,
>
> I'm currently trying to write a library that heavily relies on
> libcrypto. Because I don't want applications linking to it, to have to
> call OpenSSL_add_all_algorithms, for convenience, I added those calls to
> the appropriate places in my library. Because of this nature, the
> function is called multiple times, and even if I shielded it within my
> library it could still be called outside of it by an application using
> my library.
> On AMD64 (OpenBSD 5.5-stable) this hasn't given me any problems yet, but
> as soon as I run my code on i386 (5.6-current) it crashes with the
> following trace:
> #0  obj_name_LHASH_COMP (arg1=0x0, arg2=0x857b7630) at
> /usr/src/lib/libcrypto/crypto/../../libssl/src/crypto/objects/o_names.c:97
> #1  0x0e91190c in getrn (lh=0x867d0380, data=0x857b7630, rhash=Variable
> "rhash" is not available.
> ) at
> /usr/src/lib/libcrypto/crypto/../../libssl/src/crypto/lhash/lhash.c:419 #2 
> 0x0e911c92 in lh_insert (lh=0x867d0380, data=0x857b7630) at
> /usr/src/lib/libcrypto/crypto/../../libssl/src/crypto/lhash/lhash.c:192
> #3  0x0e8a0852 in OBJ_NAME_add (name=0x2e800aac "aes-256-cfb", type=2,
> data=0x2e815360 "­\001")
>      at
> /usr/src/lib/libcrypto/crypto/../../libssl/src/crypto/objects/o_names.c:181
> #4  0x0e8a0149 in EVP_add_cipher (c=0x2e815360) at
> /usr/src/lib/libcrypto/crypto/../../libssl/src/crypto/evp/names.c:80
> #5  0x0e8384f3 in OpenSSL_add_all_ciphers () at
> /usr/src/lib/libcrypto/crypto/../../libssl/src/crypto/evp/c_allc.c:183
> #6  0x0e8357bc in OPENSSL_add_all_algorithms_noconf () at
> /usr/src/lib/libcrypto/crypto/../../libssl/src/crypto/evp/c_all.c:76
>
> I'm aware that the OpenSSL_add_all_algorithms(3) says:
> A typical application will call OpenSSL_add_all_algorithms() initially
> and EVP_cleanup() before exiting.
> but it doesn't explicitly says that it can only be called ones without
> causing problems.
>
> Could anyone tell me if this kind of use of this function is the
> undefined behaviour area that I should avoid or if this is a bug? If it
> is grey area that should be avoided, what is the recommended way to
> initialise ciphers and digests from within the library without risking
> crashes from initialization from within an application? I do use
> EVP_get_{cipher,digest}bynid(3), so all ciphers and digests need to be
> available.

Something strange seems to be happening here.

As far as I can tell, OpenSSL_add_all_algorithms() should be safe to call 
multiple times and I'm not able to reproduce the crash on 
OpenBSD/i386-current (for performance reasons you probably want to avoid 
doing this whenver you can, but as far as I can tell nothing should prevent 
it from working). However, keep in mind that most of these functions are not 
thread safe.

obj_name_LHASH_COMP(arg1=0x0, arg2=0x857b7630) means that we've already ended 
up with an entry in the LHASH that has a NULL data value (not that we're 
trying to insert one). The only insert in the name_lh has an explicit NULL 
check and there should be no other way (short of manually inserting a NULL 
value or changing an existing data pointer to NULL) to trigger this.

If you can provide a minimal reproducable test case I can attempt to dig 
further.
-- 

    "Action without study is fatal. Study without action is futile."
        -- Mary Ritter Beard

Reply via email to