--- Begin Message ---
Package: release.debian.org
Severity: normal
Tags: jessie
User: release.debian....@packages.debian.org
Usertags: pu
Hi
libksba in jessie is affected by some CVEs which do not neccessarly
seem to need a DSA. I would like to propose the attached
debdiff/update for libksba via the next jessie point release.
Would you accept that upload? I took the git commits without
modifying, thus the first patch as well updates the copyright years
notice in one file. I can drop that if you prefer.
The "Fix an OOB read access in _ksba_dn_to_str" patch is an addition
to CVE-2016-4356 required. If we do not apply that one libskba will be
affected by CVE-2016-4574.
Thanks a lot for your time and review already,
Regards,
Salvatore
diff -Nru libksba-1.3.2/debian/changelog libksba-1.3.2/debian/changelog
--- libksba-1.3.2/debian/changelog 2014-11-25 20:08:22.000000000 +0100
+++ libksba-1.3.2/debian/changelog 2016-05-16 17:18:48.000000000 +0200
@@ -1,3 +1,14 @@
+libksba (1.3.2-1+deb8u1) jessie; urgency=medium
+
+ * Non-maintainer upload.
+ * Do not abort on decoder stack overflow (CVE-2016-4353)
+ * Fix integer overflow in the BER decoder (CVE-2016-4354 CVE-2016-4355)
+ * Fix encoding of invalid utf-8 strings in dn.c (CVE-2016-4356)
+ * Fix an OOB read access in _ksba_dn_to_str
+ * Fix possible read access beyond the buffer (CVE-2016-4579)
+
+ -- Salvatore Bonaccorso <car...@debian.org> Mon, 16 May 2016 17:18:33 +0200
+
libksba (1.3.2-1) unstable; urgency=high
* New upstream security release, fixing a buffer overflow in ksba_oid_to_str
diff -Nru
libksba-1.3.2/debian/patches/Do-not-abort-on-decoder-stack-overflow.patch
libksba-1.3.2/debian/patches/Do-not-abort-on-decoder-stack-overflow.patch
--- libksba-1.3.2/debian/patches/Do-not-abort-on-decoder-stack-overflow.patch
1970-01-01 01:00:00.000000000 +0100
+++ libksba-1.3.2/debian/patches/Do-not-abort-on-decoder-stack-overflow.patch
2016-05-16 17:18:48.000000000 +0200
@@ -0,0 +1,137 @@
+From 07116a314f4dcd4d96990bbd74db95a03a9f650a Mon Sep 17 00:00:00 2001
+From: Werner Koch <w...@gnupg.org>
+Date: Thu, 9 Apr 2015 11:50:03 +0200
+Subject: [PATCH] Do not abort on decoder stack overflow.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+* src/ber-decoder.c (push_decoder_state, pop_decoder_state): Return an
+error code.
+(set_error): Prefix error message with "ksba:". Act on new return code.
+(decoder_next): Act on new return code.
+--
+
+This changes the behaviour from
+
+ gpgsm: unknown hash algorithm '1.8.48.48.48.48.48.48.48.48'
+ gpgsm: detached signature w/o data - assuming certs-only
+ ERROR: decoder stack overflow!
+ Aborted
+
+to
+
+ gpgsm: detached signature w/o data - assuming certs-only
+ ksba: ber-decoder: stack overflow!
+ gpgsm: ksba_cms_parse failed: Limit reached
+
+Use "gpgsm --verify FILE" to exhibit the problem. FILE is
+-----BEGIN PGP ARMORED FILE-----
+
+MDAGCSqGSIb3DQEHAqCAMDACAQExDzANBgkwMDAwMDAwMDAwADCABgkwMDAwMDAw
+MDAAMDEwoIGTMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
+MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
+MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
+MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
+MDAwMDAwMDAwMDAwMDAjMDA=
+=PQdP
+-----END PGP ARMORED FILE-----
+
+Reported-by: Hanno B??ck
+Signed-off-by: Werner Koch <w...@gnupg.org>
+---
+ src/ber-decoder.c | 30 ++++++++++++++++++------------
+ 1 file changed, 18 insertions(+), 12 deletions(-)
+
+diff --git a/src/ber-decoder.c b/src/ber-decoder.c
+index b4689fa..9e70d92 100644
+--- a/src/ber-decoder.c
++++ b/src/ber-decoder.c
+@@ -1,5 +1,5 @@
+ /* ber-decoder.c - Basic Encoding Rules Decoder
+- * Copyright (C) 2001, 2004, 2006, 2012 g10 Code GmbH
++ * Copyright (C) 2001, 2004, 2006, 2012, 2015 g10 Code GmbH
+ *
+ * This file is part of KSBA.
+ *
+@@ -175,26 +175,28 @@ dump_decoder_state (DECODER_STATE ds)
+ }
+
+ /* Push ITEM onto the stack */
+-static void
++static gpg_error_t
+ push_decoder_state (DECODER_STATE ds)
+ {
+ if (ds->idx >= ds->stacksize)
+ {
+- fprintf (stderr, "ERROR: decoder stack overflow!\n");
+- abort ();
++ fprintf (stderr, "ksba: ber-decoder: stack overflow!\n");
++ return gpg_error (GPG_ERR_LIMIT_REACHED);
+ }
+ ds->stack[ds->idx++] = ds->cur;
++ return 0;
+ }
+
+-static void
++static gpg_error_t
+ pop_decoder_state (DECODER_STATE ds)
+ {
+ if (!ds->idx)
+ {
+- fprintf (stderr, "ERROR: decoder stack underflow!\n");
+- abort ();
++ fprintf (stderr, "ksba: ber-decoder: stack underflow!\n");
++ return gpg_error (GPG_ERR_INTERNAL);
+ }
+ ds->cur = ds->stack[--ds->idx];
++ return 0;
+ }
+
+
+@@ -202,7 +204,7 @@ pop_decoder_state (DECODER_STATE ds)
+ static int
+ set_error (BerDecoder d, AsnNode node, const char *text)
+ {
+- fprintf (stderr,"ber-decoder: node `%s': %s\n",
++ fprintf (stderr,"ksba: ber-decoder: node `%s': %s\n",
+ node? node->name:"?", text);
+ d->last_errdesc = text;
+ return gpg_error (GPG_ERR_BAD_BER);
+@@ -955,9 +957,9 @@ decoder_next (BerDecoder d)
+ && (ds->cur.nread
+ > ds->stack[ds->idx-1].length))
+ {
+- fprintf (stderr, " ERROR: object length field "
++ fprintf (stderr, "ksba: ERROR: object length field "
+ "%d octects too large\n",
+- ds->cur.nread > ds->cur.length);
++ ds->cur.nread - ds->cur.length);
+ ds->cur.nread = ds->cur.length;
+ }
+ if ( ds->idx
+@@ -967,7 +969,9 @@ decoder_next (BerDecoder d)
+ >= ds->stack[ds->idx-1].length))))
+ {
+ int n = ds->cur.nread;
+- pop_decoder_state (ds);
++ err = pop_decoder_state (ds);
++ if (err)
++ return err;
+ ds->cur.nread += n;
+ ds->cur.went_up++;
+ }
+@@ -983,7 +987,9 @@ decoder_next (BerDecoder d)
+ /* prepare for the next level */
+ ds->cur.length = ti.length;
+ ds->cur.ndef_length = ti.ndef;
+- push_decoder_state (ds);
++ err = push_decoder_state (ds);
++ if (err)
++ return err;
+ ds->cur.length = 0;
+ ds->cur.ndef_length = 0;
+ ds->cur.nread = 0;
+--
+2.8.1
+
diff -Nru
libksba-1.3.2/debian/patches/Fix-an-OOB-read-access-in-_ksba_dn_to_str.patch
libksba-1.3.2/debian/patches/Fix-an-OOB-read-access-in-_ksba_dn_to_str.patch
---
libksba-1.3.2/debian/patches/Fix-an-OOB-read-access-in-_ksba_dn_to_str.patch
1970-01-01 01:00:00.000000000 +0100
+++
libksba-1.3.2/debian/patches/Fix-an-OOB-read-access-in-_ksba_dn_to_str.patch
2016-05-16 17:18:48.000000000 +0200
@@ -0,0 +1,40 @@
+From 6be61daac047d8e6aa941eb103f8e71a1d4e3c75 Mon Sep 17 00:00:00 2001
+From: Werner Koch <w...@gnupg.org>
+Date: Tue, 3 May 2016 16:01:09 +0200
+Subject: [PATCH] Fix an OOB read access in _ksba_dn_to_str.
+
+* src/dn.c (append_utf8_value): Use a straightforward check to fix an
+off-by-one.
+--
+
+The old fix for the problem from April 2015 had an off-by-one in the
+bad encoding handing.
+
+Fixes-commit: 243d12fdec66a4360fbb3e307a046b39b5b4ffc3
+GnuPG-bug-id: 2344
+Reported-by: Pascal Cuoq
+Signed-off-by: Werner Koch <w...@gnupg.org>
+---
+ src/dn.c | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/src/dn.c b/src/dn.c
+index d207bf0..cea18a1 100644
+--- a/src/dn.c
++++ b/src/dn.c
+@@ -332,11 +332,8 @@ append_utf8_value (const unsigned char *value, size_t
length,
+ }
+ else
+ {
+- if (n+nmore > length)
+- nmore = length - n; /* Oops, encoding to short */
+-
+ tmp[0] = *s++; n++;
+- for (i=1; i <= nmore; i++)
++ for (i=1; n < length && i <= nmore; i++)
+ {
+ if ( (*s & 0xc0) != 0x80)
+ break; /* Invalid encoding - let the next cycle detect this.
*/
+--
+2.8.1
+
diff -Nru
libksba-1.3.2/debian/patches/Fix-encoding-of-invalid-utf-8-strings-in-dn.c.patch
libksba-1.3.2/debian/patches/Fix-encoding-of-invalid-utf-8-strings-in-dn.c.patch
---
libksba-1.3.2/debian/patches/Fix-encoding-of-invalid-utf-8-strings-in-dn.c.patch
1970-01-01 01:00:00.000000000 +0100
+++
libksba-1.3.2/debian/patches/Fix-encoding-of-invalid-utf-8-strings-in-dn.c.patch
2016-05-16 17:18:48.000000000 +0200
@@ -0,0 +1,128 @@
+From 243d12fdec66a4360fbb3e307a046b39b5b4ffc3 Mon Sep 17 00:00:00 2001
+From: Werner Koch <w...@gnupg.org>
+Date: Wed, 8 Apr 2015 18:51:21 +0200
+Subject: [PATCH] Fix encoding of invalid utf-8 strings in dn.c
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+* src/dn.c (append_quoted, append_atv): Use snprintf.
+(append_utf8_value): Fix invalid encoding handling.
+--
+
+An invalid utf-8 encoding will make the loop in append_utf8_value run
+once more with N > length which is not found by the termination
+condition and only the former assert terminates the process if the byte
+following the bad encoding has the high bit cleared. This will lead
+to a read access out of bounds.
+
+The patch removes the assert and fixes the handling of bad encoding.
+Due to the new quoting the output of a badly encoded utf-8 string will
+be different than in previous versions.
+
+Replacing sprintf is only for cosmetic reasons.
+
+Use "gpgsm --verify FILE" to exhibit the problem. FILE is
+-----BEGIN PGP ARMORED FILE-----
+
+MDAGCSqGSIb3DQEHAqCAMDACAQExDzANBgkwMDAwMDAwMDAwADCABgkwMDAwMDAw
+MDAAMDEwAgEwMDAwMDEwMDAGA1UEAwwB/4AwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
+MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
+=NJTr
+-----END PGP ARMORED FILE-----
+
+Reported-by: Hanno B??ck
+Signed-off-by: Werner Koch <w...@gnupg.org>
+---
+ src/dn.c | 44 +++++++++++++++++++++++++++-----------------
+ 1 file changed, 27 insertions(+), 17 deletions(-)
+
+diff --git a/src/dn.c b/src/dn.c
+index 4fab689..d207bf0 100644
+--- a/src/dn.c
++++ b/src/dn.c
+@@ -260,7 +260,7 @@ append_quoted (struct stringbuf *sb, const unsigned char
*value, size_t length,
+ n += skip;
+ if ( *s < ' ' || *s > 126 )
+ {
+- sprintf (tmp, "\\%02X", *s);
++ snprintf (tmp, sizeof tmp, "\\%02X", *s);
+ put_stringbuf_mem (sb, tmp, 3);
+ }
+ else
+@@ -300,7 +300,6 @@ append_utf8_value (const unsigned char *value, size_t
length,
+ length--;
+ }
+
+- /* FIXME: check that the invalid encoding handling is correct */
+ for (s=value, n=0;;)
+ {
+ for (value = s; n < length && !(*s & 0x80); n++, s++)
+@@ -309,8 +308,9 @@ append_utf8_value (const unsigned char *value, size_t
length,
+ append_quoted (sb, value, s-value, 0);
+ if (n==length)
+ return; /* ready */
+- assert ((*s & 0x80));
+- if ( (*s & 0xe0) == 0xc0 ) /* 110x xxxx */
++ if (!(*s & 0x80))
++ nmore = 0; /* Not expected here: high bit not set. */
++ else if ( (*s & 0xe0) == 0xc0 ) /* 110x xxxx */
+ nmore = 1;
+ else if ( (*s & 0xf0) == 0xe0 ) /* 1110 xxxx */
+ nmore = 2;
+@@ -320,21 +320,31 @@ append_utf8_value (const unsigned char *value, size_t
length,
+ nmore = 4;
+ else if ( (*s & 0xfe) == 0xfc ) /* 1111 110x */
+ nmore = 5;
+- else /* invalid encoding */
+- nmore = 5; /* we will reduce the check length anyway */
+-
+- if (n+nmore > length)
+- nmore = length - n; /* oops, encoding to short */
++ else /* Invalid encoding */
++ nmore = 0;
+
+- tmp[0] = *s++; n++;
+- for (i=1; i <= nmore; i++)
++ if (!nmore)
+ {
+- if ( (*s & 0xc0) != 0x80)
+- break; /* invalid encoding - stop */
+- tmp[i] = *s++;
+- n++;
++ /* Encoding error: We quote the bad byte. */
++ snprintf (tmp, sizeof tmp, "\\%02X", *s);
++ put_stringbuf_mem (sb, tmp, 3);
++ s++; n++;
++ }
++ else
++ {
++ if (n+nmore > length)
++ nmore = length - n; /* Oops, encoding to short */
++
++ tmp[0] = *s++; n++;
++ for (i=1; i <= nmore; i++)
++ {
++ if ( (*s & 0xc0) != 0x80)
++ break; /* Invalid encoding - let the next cycle detect this.
*/
++ tmp[i] = *s++;
++ n++;
++ }
++ put_stringbuf_mem (sb, tmp, i);
+ }
+- put_stringbuf_mem (sb, tmp, i);
+ }
+ }
+
+@@ -618,7 +628,7 @@ append_atv (const unsigned char *image, AsnNode root,
struct stringbuf *sb)
+ for (i=0; i < node->len; i++)
+ {
+ char tmp[3];
+- sprintf (tmp, "%02X", image[node->off+node->nhdr+i]);
++ snprintf (tmp, sizeof tmp, "%02X", image[node->off+node->nhdr+i]);
+ put_stringbuf (sb, tmp);
+ }
+ break;
+--
+2.8.1
+
diff -Nru
libksba-1.3.2/debian/patches/Fix-integer-overflow-in-the-BER-decoder.patch
libksba-1.3.2/debian/patches/Fix-integer-overflow-in-the-BER-decoder.patch
--- libksba-1.3.2/debian/patches/Fix-integer-overflow-in-the-BER-decoder.patch
1970-01-01 01:00:00.000000000 +0100
+++ libksba-1.3.2/debian/patches/Fix-integer-overflow-in-the-BER-decoder.patch
2016-05-16 17:18:48.000000000 +0200
@@ -0,0 +1,244 @@
+From aea7b6032865740478ca4b706850a5217f1c3887 Mon Sep 17 00:00:00 2001
+From: Werner Koch <w...@gnupg.org>
+Date: Thu, 9 Apr 2015 11:17:28 +0200
+Subject: [PATCH] Fix integer overflow in the BER decoder.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+* src/ber-decoder.c (ber_decoder_s): Change val.length from int to
+size_t.
+(sum_a1_a2_gt_b, sum_a1_a2_ge_b): New.
+(decoder_next): Check for integer overflow. Use new sum function for
+size check.
+(_ksba_ber_decoder_dump): Use size_t for n to match change of
+val.length. Adjust printf fomrat. Check for integer overflow and use
+gpg_error_from_syserror instead of GPG_ERR_ENOMEM.
+(_ksba_ber_decoder_decode): Use new sum function for size check.
+Check for integer overflow. Use size_t for n to match change of
+val.length.
+--
+
+The actual bug described below is due to assigning an int
+(val.length) to a size_t (ti.length). The int was too large and thus
+negative so that the condition to check for too large objects didn't
+worked. Changing the type would have been enough but other conditions
+are possible. Thus the introduction of sum_a1_a2_ge_b for overflow
+checking and checks when adding 100 extra bytes to malloc calls are
+added.
+
+Use "gpgsm --verify FILE" to exhibit the problem. FILE is
+-----BEGIN PGP ARMORED FILE-----
+
+MDAGCSqGSIb3DQEHAqCAMIACAQExDzANBgkwMDAwMDAwMDAwADAwBhcwMDAwMDAw
+MDAwMDAwMDAwMDAwMDAwMAAwMTAGCTAwMDAwMDAwMDAwBgkwMDAwMDAwMDAwMAYJ
+MDAwMDAwMDAwMDAXLDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
+MDAwMDAwMDAwCoYwMP////UwMDAwMDAwMDAwMDAwMDAwMA==
+=tvju
+-----END PGP ARMORED FILE-----
+
+Without the patch this error occured:
+
+ gpgsm: unknown hash algorithm '1.8.48.48.48.48.48.48.48.48'
+ gpgsm: detached signature w/o data - assuming certs-only
+ =================================================================
+ ==14322==ERROR: AddressSanitizer: heap-buffer-overflow on address
+ 0x60b00000aded at pc 0x462ca8 bp 0x7fffd5928d90 sp 0x7fffd5928d80
+ WRITE of size 1 at 0x60b00000aded thread T0
+ #0 0x462ca7 in base64_reader_cb [...]-2.1.2/sm/base64.c:363
+ #1 0x7f35e70b6365 (/usr/lib64/libksba.so.8+0x7365)
+ #2 0x7f35e70bee11 (/usr/lib64/libksba.so.8+0xfe11)
+ #3 0x7f35e70c75ed (/usr/lib64/libksba.so.8+0x185ed)
+ #4 0x7f35e70c7a9d (/usr/lib64/libksba.so.8+0x18a9d)
+ #5 0x7f35e70c356f (/usr/lib64/libksba.so.8+0x1456f)
+ #6 0x7f35e70c58bf (/usr/lib64/libksba.so.8+0x168bf)
+ #7 0x48cbee in gpgsm_verify [...]/gnupg-2.1.2/sm/verify.c:171
+ #8 0x412901 in main /data/gnupg/gnupg-2.1.2/sm/gpgsm.c:1795
+ #9 0x7f35e68d5f9f in __libc_start_main ([...]
+ #10 0x415a91 (/data/gnupg/gnupg-2.1.2/sm/gpgsm+0x415a91)
+
+ 0x60b00000aded is located 0 bytes to the right of 109-byte region
+ [0x60b00000ad80,0x60b00000aded)
+ allocated by thread T0 here:
+ #0 0x7f35e782e6f7 in malloc [...]
+ #1 0x7f35e75040b0 (/usr/lib64/libgcrypt.so.20+0xc0b0)
+
+ SUMMARY: AddressSanitizer: heap-buffer-overflow [...]
+ Shadow bytes around the buggy address:
+ 0x0c167fff9560: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
+ 0x0c167fff9570: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
+ 0x0c167fff9580: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
+ 0x0c167fff9590: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
+ 0x0c167fff95a0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
+ =>0x0c167fff95b0: 00 00 00 00 00 00 00 00 00 00 00 00 00[05]fa fa
+ 0x0c167fff95c0: fa fa fa fa fa fa 00 00 00 00 00 00 00 00 00 00
+ 0x0c167fff95d0: 00 00 00 fa fa fa fa fa fa fa fa fa 00 00 00 00
+
+Reported-by: Hanno B??ck
+Signed-off-by: Werner Koch <w...@gnupg.org>
+---
+ src/ber-decoder.c | 71 ++++++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 54 insertions(+), 17 deletions(-)
+
+diff --git a/src/ber-decoder.c b/src/ber-decoder.c
+index 873f810..b4689fa 100644
+--- a/src/ber-decoder.c
++++ b/src/ber-decoder.c
+@@ -100,7 +100,7 @@ struct ber_decoder_s
+ struct
+ {
+ int primitive; /* current value is a primitive one */
+- int length; /* length of the primitive one */
++ size_t length; /* length of the primitive one */
+ int nhdr; /* length of the header */
+ int tag;
+ int is_endtag;
+@@ -109,6 +109,23 @@ struct ber_decoder_s
+ };
+
+
++
++/* Evaluate with overflow check: A1 + A2 > B */
++static inline int
++sum_a1_a2_gt_b (size_t a1, size_t a2, size_t b)
++{
++ size_t sum = a1 + a2;
++ return (sum < a1 || sum > b);
++}
++
++/* Evaluate with overflow check: A1 + A2 >= B */
++static inline int
++sum_a1_a2_ge_b (size_t a1, size_t a2, size_t b)
++{
++ size_t sum = a1 + a2;
++ return (sum < a1 || sum >= b);
++}
++
+
+
+ static DECODER_STATE
+@@ -839,14 +856,16 @@ decoder_next (BerDecoder d)
+ {
+ /* We need some extra bytes to store the stuff we read ahead
+ at the end of the module which is later pushed back. */
+- d->image.length = ti.length + 100;
+ d->image.used = 0;
++ d->image.length = ti.length + 100;
++ if (d->image.length < ti.length)
++ return gpg_error (GPG_ERR_BAD_BER);
+ d->image.buf = xtrymalloc (d->image.length);
+ if (!d->image.buf)
+ return gpg_error (GPG_ERR_ENOMEM);
+ }
+
+- if (ti.nhdr + d->image.used >= d->image.length)
++ if (sum_a1_a2_ge_b (ti.nhdr, d->image.used, d->image.length))
+ return set_error (d, NULL, "image buffer too short to store the tag");
+
+ memcpy (d->image.buf + d->image.used, ti.buf, ti.nhdr);
+@@ -1041,7 +1060,7 @@ _ksba_ber_decoder_dump (BerDecoder d, FILE *fp)
+ int depth = 0;
+ AsnNode node;
+ unsigned char *buf = NULL;
+- size_t buflen = 0;;
++ size_t buflen = 0;
+
+ if (!d)
+ return gpg_error (GPG_ERR_INV_VALUE);
+@@ -1063,9 +1082,9 @@ _ksba_ber_decoder_dump (BerDecoder d, FILE *fp)
+ if (node)
+ depth = distance (d->root, node);
+
+- fprintf (fp, "%4lu %4u:%*s",
++ fprintf (fp, "%4lu %4lu:%*s",
+ ksba_reader_tell (d->reader) - d->val.nhdr,
+- d->val.length,
++ (unsigned long)d->val.length,
+ depth*2, "");
+ if (node)
+ _ksba_asn_node_dump (node, fp);
+@@ -1074,16 +1093,22 @@ _ksba_ber_decoder_dump (BerDecoder d, FILE *fp)
+
+ if (node && d->val.primitive)
+ {
+- int i, n, c;
++ size_t n;
++ int i, c;
+ char *p;
+
+ if (!buf || buflen < d->val.length)
+ {
+ xfree (buf);
+ buflen = d->val.length + 100;
+- buf = xtrymalloc (buflen);
+- if (!buf)
+- err = gpg_error (GPG_ERR_ENOMEM);
++ if (buflen < d->val.length)
++ err = gpg_error (GPG_ERR_BAD_BER); /* Overflow */
++ else
++ {
++ buf = xtrymalloc (buflen);
++ if (!buf)
++ err = gpg_error_from_syserror ();
++ }
+ }
+
+ for (n=0; !err && n < d->val.length; n++)
+@@ -1171,8 +1196,6 @@ _ksba_ber_decoder_decode (BerDecoder d, const char
*start_name,
+
+ while (!(err = decoder_next (d)))
+ {
+- int n, c;
+-
+ node = d->val.node;
+ /* Fixme: USE_IMAGE is only not used with the ber-dump utility
+ and thus of no big use. We should remove the other code
+@@ -1188,7 +1211,7 @@ _ksba_ber_decoder_decode (BerDecoder d, const char
*start_name,
+ if (node->type == TYPE_ANY)
+ node->actual_type = d->val.tag;
+ }
+- if (d->image.used + d->val.length > d->image.length)
++ if (sum_a1_a2_gt_b (d->image.used, d->val.length, d->image.length))
+ err = set_error(d, NULL, "TLV length too large");
+ else if (d->val.primitive)
+ {
+@@ -1196,18 +1219,32 @@ _ksba_ber_decoder_decode (BerDecoder d, const char
*start_name,
+ d->image.buf + d->image.used, d->val.length))
+ err = eof_or_error (d, 1);
+ else
+- d->image.used += d->val.length;
++ {
++ size_t sum = d->image.used + d->val.length;
++ if (sum < d->image.used)
++ err = gpg_error (GPG_ERR_BAD_BER);
++ else
++ d->image.used = sum;
++ }
+ }
+ }
+ else if (node && d->val.primitive)
+ {
++ size_t n;
++ int c;
++
+ if (!buf || buflen < d->val.length)
+ {
+ xfree (buf);
+ buflen = d->val.length + 100;
+- buf = xtrymalloc (buflen);
+- if (!buf)
+- err = gpg_error (GPG_ERR_ENOMEM);
++ if (buflen < d->val.length)
++ err = gpg_error (GPG_ERR_BAD_BER);
++ else
++ {
++ buf = xtrymalloc (buflen);
++ if (!buf)
++ err = gpg_error_from_syserror ();
++ }
+ }
+
+ for (n=0; !err && n < d->val.length; n++)
+--
+2.8.1
+
diff -Nru
libksba-1.3.2/debian/patches/Fix-possible-read-access-beyond-the-buffer.patch
libksba-1.3.2/debian/patches/Fix-possible-read-access-beyond-the-buffer.patch
---
libksba-1.3.2/debian/patches/Fix-possible-read-access-beyond-the-buffer.patch
1970-01-01 01:00:00.000000000 +0100
+++
libksba-1.3.2/debian/patches/Fix-possible-read-access-beyond-the-buffer.patch
2016-05-16 17:18:48.000000000 +0200
@@ -0,0 +1,125 @@
+From a7eed17a0b2a1c09ef986f3b4b323cd31cea2b64 Mon Sep 17 00:00:00 2001
+From: Werner Koch <w...@gnupg.org>
+Date: Tue, 3 May 2016 14:10:04 +0200
+Subject: [PATCH] Fix possible read access beyond the buffer.
+
+* src/ber-help.c (_ksba_ber_parse_tl): Add extra sanity check.
+* src/cert.c (ksba_cert_get_cert_policies): Check TLV given length
+against buffer length.
+(ksba_cert_get_ext_key_usages): Ditto.
+* src/ocsp.c (parse_asntime_into_isotime): Ditto.
+--
+
+The returned length of the object from _ksba_ber_parse_tl (ti.length)
+was not always checked against the actual buffer length, thus leading
+to a read access after the end of the buffer and thus a segv.
+
+GnuPG-bug-id: 2344
+Reported-by: Pascal Cuoq
+Signed-off-by: Werner Koch <w...@gnupg.org>
+---
+ src/ber-help.c | 6 ++++++
+ src/cert.c | 23 ++++++++++++++++++++++-
+ src/name.c | 2 +-
+ src/ocsp.c | 2 ++
+ 4 files changed, 31 insertions(+), 2 deletions(-)
+
+diff --git a/src/ber-help.c b/src/ber-help.c
+index f6a6692..87109f3 100644
+--- a/src/ber-help.c
++++ b/src/ber-help.c
+@@ -285,9 +285,15 @@ _ksba_ber_parse_tl (unsigned char const **buffer, size_t
*size,
+ ti->buf[ti->nhdr++] = c;
+ len |= c & 0xff;
+ }
++ /* Sanity check for the length: This is done so that we can take
++ * the value for malloc plus some additional bytes without
++ * risking an overflow. */
++ if (len > (1 << 30))
++ return gpg_error (GPG_ERR_BAD_BER);
+ ti->length = len;
+ }
+
++
+ /* Without this kludge some example certs can't be parsed */
+ if (ti->class == CLASS_UNIVERSAL && !ti->tag)
+ ti->length = 0;
+diff --git a/src/cert.c b/src/cert.c
+index 7f19dc1..f3ff6a1 100644
+--- a/src/cert.c
++++ b/src/cert.c
+@@ -1335,9 +1335,15 @@ ksba_cert_get_cert_policies (ksba_cert_t cert, char
**r_policies)
+ err = gpg_error (GPG_ERR_NOT_DER_ENCODED);
+ goto leave;
+ }
++ if (ti.length > derlen)
++ {
++ err = gpg_error (GPG_ERR_BAD_BER);
++ goto leave;
++ }
+ if (!ti.length)
+ {
+- err = gpg_error (GPG_ERR_INV_CERT_OBJ); /* no empty inner
SEQ */
++ /* We do not accept an empty inner SEQ */
++ err = gpg_error (GPG_ERR_INV_CERT_OBJ);
+ goto leave;
+ }
+ if (ti.nhdr+ti.length > seqlen)
+@@ -1356,6 +1362,11 @@ ksba_cert_get_cert_policies (ksba_cert_t cert, char
**r_policies)
+ err = gpg_error (GPG_ERR_INV_CERT_OBJ);
+ goto leave;
+ }
++ if (ti.length > derlen)
++ {
++ err = gpg_error (GPG_ERR_BAD_BER);
++ goto leave;
++ }
+ if (ti.nhdr+ti.length > seqseqlen)
+ {
+ err = gpg_error (GPG_ERR_BAD_BER);
+@@ -1458,6 +1469,16 @@ ksba_cert_get_ext_key_usages (ksba_cert_t cert, char
**result)
+ err = gpg_error (GPG_ERR_INV_CERT_OBJ);
+ goto leave;
+ }
++ if (ti.ndef)
++ {
++ err = gpg_error (GPG_ERR_NOT_DER_ENCODED);
++ goto leave;
++ }
++ if (ti.length > derlen)
++ {
++ err = gpg_error (GPG_ERR_BAD_BER);
++ goto leave;
++ }
+
+ suboid = ksba_oid_to_str (der, ti.length);
+ if (!suboid)
+diff --git a/src/name.c b/src/name.c
+index c734199..371fc41 100644
+--- a/src/name.c
++++ b/src/name.c
+@@ -113,7 +113,7 @@ _ksba_name_new_from_der (ksba_name_t *r_name,
+
+ *r_name = NULL;
+
+- /* count and check for encoding errors - we won;t do this again
++ /* Count and check for encoding errors - we won't do this again
+ during the second pass */
+ der = image;
+ derlen = imagelen;
+diff --git a/src/ocsp.c b/src/ocsp.c
+index 85679bb..c053b18 100644
+--- a/src/ocsp.c
++++ b/src/ocsp.c
+@@ -231,6 +231,8 @@ parse_asntime_into_isotime (unsigned char const **buf,
size_t *len,
+ && (ti.tag == TYPE_UTC_TIME || ti.tag == TYPE_GENERALIZED_TIME)
+ && !ti.is_constructed) )
+ err = gpg_error (GPG_ERR_INV_OBJ);
++ else if (ti.length > *len)
++ err = gpg_error (GPG_ERR_INV_BER);
+ else if (!(err = _ksba_asntime_to_iso (*buf, ti.length,
+ ti.tag == TYPE_UTC_TIME, isotime)))
+ parse_skip (buf, len, &ti);
+--
+2.8.1
+
diff -Nru libksba-1.3.2/debian/patches/series
libksba-1.3.2/debian/patches/series
--- libksba-1.3.2/debian/patches/series 1970-01-01 01:00:00.000000000 +0100
+++ libksba-1.3.2/debian/patches/series 2016-05-16 17:18:48.000000000 +0200
@@ -0,0 +1,5 @@
+Do-not-abort-on-decoder-stack-overflow.patch
+Fix-integer-overflow-in-the-BER-decoder.patch
+Fix-encoding-of-invalid-utf-8-strings-in-dn.c.patch
+Fix-an-OOB-read-access-in-_ksba_dn_to_str.patch
+Fix-possible-read-access-beyond-the-buffer.patch
--- End Message ---