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

« back to all changes in this revision

Viewing changes to debian/patches/CVE-2015-0289.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 f20caf7f66cb1eb9ba9562e6097bc7b64d207cb9
 
4
Author: Emilia Kasper <emilia@openssl.org>
 
5
Date:   Fri Feb 27 16:52:23 2015 +0100
 
6
 
 
7
    PKCS#7: avoid NULL pointer dereferences with missing content
 
8
    
 
9
    In PKCS#7, the ASN.1 content component is optional.
 
10
    This typically applies to inner content (detached signatures),
 
11
    however we must also handle unexpected missing outer content
 
12
    correctly.
 
13
    
 
14
    This patch only addresses functions reachable from parsing,
 
15
    decryption and verification, and functions otherwise associated
 
16
    with reading potentially untrusted data.
 
17
    
 
18
    Correcting all low-level API calls requires further work.
 
19
    
 
20
    CVE-2015-0289
 
21
    
 
22
    Thanks to Michal Zalewski (Google) for reporting this issue.
 
23
    
 
24
    Reviewed-by: Steve Henson <steve@openssl.org>
 
25
    
 
26
    Conflicts:
 
27
        crypto/pkcs7/pk7_doit.c
 
28
 
 
29
Index: openssl-0.9.8k/crypto/pkcs7/pk7_doit.c
 
30
===================================================================
 
31
--- openssl-0.9.8k.orig/crypto/pkcs7/pk7_doit.c 2015-03-17 14:36:42.688804027 -0400
 
32
+++ openssl-0.9.8k/crypto/pkcs7/pk7_doit.c      2015-03-17 14:40:15.890524705 -0400
 
33
@@ -151,6 +151,25 @@
 
34
        EVP_PKEY *pkey;
 
35
        ASN1_OCTET_STRING *os=NULL;
 
36
 
 
37
+       if (p7 == NULL) {
 
38
+               PKCS7err(PKCS7_F_PKCS7_DATAINIT, PKCS7_R_INVALID_NULL_POINTER);
 
39
+               return NULL;
 
40
+       }
 
41
+       /*
 
42
+        * The content field in the PKCS7 ContentInfo is optional, but that really
 
43
+        * only applies to inner content (precisely, detached signatures).
 
44
+        *
 
45
+        * When reading content, missing outer content is therefore treated as an
 
46
+        * error.
 
47
+        *
 
48
+        * When creating content, PKCS7_content_new() must be called before
 
49
+        * calling this method, so a NULL p7->d is always an error.
 
50
+        */
 
51
+       if (p7->d.ptr == NULL) {
 
52
+               PKCS7err(PKCS7_F_PKCS7_DATAINIT, PKCS7_R_NO_CONTENT);
 
53
+               return NULL;
 
54
+       }
 
55
+
 
56
        i=OBJ_obj2nid(p7->type);
 
57
        p7->state=PKCS7_S_HEADER;
 
58
 
 
59
@@ -345,6 +364,16 @@
 
60
        X509_ALGOR *xalg=NULL;
 
61
        PKCS7_RECIP_INFO *ri=NULL;
 
62
 
 
63
+       if (p7 == NULL) {
 
64
+               PKCS7err(PKCS7_F_PKCS7_DATADECODE, PKCS7_R_INVALID_NULL_POINTER);
 
65
+               return NULL;
 
66
+       }
 
67
+
 
68
+       if (p7->d.ptr == NULL) {
 
69
+               PKCS7err(PKCS7_F_PKCS7_DATADECODE, PKCS7_R_NO_CONTENT);
 
70
+               return NULL;
 
71
+       }
 
72
+
 
73
        i=OBJ_obj2nid(p7->type);
 
74
        p7->state=PKCS7_S_HEADER;
 
75
 
 
76
@@ -640,6 +669,16 @@
 
77
        STACK_OF(PKCS7_SIGNER_INFO) *si_sk=NULL;
 
78
        ASN1_OCTET_STRING *os=NULL;
 
