Skip to content

Crash caused by double free in SSL and DTLS servers #2559

@cve-reporting

Description

@cve-reporting

WolfSSL example server in all versions starting from 3.12.0 (including current 4.2.0c) incorrectly handles error when server certificate cannot be read from a given path.
This vulnerability affects the server in both supported protocols: TLS and DTLS.

Crashing function:
examples/server/server.c:2165-2197

{
    byte*  rnd;
    byte*  pt;
    size_t size;

    /* get size of buffer then print */
    size = wolfSSL_get_server_random(NULL, NULL, 0);
    if (size == 0) {
        err_sys_ex(runWithErrors, "error getting server random buffer size");
    }

    rnd = (byte*)XMALLOC(size, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    if (rnd == NULL) {
        err_sys_ex(runWithErrors, "error creating server random buffer");
    }

    size = wolfSSL_get_server_random(ssl, rnd, size);
    if (size == 0) {
2183:   XFREE(rnd, NULL, DYNAMIC_TYPE_TMP_BUFFER);
        err_sys_ex(runWithErrors, "error getting server random buffer");
    }

    printf("Server Random : ");
    pt = rnd;
    if (pt != NULL) {
        for (pt = rnd; pt < rnd + size; pt++) printf("%02X", *pt);
        printf("\n");
    } else {
        err_sys_ex(runWithErrors, "error: attempted to dereference null "
                                                               "pointer");
    }
2196:XFREE(rnd, NULL, DYNAMIC_TYPE_TMP_BUFFER);
}

Buffer rnd is freed at line 2183 and then freed again on line 2196.


Crash message on SSL server (with ASAN):

./examples/server/server -p 4433 -b -x -c s
wolfSSL error: can't load server cert file, check file and run from wolfSSL home dir
Continuing server execution...

wolfSSL error: unable to get SSL
Continuing server execution...

wolfSSL error: unable to enable CRL
Continuing server execution...

wolfSSL error: unable to load CRL
Continuing server execution...

wolfSSL error: unable to set CRL callback url
Continuing server execution...

wolfSSL error: error in setting fd
Continuing server execution...

SSL_accept error -173, Bad function argument
wolfSSL error: SSL_accept failed
Continuing server execution...

peer has no cert!
SSL version is unknown
SSL cipher suite is (null)
wolfSSL error: SSL in error state
Continuing server execution...

wolfSSL error: error getting server random buffer
Continuing server execution...

Server Random :
==1249==ERROR: AddressSanitizer: attempting double-free on 0x60300000e9e0 in thread T0:
#0 0x7f78a10822ca in __interceptor_free (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x982ca)
#1 0x40f47c in server_test examples/server/server.c:2196
#2 0x405851 in main examples/server/server.c:2434
#3 0x7f78a014882f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
#4 0x405a68 in _start (wolfssl-4.2.0c_ASAN/examples/server/.libs/lt-server+0x405a68)

0x60300000e9e0 is located 0 bytes inside of 32-byte region [0x60300000e9e0,0x60300000ea00)
freed by thread T0 here:
#0 0x7f78a10822ca in __interceptor_free (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x982ca)
#1 0x411157 in server_test examples/server/server.c:2183

previously allocated by thread T0 here:
#0 0x7f78a1082602 in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x98602)
#1 0x40ef4e in server_test examples/server/server.c:2176

SUMMARY: AddressSanitizer: double-free ??:0 __interceptor_free
==1249==ABORTING


Crash message on SSL server (without ASAN):

./examples/server/server -p 4433 -b -x -c s
wolfSSL error: can't load server cert file, check file and run from wolfSSL home dir
Continuing server execution...

wolfSSL error: unable to get SSL
Continuing server execution...

wolfSSL error: unable to enable CRL
Continuing server execution...

wolfSSL error: unable to load CRL
Continuing server execution...

wolfSSL error: unable to set CRL callback url
Continuing server execution...

wolfSSL error: error in setting fd
Continuing server execution...

SSL_accept error -173, Bad function argument
wolfSSL error: SSL_accept failed
Continuing server execution...

peer has no cert!
SSL version is unknown
SSL cipher suite is (null)
wolfSSL error: SSL in error state
Continuing server execution...

wolfSSL error: error getting server random buffer
Continuing server execution...

Server Random :
*** Error in `wolfssl-4.2.0c/examples/server/.libs/lt-server': double free or corruption (fasttop): 0x00000000006b8220 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7ff807e5c7e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7ff807e6537a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7ff807e6953c]
wolfssl-4.2.0c/examples/server/.libs/lt-server[0x4076f1]
wolfssl-4.2.0c/examples/server/.libs/lt-server[0x404b31]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7ff807e05830]
wolfssl-4.2.0c/examples/server/.libs/lt-server[0x404ba9]
======= Memory map: ========
00400000-0040d000 r-xp 00000000 fd:01 283903 wolfssl-4.2.0c/examples/server/.libs/lt-server
0060c000-0060d000 r--p 0000c000 fd:01 283903 wolfssl-4.2.0c/examples/server/.libs/lt-server
0060d000-0060e000 rw-p 0000d000 fd:01 283903 wolfssl-4.2.0c/examples/server/.libs/lt-server
006b5000-006d6000 rw-p 00000000 00:00 0 [heap]
7ff800000000-7ff800021000 rw-p 00000000 00:00 0
7ff800021000-7ff804000000 ---p 00000000 00:00 0
7ff8078c6000-7ff8078dc000 r-xp 00000000 fd:01 2039 /lib/x86_64-linux-gnu/libgcc_s.so.1
7ff8078dc000-7ff807adb000 ---p 00016000 fd:01 2039 /lib/x86_64-linux-gnu/libgcc_s.so.1
7ff807adb000-7ff807adc000 rw-p 00015000 fd:01 2039 /lib/x86_64-linux-gnu/libgcc_s.so.1
7ff807adc000-7ff807be4000 r-xp 00000000 fd:01 28242 /lib/x86_64-linux-gnu/libm-2.23.so
7ff807be4000-7ff807de3000 ---p 00108000 fd:01 28242 /lib/x86_64-linux-gnu/libm-2.23.so
7ff807de3000-7ff807de4000 r--p 00107000 fd:01 28242 /lib/x86_64-linux-gnu/libm-2.23.so
7ff807de4000-7ff807de5000 rw-p 00108000 fd:01 28242 /lib/x86_64-linux-gnu/libm-2.23.so
7ff807de5000-7ff807fa5000 r-xp 00000000 fd:01 28237 /lib/x86_64-linux-gnu/libc-2.23.so
7ff807fa5000-7ff8081a5000 ---p 001c0000 fd:01 28237 /lib/x86_64-linux-gnu/libc-2.23.so
7ff8081a5000-7ff8081a9000 r--p 001c0000 fd:01 28237 /lib/x86_64-linux-gnu/libc-2.23.so
7ff8081a9000-7ff8081ab000 rw-p 001c4000 fd:01 28237 /lib/x86_64-linux-gnu/libc-2.23.so
7ff8081ab000-7ff8081af000 rw-p 00000000 00:00 0
7ff8081af000-7ff8081c7000 r-xp 00000000 fd:01 28170 /lib/x86_64-linux-gnu/libpthread-2.23.so
7ff8081c7000-7ff8083c6000 ---p 00018000 fd:01 28170 /lib/x86_64-linux-gnu/libpthread-2.23.so
7ff8083c6000-7ff8083c7000 r--p 00017000 fd:01 28170 /lib/x86_64-linux-gnu/libpthread-2.23.so
7ff8083c7000-7ff8083c8000 rw-p 00018000 fd:01 28170 /lib/x86_64-linux-gnu/libpthread-2.23.so
7ff8083c8000-7ff8083cc000 rw-p 00000000 00:00 0
7ff8083cc000-7ff808509000 r-xp 00000000 fd:01 283606 wolfssl-4.2.0c/src/.libs/libwolfssl.so.23.0.0
7ff808509000-7ff808709000 ---p 0013d000 fd:01 283606 wolfssl-4.2.0c/src/.libs/libwolfssl.so.23.0.0
7ff808709000-7ff80870c000 r--p 0013d000 fd:01 283606 wolfssl-4.2.0c/src/.libs/libwolfssl.so.23.0.0
7ff80870c000-7ff80870e000 rw-p 00140000 fd:01 283606 wolfssl-4.2.0c/src/.libs/libwolfssl.so.23.0.0
7ff80870e000-7ff8087a8000 rw-p 00000000 00:00 0
7ff8087a8000-7ff8087ce000 r-xp 00000000 fd:01 28169 /lib/x86_64-linux-gnu/ld-2.23.so
7ff8089a6000-7ff8089b5000 rw-p 00000000 00:00 0
7ff8089cb000-7ff8089cd000 rw-p 00000000 00:00 0
7ff8089cd000-7ff8089ce000 r--p 00025000 fd:01 28169 /lib/x86_64-linux-gnu/ld-2.23.so
7ff8089ce000-7ff8089cf000 rw-p 00026000 fd:01 28169 /lib/x86_64-linux-gnu/ld-2.23.so
7ff8089cf000-7ff8089d0000 rw-p 00000000 00:00 0
7fff3df08000-7fff3df29000 rw-p 00000000 00:00 0 [stack]
7fff3dfb6000-7fff3dfb9000 r--p 00000000 00:00 0 [vvar]
7fff3dfb9000-7fff3dfbb000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted


Crash message on DTLS server (with ASAN):

./examples/server/server -u -p 4433 -b -x -c s
wolfSSL error: can't load server cert file, check file and run from wolfSSL home dir
Continuing server execution...

wolfSSL error: unable to get SSL
Continuing server execution...

wolfSSL error: unable to enable CRL
Continuing server execution...

wolfSSL error: unable to load CRL
Continuing server execution...

wolfSSL error: unable to set CRL callback url
Continuing server execution...

wolfSSL error: error in setting fd
Continuing server execution...

SSL_accept error -173, Bad function argument
wolfSSL error: SSL_accept failed
Continuing server execution...

peer has no cert!
SSL version is unknown
SSL cipher suite is (null)
wolfSSL error: SSL in error state
Continuing server execution...

wolfSSL error: error getting server random buffer
Continuing server execution...

Server Random :
==29445==ERROR: AddressSanitizer: attempting double-free on 0x60300000e9e0 in thread T0:
#0 0x7f5940ab72ca in __interceptor_free (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x982ca)
#1 0x40f47c in server_test examples/server/server.c:2196
#2 0x405851 in main examples/server/server.c:2434
#3 0x7f593fb7d82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
#4 0x405a68 in _start (wolfssl-4.2.0c_ASAN/examples/server/.libs/lt-server+0x405a68)

0x60300000e9e0 is located 0 bytes inside of 32-byte region [0x60300000e9e0,0x60300000ea00)
freed by thread T0 here:
#0 0x7f5940ab72ca in __interceptor_free (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x982ca)
#1 0x411157 in server_test examples/server/server.c:2183

previously allocated by thread T0 here:
#0 0x7f5940ab7602 in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x98602)
#1 0x40ef4e in server_test examples/server/server.c:2176

SUMMARY: AddressSanitizer: double-free ??:0 __interceptor_free
==29445==ABORTING


Crash message on DTLS server (without ASAN):

./examples/server/server -u -p 4433 -b -x -c s
wolfSSL error: can't load server cert file, check file and run from wolfSSL home dir
Continuing server execution...

wolfSSL error: unable to get SSL
Continuing server execution...

wolfSSL error: unable to enable CRL
Continuing server execution...

wolfSSL error: unable to load CRL
Continuing server execution...

wolfSSL error: unable to set CRL callback url
Continuing server execution...

wolfSSL error: error in setting fd
Continuing server execution...

SSL_accept error -173, Bad function argument
wolfSSL error: SSL_accept failed
Continuing server execution...

peer has no cert!
SSL version is unknown
SSL cipher suite is (null)
wolfSSL error: SSL in error state
Continuing server execution...

wolfSSL error: error getting server random buffer
Continuing server execution...

Server Random :
*** Error in `wolfssl-4.2.0c/examples/server/.libs/lt-server': double free or corruption (fasttop): 0x00000000009e0220 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f83210b77e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7f83210c037a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f83210c453c]
wolfssl-4.2.0c/examples/server/.libs/lt-server[0x4076f1]
wolfssl-4.2.0c/examples/server/.libs/lt-server[0x404b31]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f8321060830]
wolfssl-4.2.0c/examples/server/.libs/lt-server[0x404ba9]
======= Memory map: ========
00400000-0040d000 r-xp 00000000 fd:01 283903 wolfssl-4.2.0c/examples/server/.libs/lt-server
0060c000-0060d000 r--p 0000c000 fd:01 283903 wolfssl-4.2.0c/examples/server/.libs/lt-server
0060d000-0060e000 rw-p 0000d000 fd:01 283903 wolfssl-4.2.0c/examples/server/.libs/lt-server
009dd000-009fe000 rw-p 00000000 00:00 0 [heap]
7f831c000000-7f831c021000 rw-p 00000000 00:00 0
7f831c021000-7f8320000000 ---p 00000000 00:00 0
7f8320b21000-7f8320b37000 r-xp 00000000 fd:01 2039 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f8320b37000-7f8320d36000 ---p 00016000 fd:01 2039 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f8320d36000-7f8320d37000 rw-p 00015000 fd:01 2039 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f8320d37000-7f8320e3f000 r-xp 00000000 fd:01 28242 /lib/x86_64-linux-gnu/libm-2.23.so
7f8320e3f000-7f832103e000 ---p 00108000 fd:01 28242 /lib/x86_64-linux-gnu/libm-2.23.so
7f832103e000-7f832103f000 r--p 00107000 fd:01 28242 /lib/x86_64-linux-gnu/libm-2.23.so
7f832103f000-7f8321040000 rw-p 00108000 fd:01 28242 /lib/x86_64-linux-gnu/libm-2.23.so
7f8321040000-7f8321200000 r-xp 00000000 fd:01 28237 /lib/x86_64-linux-gnu/libc-2.23.so
7f8321200000-7f8321400000 ---p 001c0000 fd:01 28237 /lib/x86_64-linux-gnu/libc-2.23.so
7f8321400000-7f8321404000 r--p 001c0000 fd:01 28237 /lib/x86_64-linux-gnu/libc-2.23.so
7f8321404000-7f8321406000 rw-p 001c4000 fd:01 28237 /lib/x86_64-linux-gnu/libc-2.23.so
7f8321406000-7f832140a000 rw-p 00000000 00:00 0
7f832140a000-7f8321422000 r-xp 00000000 fd:01 28170 /lib/x86_64-linux-gnu/libpthread-2.23.so
7f8321422000-7f8321621000 ---p 00018000 fd:01 28170 /lib/x86_64-linux-gnu/libpthread-2.23.so
7f8321621000-7f8321622000 r--p 00017000 fd:01 28170 /lib/x86_64-linux-gnu/libpthread-2.23.so
7f8321622000-7f8321623000 rw-p 00018000 fd:01 28170 /lib/x86_64-linux-gnu/libpthread-2.23.so
7f8321623000-7f8321627000 rw-p 00000000 00:00 0
7f8321627000-7f8321764000 r-xp 00000000 fd:01 283606 wolfssl-4.2.0c/src/.libs/libwolfssl.so.23.0.0
7f8321764000-7f8321964000 ---p 0013d000 fd:01 283606 wolfssl-4.2.0c/src/.libs/libwolfssl.so.23.0.0
7f8321964000-7f8321967000 r--p 0013d000 fd:01 283606 wolfssl-4.2.0c/src/.libs/libwolfssl.so.23.0.0
7f8321967000-7f8321969000 rw-p 00140000 fd:01 283606 wolfssl-4.2.0c/src/.libs/libwolfssl.so.23.0.0
7f8321969000-7f8321a03000 rw-p 00000000 00:00 0
7f8321a03000-7f8321a29000 r-xp 00000000 fd:01 28169 /lib/x86_64-linux-gnu/ld-2.23.so
7f8321c01000-7f8321c10000 rw-p 00000000 00:00 0
7f8321c26000-7f8321c28000 rw-p 00000000 00:00 0
7f8321c28000-7f8321c29000 r--p 00025000 fd:01 28169 /lib/x86_64-linux-gnu/ld-2.23.so
7f8321c29000-7f8321c2a000 rw-p 00026000 fd:01 28169 /lib/x86_64-linux-gnu/ld-2.23.so
7f8321c2a000-7f8321c2b000 rw-p 00000000 00:00 0
7ffc81616000-7ffc81637000 rw-p 00000000 00:00 0 [stack]
7ffc817b5000-7ffc817b8000 r--p 00000000 00:00 0 [vvar]
7ffc817b8000-7ffc817ba000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted


Reproduction:

  1. Download and compile WolfSSL in version 3.12.0 or later.
  2. Execute one of following commands (there should be no file cert.pem in the current directory):

(for SSL server)
./examples/server/server -p 4433 -b -x -c cert.pem

(for DTLS server)
./examples/server/server -u -p 4433 -b -x -c cert.pem

  1. Connect to SSL or DTLS server from another device

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions