gpg: Cap size of attribute packets at 16MB.
authorWerner Koch <wk@gnupg.org>
Mon, 21 Jul 2014 11:50:36 +0000 (13:50 +0200)
committerWerner Koch <wk@gnupg.org>
Mon, 21 Jul 2014 12:46:41 +0000 (14:46 +0200)
* 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.

Resolved conflicts:
g10/parse-packet.c - indentation.  Use plain fprintf.

g10/parse-packet.c

index ab4655d..f1d7f71 100644 (file)
@@ -2214,11 +2214,22 @@ parse_attribute( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet )
 
     (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)
+          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;