           False positive signature verification in GnuPG
           ==============================================
                       (released 2006-02-15)


Summary
=======

The Gentoo project identified a security related bug in GnuPG.  When
using any current version of GnuPG for unattended signature
verification (e.g. by scripts and mail programs), false positive
signature verification of detached signatures may occur.

This problem affects the tool *gpgv*, as well as using "gpg --verify"
to imitate gpgv, if only the exit code of the process is used to
decide whether a detached signature is valid.  This is a plausible
mode of operation for gpgv.

If, as suggested, the --status-fd generated output is used to decide
whether a signature is valid, no problem exists.  In particular
applications making use of the GPGME library[2] are not affected.

To solve this problem an update of the current stable version has been
released (see below).

Please do not send private mail in response to this message.  The
mailing list gnupg-devel is the best place to discuss this problem
(please subscribe first so you don't need moderator approval [1]).


Impact:
=======

Signature verification of detached signatures does not work, thus
modified versions of signature protected files may not be detected.

All versions of gnupg prior to 1.4.2.1 are affected if they are used
in certain unattended operation modes.

There is no problem using GnuPG in an interactive way because GnuPG
won't print any signature status at all; i.e. no "Good signature".

Scripts and applications using gpg or gpgv with the --status-fd option
and properly parsing this output are not affected.

Applications using the GPGME library[2] are not affected.

The GnuPG versions 1.9 are not affected unless the currently
deprecated gpg part has been enabled.


Solution:
=========

Update GnuPG as soon as possible to version 1.4.2.1.  There are no
fixes for older versions available, although the fix described below
may be adjusted for them.

To update please follow the instructions found at
http://www.gnupg.org/download/ or read on:

GnuPG 1.4.2.1 may be downloaded from one of the GnuPG mirror sites or
direct from ftp://ftp.gnupg.org/gcrypt/ .  The list of mirrors can be
found at http://www.gnupg.org/mirrors.html .  Note, that GnuPG is not
available at ftp.gnu.org.

On the mirrors you should find the following files in the *gnupg*
directory:

  gnupg-1.4.2.1.tar.bz2 (2.8M)
  gnupg-1.4.2.1.tar.bz2.sig

      GnuPG source compressed using BZIP2 and OpenPGP signature.

  gnupg-1.4.2.1.tar.gz (4.0M)
  gnupg-1.4.2.1.tar.gz.sig

      GnuPG source compressed using GZIP and OpenPGP signature.

  gnupg-1.4.2-1.4.2.1.diff.bz2 (39k)

      A patch file to upgrade a 1.4.2 GnuPG source. 

Select one of them. To shorten the download time, you probably want to
get the BZIP2 compressed file.  Please try another mirror if
exceptional your mirror is not yet up to date.

In the *binary* directory, you should find these files:

  gnupg-w32cli-1.4.2.1.exe (1.4M)
  gnupg-w32cli-1.4.2.1.exe.sig

      GnuPG compiled for Microsoft Windows and OpenPGP signature.
      Note that this is a command line version and now comes with a
      graphical installer tool.  The source files are the same as
      given above.  Note, that a new version of the Gpg4Win
      package[4], including an updated version of GnuPG will be
      available later the day.


In order to check that the version of GnuPG which you are going to
install is an original and unmodified one, you can do it in one of
the following ways:

 * If you already have a trusted version of GnuPG installed, you
   can simply check the supplied signature.  For example to check the
   signature of the file gnupg-1.4.2.1.tar.bz2 you would use this command:

     gpg --verify gnupg-1.4.2.1.tar.bz2.sig

   This checks whether the signature file matches the source file.
   You should see a message indicating that the signature is good and
   made by that signing key.  Make sure that you have the right key,
   either by checking the fingerprint of that key with other sources
   or by checking that the key has been signed by a trustworthy other
   key.  Note, that you can retrieve the signing key using "finger wk
   'at' g10code.com" or "finger dd9jn 'at' gnu.org" or using the
   keyservers.  From time to time I prolong the expiration date; thus
   you might need a fresh copy of that key.

   Never use a GnuPG version you just downloaded to check the
   integrity of the source - use an existing GnuPG installation!
   Watch out for a "Good signature" messages.

 * If you are not able to use an old version of GnuPG, you have to
   verify the SHA-1 checksum.  Assuming you downloaded the file
   gnupg-1.4.2.1.tar.bz2, you would run the sha1sum command like this:

     sha1sum gnupg-1.4.2.1.tar.bz2

   and check that the output matches the first line from the
   following list:

1c0306ade25154743d6f6f9ac05bee74c55c6eda  gnupg-1.4.2.1.tar.bz2
cefc74560f21bde74eed298d86460612cd7e12ee  gnupg-1.4.2.1.tar.gz
98d597b1a9871b4aadc820d8641b36ce09125612  gnupg-1.4.2-1.4.2.1.diff.bz2
a4db35a72d72df8e76751adc6f013b4c96112fd4  gnupg-w32cli-1.4.2.1.exe


Background:
===========

If a file with arbitrary data, for example 64 times the character
0xCA, is used as the detached signature, any data file will lead to
gpg exiting with 0 (success).  There won't be any messages indicating
that the signature is valid or false:

  $ fortune >x.txt
  $ perl -e 'print "\xca"x"64"' >x.txt.sig
  $ gpgv x.txt.sig x.txt
  $ echo $?
  0

Cleary this should not return success.

The same problem appears when using "gpg --verify" in place of gpgv.
However in this case any application should to do further checks to
make sure that the key verifying the signature is actually the desired
one, thus using "gpg --verify" without processing the --status-fd
generated output is in general the wrong approach.

The fixed version makes sure that gpgv and "gpg --verify" won't return
success if no signature has been seen.  A minimal but sufficient fix
against 1.4.2 and possible older versions is:

====8<============
--- g10/mainproc.c	(revision 4001)
+++ g10/mainproc.c	(working copy)
@@ -77,6 +77,7 @@
         int op;
         int stop_now;
     } pipemode;
+    int any_sig_seen;  /* Set to true if a signature packet has been seen. */
 };
 
 
@@ -217,6 +218,7 @@
 {
     KBNODE node;
 
+    c->any_sig_seen = 1;
     if( pkt->pkttype == PKT_SIGNATURE && !c->list ) {
 	/* This is the first signature for the following datafile.
 	 * GPG does not write such packets; instead it always uses
@@ -1137,6 +1139,18 @@
     c->signed_data = signedfiles;
     c->sigfilename = sigfilename;
     rc = do_proc_packets( c, a );
+ 
+    /* If we have not encountered any signature we print an error
+       messages, send a NODATA status back and return an error code.
+       Using log_error is required because verify_files does not check
+       error codes for each file but we want to terminate the process
+       with an error. */ 
+    if (!rc && !c->any_sig_seen)
+      {
+ 	 write_status_text (STATUS_NODATA, "4");
+        log_error (_("no signature found\n"));
+        rc = -1;
+      }
     m_free( c );
     return rc;
 }
====>8============

Note that the released version also includes a test case for this bug
and prints an additional diagnostic.  With the patch above the output
using the same test data as above should be:

  $ gpgv x.txt.sig x.txt
  gpgv: no signature found
  gpgv: verify signatures failed: eof
  $ echo $?
  2



Thanks
======

taviso from the Gentoo project found this vulnerability and informed
me on Monday evening.  Unfortunately I had already switched off my
monitor at that time.  The update has been released yesterday evening
(CET).




[1] http://lists.gnupg.org/mailman/listinfo/gnupg-devel
[2] http://www.gnupg.org/related_software/gpgme
[3] http://www.gpg4win.org