79
 
 
80
+       if (p7 == NULL) {
 
81
+               PKCS7err(PKCS7_F_PKCS7_DATAFINAL, PKCS7_R_INVALID_NULL_POINTER);
 
82
+               return 0;
 
83
+       }
 
84
+
 
85
+       if (p7->d.ptr == NULL) {
 
86
+               PKCS7err(PKCS7_F_PKCS7_DATAFINAL, PKCS7_R_NO_CONTENT);
 
87
+               return 0;
 
88
+       }
 
89
+
 
90
        EVP_MD_CTX_init(&ctx_tmp);
 
91
        i=OBJ_obj2nid(p7->type);
 
92
        p7->state=PKCS7_S_HEADER;
 
93
@@ -671,6 +710,7 @@
 
94
                /* If detached data then the content is excluded */
 
95
                if(PKCS7_type_is_data(p7->d.sign->contents) && p7->detached) {
 
96
                        M_ASN1_OCTET_STRING_free(os);
 
97
+                       os = NULL;
 
98
                        p7->d.sign->contents->d.data = NULL;
 
99
                }
 
100
                break;
 
101
@@ -681,6 +721,7 @@
 
102
                if(PKCS7_type_is_data(p7->d.digest->contents) && p7->detached)
 
103
                        {
 
104
                        M_ASN1_OCTET_STRING_free(os);
 
105
+                       os = NULL;
 
106
                        p7->d.digest->contents->d.data = NULL;
 
107
                        }
 
108
                break;
 
109
@@ -818,6 +859,12 @@
 
110
 
 
111
        if (!PKCS7_is_detached(p7))
 
112
                {
 
113
+               /*
 
114
+                * NOTE(emilia): I think we only reach os == NULL here because detached
 
115
+                * digested data support is broken.
 
116
+                */
 
117
+               if (os == NULL)
 
118
+                       goto err;
 
119
                btmp=BIO_find_type(bio,BIO_TYPE_MEM);
 
120
                if (btmp == NULL)
 
121
                        {
 
122
@@ -852,6 +899,16 @@
 
123
        STACK_OF(X509) *cert;
 
124
        X509 *x509;
 
125
 
 
126
+       if (p7 == NULL) {
 
127
+               PKCS7err(PKCS7_F_PKCS7_DATAVERIFY, PKCS7_R_INVALID_NULL_POINTER);
 
128
+               return 0;
 
129
+       }
 
130
+
 
131
+       if (p7->d.ptr == NULL) {
 
132
+               PKCS7err(PKCS7_F_PKCS7_DATAVERIFY, PKCS7_R_NO_CONTENT);
 
133
+               return 0;
 
134
+       }
 
135
+
 
136
        if (PKCS7_type_is_signed(p7))
 
137
                {
 
138
                cert=p7->d.sign->cert;
 
139
Index: openssl-0.9.8k/crypto/pkcs7/pk7_lib.c
 
140
===================================================================
 
141
--- openssl-0.9.8k.orig/crypto/pkcs7/pk7_lib.c  2015-03-17 14:36:42.688804027 -0400
 
142
+++ openssl-0.9.8k/crypto/pkcs7/pk7_lib.c       2015-03-17 14:40:48.258786572 -0400
 
143
@@ -70,6 +70,7 @@
 
144
 
 
145
        switch (cmd)
 
146
                {
 
147
+       /* NOTE(emilia): does not support detached digested data. */
 
148
        case PKCS7_OP_SET_DETACHED_SIGNATURE:
 
149
                if (nid == NID_pkcs7_signed)
 
150
                        {
 
151
@@ -473,6 +474,8 @@
 
152
 
 
153
 STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7)
 
154
        {
 
155
+       if (p7 == NULL || p7->d.ptr == NULL)
 
156
+               return NULL;
 
157
        if (PKCS7_type_is_signed(p7))
 
158
                {
 
159
                return(p7->d.sign->signer_info);