Fix for Debian bug 402592
authorWerner Koch <wk@gnupg.org>
Sun, 4 Feb 2007 17:20:24 +0000 (17:20 +0000)
committerWerner Koch <wk@gnupg.org>
Sun, 4 Feb 2007 17:20:24 +0000 (17:20 +0000)
g10/ChangeLog
g10/parse-packet.c

index 44f7dbc..e9632bb 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-04  Werner Koch  <wk@g10code.com>
+
+       * parse-packet.c (parse_signature): Limit bytes read for an
+       unknown alogorithm.  Fixes Debian bug#402592.
+
 2007-02-01  David Shaw  <dshaw@jabberwocky.com>
 
        * main.h, keygen.c (ask_expire_interval, parse_expire_string):
index ed4db43..6391152 100644 (file)
 #include "main.h"
 #include "i18n.h"
 
+#ifndef MAX_EXTERN_MPI_BITS
+#define MAX_EXTERN_MPI_BITS 16384
+#endif
+
+
 static int mpi_print_mode;
 static int list_mode;
 static FILE *listfp;
@@ -1437,10 +1442,21 @@ parse_signature( IOBUF inp, int pkttype, unsigned long pktlen,
        if( list_mode )
            fprintf (listfp, "\tunknown algorithm %d\n", sig->pubkey_algo );
        unknown_pubkey_warning( sig->pubkey_algo );
-       /* we store the plain material in data[0], so that we are able
+       /* We store the plain material in data[0], so that we are able
         * to write it back with build_packet() */
-       sig->data[0]= mpi_set_opaque(NULL, read_rest(inp, pktlen, 0), pktlen );
-       pktlen = 0;
+        if (pktlen > (5 * MAX_EXTERN_MPI_BITS/8))
+          {
+            /* However we include a limit to avoid too trivial DoS
+               attacks by having gpg allocate too much memory.  */
+           log_error ("signature packet: too much data\n");
+           rc = G10ERR_INVALID_PACKET;
+          }
+        else
+          {
+            sig->data[0]= mpi_set_opaque (NULL, read_rest(inp, pktlen, 0),
+                                          pktlen );
+            pktlen = 0;
+          }
     }
     else {
        for( i=0; i < ndata; i++ ) {