~ubuntu-branches/ubuntu/lucid/openssl/lucid-security

« back to all changes in this revision

Viewing changes to debian/patches/CVE-2015-0293.patch

  • Committer: Package Import Robot
  • Author(s): Marc Deslauriers
  • Date: 2015-03-19 09:57:59 UTC
  • Revision ID: package-import@ubuntu.com-20150319095759-do88u689v2nfth1v
Tags: 0.9.8k-7ubuntu8.27
* SECURITY UPDATE: denial of service and possible memory corruption via
  malformed EC private key
  - debian/patches/CVE-2015-0209.patch: fix use after free in
    crypto/ec/ec_asn1.c.
  - debian/patches/CVE-2015-0209-2.patch: fix a failure to NULL a pointer
    freed on error in crypto/asn1/x_x509.c, crypto/ec/ec_asn1.c.
  - CVE-2015-0209
* SECURITY UPDATE: denial of service via cert verification
  - debian/patches/CVE-2015-0286.patch: handle boolean types in
    crypto/asn1/a_type.c.
  - CVE-2015-0286
* SECURITY UPDATE: ASN.1 structure reuse memory corruption
  - debian/patches/CVE-2015-0287.patch: free up structures in
    crypto/asn1/tasn_dec.c.
  - CVE-2015-0287
* SECURITY UPDATE: denial of service via invalid certificate key
  - debian/patches/CVE-2015-0288.patch: check public key isn't NULL in
    crypto/x509/x509_req.c.
  - CVE-2015-0288
* SECURITY UPDATE: denial of service and possible code execution via
  PKCS#7 parsing
  - debian/patches/CVE-2015-0289.patch: handle missing content in
    crypto/pkcs7/pk7_doit.c, crypto/pkcs7/pk7_lib.c.
  - CVE-2015-0289
* SECURITY UPDATE: denial of service or memory corruption via base64
  decoding
  - debian/patches/CVE-2015-0292.patch: prevent underflow in
    crypto/evp/encode.c.
  - CVE-2015-0292
* SECURITY UPDATE: denial of service via assert in SSLv2 servers
  - debian/patches/CVE-2015-0293.patch: check key lengths in
    ssl/s2_lib.c, ssl/s2_srvr.c.
  - debian/patches/CVE-2015-0293-2.patch: fix unsigned/signed warnings in
    ssl/s2_srvr.c.
  - CVE-2015-0293

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
Backport of:
 
2
 
 
3
commit ab646ee5a6a7b8cace425a617a053ad6d7977086
 
4
Author: Emilia Kasper <emilia@openssl.org>
 
5
Date:   Wed Mar 4 09:05:02 2015 -0800
 
6
 
 
7
    Fix reachable assert in SSLv2 servers.
 
8
    
 
9
    This assert is reachable for servers that support SSLv2 and export ciphers.
 
10
    Therefore, such servers can be DoSed by sending a specially crafted
 
11
    SSLv2 CLIENT-MASTER-KEY.
 
12
    
 
13
    Also fix s2_srvr.c to error out early if the key lengths are malformed.
 
14
    These lengths are sent unencrypted, so this does not introduce an oracle.
 
15
    
 
16
    CVE-2015-0293
 
17
    
 
18
    This issue was discovered by Sean Burford (Google) and Emilia Käsper of
 
19
    the OpenSSL development team.
 
20
    
 
21
    Reviewed-by: Richard Levitte <levitte@openssl.org>
 
22
    Reviewed-by: Tim Hudson <tjh@openssl.org>
 
23
 
 
24
Index: openssl-0.9.8k/ssl/s2_lib.c
 
25
===================================================================
 
26
--- openssl-0.9.8k.orig/ssl/s2_lib.c    2015-03-17 14:41:50.331289196 -0400
 
27
+++ openssl-0.9.8k/ssl/s2_lib.c 2015-03-17 14:42:15.743495133 -0400
 
28
@@ -410,7 +410,7 @@
 
29
 
 
30
                OPENSSL_assert(s->session->master_key_length >= 0
 
31
                    && s->session->master_key_length
 
32
-                   < (int)sizeof(s->session->master_key));
 
33
+                   <= (int)sizeof(s->session->master_key));
 
34
                EVP_DigestUpdate(&ctx,s->session->master_key,s->session->master_key_length);
 
35
                EVP_DigestUpdate(&ctx,&c,1);
 
36
                c++;
 
37
Index: openssl-0.9.8k/ssl/s2_srvr.c
 
38
===================================================================
 
39
--- openssl-0.9.8k.orig/ssl/s2_srvr.c   2015-03-17 14:41:50.331289196 -0400
 
