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

« back to all changes in this revision

Viewing changes to debian/patches/CVE-2014-3506.patch

  • Committer: Package Import Robot
  • Author(s): Marc Deslauriers
  • Date: 2014-08-07 08:48:43 UTC
  • Revision ID: package-import@ubuntu.com-20140807084843-tdiyho5w4ps784yx
Tags: 0.9.8k-7ubuntu8.20
* SECURITY UPDATE: double free when processing DTLS packets
  - debian/patches/CVE-2014-3505.patch: fix double free in ssl/d1_both.c.
  - CVE-2014-3505
* SECURITY UPDATE: DTLS memory exhaustion
  - debian/patches/CVE-2014-3506.patch: fix DTLS handshake message size
    checks in ssl/d1_both.c.
  - CVE-2014-3506
* SECURITY UPDATE: information leak in pretty printing functions
  - debian/patches/CVE-2014-3508.patch: fix OID handling in
    crypto/asn1/a_object.c, crypto/objects/obj_dat.c, crypto/asn1/asn1.h,
    crypto/asn1/asn1_err.c.
  - CVE-2014-3508
* SECURITY UPDATE: DTLS anonymous EC(DH) denial of service
  - debian/patches/CVE-2014-3510.patch: check for server certs in
    ssl/d1_clnt.c, ssl/s3_clnt.c.
  - CVE-2014-3510
* SECURITY UPDATE: TLS protocol downgrade attack
  - debian/patches/CVE-2014-3511.patch: properly handle fragments in
    ssl/s23_srvr.c.
  - CVE-2014-3511

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
Backport of:
 
2
 
 
3
From 338a5e7e5458edf4cf754fd831a451fb4b57d180 Mon Sep 17 00:00:00 2001
 
4
From: Matt Caswell <matt@openssl.org>
 
5
Date: Fri, 6 Jun 2014 14:25:52 -0700
 
6
Subject: [PATCH] Fix DTLS handshake message size checks.
 
7
MIME-Version: 1.0
 
8
Content-Type: text/plain; charset=utf8
 
9
Content-Transfer-Encoding: 8bit
 
10
 
 
11
In |dtls1_reassemble_fragment|, the value of
 
12
|msg_hdr->frag_off+frag_len| was being checked against the maximum
 
13
handshake message size, but then |msg_len| bytes were allocated for the
 
14
fragment buffer. This means that so long as the fragment was within the
 
15
allowed size, the pending handshake message could consume 16MB + 2MB
 
16
(for the reassembly bitmap). Approx 10 outstanding handshake messages
 
17
are allowed, meaning that an attacker could consume ~180MB per DTLS
 
18
connection.
 
19
 
 
20
In the non-fragmented path (in |dtls1_process_out_of_seq_message|), no
 
21
check was applied.
 
22
 
 
23
Fixes CVE-2014-3506
 
24
 
 
25
Wholly based on patch by Adam Langley with one minor amendment.
 
26
 
 
27
Reviewed-by: Emilia Käsper <emilia@openssl.org>
 
28
---
 
29
 ssl/d1_both.c |   29 ++++++++++++++++-------------
 
30
 1 file changed, 16 insertions(+), 13 deletions(-)
 
31
 
 
32
Index: openssl-0.9.8k/ssl/d1_both.c
 
33
===================================================================
 
34
--- openssl-0.9.8k.orig/ssl/d1_both.c   2014-08-07 08:25:55.302851514 -0400
 
35
+++ openssl-0.9.8k/ssl/d1_both.c        2014-08-07 08:30:16.646858512 -0400
 
36
@@ -549,6 +549,16 @@
 
37
                return 0;
 
38
        }
 
39
 
 
40
+/* dtls1_max_handshake_message_len returns the maximum number of bytes
 
41
+ * permitted in a DTLS handshake message for |s|. The minimum is 16KB, but may
 
42
+ * be greater if the maximum certificate list size requires it. */
 
43
+static unsigned long dtls1_max_handshake_message_len(const SSL *s)
 
44
+       {
 
45
+       unsigned long max_len = DTLS1_HM_HEADER_LENGTH + SSL3_RT_MAX_ENCRYPTED_LENGTH;
 
46
+       if (max_len < (unsigned long)s->max_cert_list)
 
47
+               return s->max_cert_list;
 
48
+       return max_len;
 
49
+       }
 
50
 
 
51
 static int
 
52
 dtls1_process_out_of_seq_message(SSL *s, struct hm_header_st* msg_hdr, int *ok)
 
53
@@ -587,6 +597,9 @@
 
54
 
 
55
        if (frag_len)
 
56
        {
 
57
+               if (frag_len > dtls1_max_handshake_message_len(s))
 
58
+                       goto err;
 
59
+
 
60
                frag = dtls1_hm_fragment_new(frag_len);
 
61
                if ( frag == NULL)
 
62
                        goto err;