Hi.  This issue is not present in 1.0.1k or earlier (my code has worked for
years), and is in 1.0.2 and 1.0.2a.  I do not have any simple reproducer as
it comes from a moderately esoteric environment using asynchronous BIO
written for [Open]VMS.

The server initiates the SSL listening context using:

      if (!(SSLversion & SESOLA_SSLV2)) SSLoptions |= SSL_OP_NO_SSLv2;
      if (!(SSLversion & SESOLA_SSLV3)) SSLoptions |= SSL_OP_NO_SSLv3;
      if (!(SSLversion & SESOLA_TLSV1)) SSLoptions |= SSL_OP_NO_TLSv1;
      if (!(SSLversion & SESOLA_TLSV1_1)) SSLoptions |= SSL_OP_NO_TLSv1_1;
      if (!(SSLversion & SESOLA_TLSV1_2)) SSLoptions |= SSL_OP_NO_TLSv1_2;
      SslCtx = SSL_CTX_new (SSLv23_method());

(i.e. options-off any non-desired protocol versions)

The problem was induced on the command-line:

  openssl s_client -ssl3 -host <whichever> -port 443

Trace data from the program shows:

|00:53:29.08 SESOLANE 0214 0001 SSL        BEGIN|
|00:53:29.08 SESOLA   2606 0001 SSL        start handshake|
|00:53:29.08 SESOLA   2583 0001 SSL        SSL_ACCEPT before/accept 
initialization|
|00:53:29.08 SESOLA   2686 0001 SSL        READ 11/-1 (outstanding)|
|00:53:29.08 SESOLA   2593 0001 SSL        SSL_ACCEPT error/blocking in 
SSLv2/v3 read client hello A|
|00:53:29.08 SESOLA   2686 0001 SSL        READ 11/11 (complete)|
|00:53:29.08 SESOLA   2700 0001 SSL        CTRL 6 0|
|00:53:29.08 SESOLA   2686 0001 SSL        READ 147/-1 (outstanding)|
|00:53:29.08 SESOLA   2593 0001 SSL        SSL_ACCEPT error/blocking in SSLv3 
read client hello B|
|00:53:29.08 SESOLA   2593 0001 SSL        SSL_ACCEPT error/blocking in SSLv3 
read client hello B|
|00:53:29.09 SESOLA   2686 0001 SSL        READ 147/147 (complete)|
|00:53:29.09 SESOLA   2691 0001 SSL        WRITE 7/-1 (outstanding)|
|00:53:29.09 SESOLA   2602 0001 SSL        SSL_BEFORE write SSLv3 read client 
hello C|
|00:53:29.09 SESOLA   2593 0001 SSL        SSL_ACCEPT error/blocking in SSLv3 
read client hello C|

and then without my workaround segmentation faults, apparently when the NULL
session is dereferenced by ssl3_choose_cipher().

My workaround in s3_svr.c looks like:

#define MGD_150321
#ifdef MGD_150321
/***
OpenSSL v1.0.2 and v1.0.2a ACCVIOs in s3_srvr.c ssl3_get_client_hello()
at ssl3_choose_cipher() when SSLv3 is not enabled with an SSLv3 client!
OpenSSL v1.0.1k s3_srvr.c ssl3_get_client_hello() is fine!!
This seems to be a NULL session being dereferenced here!
***/
        if (s->session == NULL)
           c = NULL;
        else
#endif /* MGD_150321  */
        c = ssl3_choose_cipher(s, s->session->ciphers, SSL_get_ciphers(s));

which avoids the issue but the resulting trace data suggests not elegantly. 
The underlying issue must be upstream in the processing.

Trust this is of some assistance.


_______________________________________________
openssl-dev mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-dev

Reply via email to