aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2014-07-21 11:50:36 +0000
committerWerner Koch <[email protected]>2014-07-21 11:50:36 +0000
commitbab9cdd971f35ff47e153c00034c95e7ffeaa09a (patch)
tree8d9f2cbea143b478f25e457fd16dfda853dabc72
parentPost beta release update (diff)
downloadgnupg-bab9cdd971f35ff47e153c00034c95e7ffeaa09a.tar.gz
gnupg-bab9cdd971f35ff47e153c00034c95e7ffeaa09a.zip
gpg: Cap size of attribute packets at 16MB.
* g10/parse-packet.c (parse_attribute): Avoid xmalloc failure and cap size of packet. -- Tavis Ormandy reported a fatal error for attribute packets with a zero length payload. This is due to a check in Libgcrypt's xmalloc which rejects a malloc(0) instead of silently allocating 1 byte. The fix is obvious. In addition we cap the size of attribute packets similar to what we do with user id packets. OpenPGP keys are not the proper way to store movies.
-rw-r--r--g10/parse-packet.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/g10/parse-packet.c b/g10/parse-packet.c
index 28f9016b9..b967df5c3 100644
--- a/g10/parse-packet.c
+++ b/g10/parse-packet.c
@@ -2478,11 +2478,23 @@ parse_attribute (IOBUF inp, int pkttype, unsigned long pktlen,
(void) pkttype;
+ /* We better cap the size of an attribute packet to make DoS not too
+ easy. 16MB should be more then enough for one attribute packet
+ (ie. a photo). */
+ if (pktlen > 16*1024*1024)
+ {
+ log_error ("packet(%d) too large\n", pkttype);
+ if (list_mode)
+ es_fprintf (listfp, ":attribute packet: [too large]\n");
+ iobuf_skip_rest (inp, pktlen, 0);
+ return G10ERR_INVALID_PACKET;
+ }
+
#define EXTRA_UID_NAME_SPACE 71
packet->pkt.user_id = xmalloc_clear (sizeof *packet->pkt.user_id
+ EXTRA_UID_NAME_SPACE);
packet->pkt.user_id->ref = 1;
- packet->pkt.user_id->attrib_data = xmalloc (pktlen);
+ packet->pkt.user_id->attrib_data = xmalloc (pktlen? pktlen:1);
packet->pkt.user_id->attrib_len = pktlen;
p = packet->pkt.user_id->attrib_data;