40
+++ openssl-0.9.8k/ssl/s2_srvr.c        2015-03-17 14:44:47.244724795 -0400
 
41
@@ -445,9 +445,6 @@
 
42
                SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_NO_PRIVATEKEY);
 
43
                return(-1);
 
44
                }
 
45
-       i=ssl_rsa_private_decrypt(s->cert,s->s2->tmp.enc,
 
46
-               &(p[s->s2->tmp.clear]),&(p[s->s2->tmp.clear]),
 
47
-               (s->s2->ssl2_rollback)?RSA_SSLV23_PADDING:RSA_PKCS1_PADDING);
 
48
 
 
49
        is_export=SSL_C_IS_EXPORT(s->session->cipher);
 
50
        
 
51
@@ -466,21 +463,60 @@
 
52
        else
 
53
                ek=5;
 
54
 
 
55
+       /*
 
56
+        * The format of the CLIENT-MASTER-KEY message is
 
57
+        * 1 byte message type
 
58
+        * 3 bytes cipher
 
59
+        * 2-byte clear key length (stored in s->s2->tmp.clear)
 
60
+        * 2-byte encrypted key length (stored in s->s2->tmp.enc)
 
61
+        * 2-byte key args length (IV etc)
 
62
+        * clear key
 
63
+        * encrypted key
 
64
+        * key args
 
65
+        *
 
66
+        * If the cipher is an export cipher, then the encrypted key bytes
 
67
+        * are a fixed portion of the total key (5 or 8 bytes). The size of
 
68
+        * this portion is in |ek|. If the cipher is not an export cipher,
 
69
+        * then the entire key material is encrypted (i.e., clear key length
 
70
+        * must be zero).
 
71
+        */
 
72
+       if ((!is_export && s->s2->tmp.clear != 0) ||
 
73
+               (is_export && s->s2->tmp.clear + ek != EVP_CIPHER_key_length(c))) {
 
74
+               ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
 
75
+               SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_BAD_LENGTH);
 
76
+               return -1;
 
77
+       }
 
78
+       /*
 
79
+        * The encrypted blob must decrypt to the encrypted portion of the key.
 
80
+        * Decryption can't be expanding, so if we don't have enough encrypted
 
81
+        * bytes to fit the key in the buffer, stop now.
 
82
+        */
 
83
+       if ((is_export && s->s2->tmp.enc < ek) ||
 
84
+               (!is_export && s->s2->tmp.enc < EVP_CIPHER_key_length(c))) {
 
85
+               ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
 
86
+               SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_LENGTH_TOO_SHORT);
 
87
+               return -1;
 
88
+       }
 
89
+
 
90
+       i = ssl_rsa_private_decrypt(s->cert, s->s2->tmp.enc,
 
91
+                               &(p[s->s2->tmp.clear]),
 
92
+                               &(p[s->s2->tmp.clear]),
 
93
+                               (s->s2->ssl2_rollback) ? RSA_SSLV23_PADDING :
 
94
+                               RSA_PKCS1_PADDING);
 
95
+
 
96
        /* bad decrypt */
 
97
 #if 1
 
98
        /* If a bad decrypt, continue with protocol but with a
 
99
         * random master secret (Bleichenbacher attack) */
 
100
-       if ((i < 0) ||
 
101
-               ((!is_export && (i != EVP_CIPHER_key_length(c)))
 
102
-               || (is_export && ((i != ek) || (s->s2->tmp.clear+(unsigned int)i !=
 
103
-                       (unsigned int)EVP_CIPHER_key_length(c))))))
 
104
+       if ((i < 0) || ((!is_export && i != EVP_CIPHER_key_length(c))
 
105
+                       || (is_export && i != ek)))
 
106
                {
 
107
                ERR_clear_error();
 
108
                if (is_export)
 
109
                        i=ek;
 
110
                else
 
111
                        i=EVP_CIPHER_key_length(c);
 
112
-               if (RAND_pseudo_bytes(p,i) <= 0)
 
113
+               if (RAND_pseudo_bytes(&p[s->s2->tmp.clear], i) <= 0)
 
114
                        return 0;
 
115
                }
 
116
 #else
 
117
@@ -504,7 +540,7 @@
 
118
                }
 
119
 #endif
 
120
 
 
121
-       if (is_export) i+=s->s2->tmp.clear;
 
122
+       if (is_export) i = EVP_CIPHER_key_length(c);
 
123
 
 
124
        if (i > SSL_MAX_MASTER_KEY_LENGTH)
 
125
                {