diff options
author | djm <> | 2014-04-08 00:55:05 +0000 |
---|---|---|
committer | djm <> | 2014-04-08 00:55:05 +0000 |
commit | 0c9b71e493dec9864976f17b42bf36b7dba29b8e (patch) | |
tree | 1ffd0cd7caca8fdbb6c0ea53a010f9218b2a286e | |
parent | 2b799dc44b041e21f8e5646502eef97621469bfd (diff) | |
download | openbsd-0c9b71e493dec9864976f17b42bf36b7dba29b8e.tar.gz openbsd-0c9b71e493dec9864976f17b42bf36b7dba29b8e.tar.bz2 openbsd-0c9b71e493dec9864976f17b42bf36b7dba29b8e.zip |
MFC:
cherrypick fix for CVE-2014-0160 "heartbleed" vulnerability from
OpenSSL git; ok sthen@
-rw-r--r-- | src/lib/libssl/src/ssl/d1_both.c | 26 | ||||
-rw-r--r-- | src/lib/libssl/src/ssl/t1_lib.c | 14 |
2 files changed, 27 insertions, 13 deletions
diff --git a/src/lib/libssl/src/ssl/d1_both.c b/src/lib/libssl/src/ssl/d1_both.c index de8bab873f..436ab67b7a 100644 --- a/src/lib/libssl/src/ssl/d1_both.c +++ b/src/lib/libssl/src/ssl/d1_both.c | |||
@@ -1452,26 +1452,36 @@ dtls1_process_heartbeat(SSL *s) | |||
1452 | unsigned int payload; | 1452 | unsigned int payload; |
1453 | unsigned int padding = 16; /* Use minimum padding */ | 1453 | unsigned int padding = 16; /* Use minimum padding */ |
1454 | 1454 | ||
1455 | /* Read type and payload length first */ | ||
1456 | hbtype = *p++; | ||
1457 | n2s(p, payload); | ||
1458 | pl = p; | ||
1459 | |||
1460 | if (s->msg_callback) | 1455 | if (s->msg_callback) |
1461 | s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, | 1456 | s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, |
1462 | &s->s3->rrec.data[0], s->s3->rrec.length, | 1457 | &s->s3->rrec.data[0], s->s3->rrec.length, |
1463 | s, s->msg_callback_arg); | 1458 | s, s->msg_callback_arg); |
1464 | 1459 | ||
1460 | /* Read type and payload length first */ | ||
1461 | if (1 + 2 + 16 > s->s3->rrec.length) | ||
1462 | return 0; /* silently discard */ | ||
1463 | hbtype = *p++; | ||
1464 | n2s(p, payload); | ||
1465 | if (1 + 2 + payload + 16 > s->s3->rrec.length) | ||
1466 | return 0; /* silently discard per RFC 6520 sec. 4 */ | ||
1467 | pl = p; | ||
1468 | |||
1465 | if (hbtype == TLS1_HB_REQUEST) | 1469 | if (hbtype == TLS1_HB_REQUEST) |
1466 | { | 1470 | { |
1467 | unsigned char *buffer, *bp; | 1471 | unsigned char *buffer, *bp; |
1472 | unsigned int write_length = 1 /* heartbeat type */ + | ||
1473 | 2 /* heartbeat length */ + | ||
1474 | payload + padding; | ||
1468 | int r; | 1475 | int r; |
1469 | 1476 | ||
1477 | if (write_length > SSL3_RT_MAX_PLAIN_LENGTH) | ||
1478 | return 0; | ||
1479 | |||
1470 | /* Allocate memory for the response, size is 1 byte | 1480 | /* Allocate memory for the response, size is 1 byte |
1471 | * message type, plus 2 bytes payload length, plus | 1481 | * message type, plus 2 bytes payload length, plus |
1472 | * payload, plus padding | 1482 | * payload, plus padding |
1473 | */ | 1483 | */ |
1474 | buffer = OPENSSL_malloc(1 + 2 + payload + padding); | 1484 | buffer = OPENSSL_malloc(write_length); |
1475 | bp = buffer; | 1485 | bp = buffer; |
1476 | 1486 | ||
1477 | /* Enter response type, length and copy payload */ | 1487 | /* Enter response type, length and copy payload */ |
@@ -1482,11 +1492,11 @@ dtls1_process_heartbeat(SSL *s) | |||
1482 | /* Random padding */ | 1492 | /* Random padding */ |
1483 | RAND_pseudo_bytes(bp, padding); | 1493 | RAND_pseudo_bytes(bp, padding); |
1484 | 1494 | ||
1485 | r = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding); | 1495 | r = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, write_length); |
1486 | 1496 | ||
1487 | if (r >= 0 && s->msg_callback) | 1497 | if (r >= 0 && s->msg_callback) |
1488 | s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT, | 1498 | s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT, |
1489 | buffer, 3 + payload + padding, | 1499 | buffer, write_length, |
1490 | s, s->msg_callback_arg); | 1500 | s, s->msg_callback_arg); |
1491 | 1501 | ||
1492 | OPENSSL_free(buffer); | 1502 | OPENSSL_free(buffer); |
diff --git a/src/lib/libssl/src/ssl/t1_lib.c b/src/lib/libssl/src/ssl/t1_lib.c index bfd4731365..a649dafba9 100644 --- a/src/lib/libssl/src/ssl/t1_lib.c +++ b/src/lib/libssl/src/ssl/t1_lib.c | |||
@@ -2441,16 +2441,20 @@ tls1_process_heartbeat(SSL *s) | |||
2441 | unsigned int payload; | 2441 | unsigned int payload; |
2442 | unsigned int padding = 16; /* Use minimum padding */ | 2442 | unsigned int padding = 16; /* Use minimum padding */ |
2443 | 2443 | ||
2444 | /* Read type and payload length first */ | ||
2445 | hbtype = *p++; | ||
2446 | n2s(p, payload); | ||
2447 | pl = p; | ||
2448 | |||
2449 | if (s->msg_callback) | 2444 | if (s->msg_callback) |
2450 | s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, | 2445 | s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, |
2451 | &s->s3->rrec.data[0], s->s3->rrec.length, | 2446 | &s->s3->rrec.data[0], s->s3->rrec.length, |
2452 | s, s->msg_callback_arg); | 2447 | s, s->msg_callback_arg); |
2453 | 2448 | ||
2449 | /* Read type and payload length first */ | ||
2450 | if (1 + 2 + 16 > s->s3->rrec.length) | ||
2451 | return 0; /* silently discard */ | ||
2452 | hbtype = *p++; | ||
2453 | n2s(p, payload); | ||
2454 | if (1 + 2 + payload + 16 > s->s3->rrec.length) | ||
2455 | return 0; /* silently discard per RFC 6520 sec. 4 */ | ||
2456 | pl = p; | ||
2457 | |||
2454 | if (hbtype == TLS1_HB_REQUEST) | 2458 | if (hbtype == TLS1_HB_REQUEST) |
2455 | { | 2459 | { |
2456 | unsigned char *buffer, *bp; | 2460 | unsigned char *buffer, *bp; |