| [2743] | 1 | From b29ffa392e839d05171206523e84909146f7a77c Mon Sep 17 00:00:00 2001 | 
|---|
|  | 2 | From: "Dr. Stephen Henson" <steve@openssl.org> | 
|---|
|  | 3 | Date: Tue, 10 Nov 2015 19:03:07 +0000 | 
|---|
|  | 4 | Subject: [PATCH] Fix leak with ASN.1 combine. | 
|---|
|  | 5 |  | 
|---|
|  | 6 | When parsing a combined structure pass a flag to the decode routine | 
|---|
|  | 7 | so on error a pointer to the parent structure is not zeroed as | 
|---|
|  | 8 | this will leak any additional components in the parent. | 
|---|
|  | 9 |  | 
|---|
|  | 10 | This can leak memory in any application parsing PKCS#7 or CMS structures. | 
|---|
|  | 11 |  | 
|---|
|  | 12 | CVE-2015-3195. | 
|---|
|  | 13 |  | 
|---|
|  | 14 | Thanks to Adam Langley (Google/BoringSSL) for discovering this bug using | 
|---|
|  | 15 | libFuzzer. | 
|---|
|  | 16 |  | 
|---|
|  | 17 | PR#4131 | 
|---|
|  | 18 |  | 
|---|
|  | 19 | Reviewed-by: Richard Levitte <levitte@openssl.org> | 
|---|
|  | 20 |  | 
|---|
|  | 21 | Edited-to-apply: Alexander Chernyakhovsky <achernya@mit.edu> | 
|---|
|  | 22 | --- | 
|---|
|  | 23 | crypto/asn1/tasn_dec.c | 7 +++++-- | 
|---|
|  | 24 | 1 file changed, 5 insertions(+), 2 deletions(-) | 
|---|
|  | 25 |  | 
|---|
|  | 26 | diff --git a/crypto/asn1/tasn_dec.c b/crypto/asn1/tasn_dec.c | 
|---|
|  | 27 | index febf605..9256049 100644 | 
|---|
|  | 28 | --- a/crypto/asn1/tasn_dec.c | 
|---|
|  | 29 | +++ b/crypto/asn1/tasn_dec.c | 
|---|
|  | 30 | @@ -169,6 +169,8 @@ | 
|---|
|  | 31 | int otag; | 
|---|
|  | 32 | int ret = 0; | 
|---|
|  | 33 | ASN1_VALUE **pchptr, *ptmpval; | 
|---|
|  | 34 | +       int combine = aclass & ASN1_TFLG_COMBINE; | 
|---|
|  | 35 | +       aclass &= ~ASN1_TFLG_COMBINE; | 
|---|
|  | 36 | if (!pval) | 
|---|
|  | 37 | return 0; | 
|---|
|  | 38 | if (aux && aux->asn1_cb) | 
|---|
|  | 39 | @@ -539,6 +541,7 @@ | 
|---|
|  | 40 | auxerr: | 
|---|
|  | 41 | ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ASN1_R_AUX_ERROR); | 
|---|
|  | 42 | err: | 
|---|
|  | 43 | +       if (combine == 0) | 
|---|
|  | 44 | ASN1_item_ex_free(pval, it); | 
|---|
|  | 45 | if (errtt) | 
|---|
|  | 46 | ERR_add_error_data(4, "Field=", errtt->field_name, | 
|---|
|  | 47 | @@ -767,7 +770,7 @@ | 
|---|
|  | 48 | { | 
|---|
|  | 49 | /* Nothing special */ | 
|---|
|  | 50 | ret = ASN1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), | 
|---|
|  | 51 | -                                                       -1, 0, opt, ctx); | 
|---|
|  | 52 | +                                                       -1, tt->flags & ASN1_TFLG_COMBINE, opt, ctx); | 
|---|
|  | 53 | if (!ret) | 
|---|
|  | 54 | { | 
|---|
|  | 55 | ASN1err(ASN1_F_ASN1_TEMPLATE_NOEXP_D2I, | 
|---|