keep on walking towards rc3
[gnupg.git] / doc / detached-sig-verification-bug.txt
1            False positive signature verification in GnuPG
2            ==============================================
3                        (released 2006-02-15)
4
5
6 Summary
7 =======
8
9 The Gentoo project identified a security related bug in GnuPG.  When
10 using any current version of GnuPG for unattended signature
11 verification (e.g. by scripts and mail programs), false positive
12 signature verification of detached signatures may occur.
13
14 This problem affects the tool *gpgv*, as well as using "gpg --verify"
15 to imitate gpgv, if only the exit code of the process is used to
16 decide whether a detached signature is valid.  This is a plausible
17 mode of operation for gpgv.
18
19 If, as suggested, the --status-fd generated output is used to decide
20 whether a signature is valid, no problem exists.  In particular
21 applications making use of the GPGME library[2] are not affected.
22
23 To solve this problem an update of the current stable version has been
24 released (see below).
25
26 Please do not send private mail in response to this message.  The
27 mailing list gnupg-devel is the best place to discuss this problem
28 (please subscribe first so you don't need moderator approval [1]).
29
30
31 Impact:
32 =======
33
34 Signature verification of detached signatures does not work, thus
35 modified versions of signature protected files may not be detected.
36
37 All versions of gnupg prior to 1.4.2.1 are affected if they are used
38 in certain unattended operation modes.
39
40 There is no problem using GnuPG in an interactive way because GnuPG
41 won't print any signature status at all; i.e. no "Good signature".
42
43 Scripts and applications using gpg or gpgv with the --status-fd option
44 and properly parsing this output are not affected.
45
46 Applications using the GPGME library[2] are not affected.
47
48 The GnuPG versions 1.9 are not affected unless the currently
49 deprecated gpg part has been enabled.
50
51
52 Solution:
53 =========
54
55 Update GnuPG as soon as possible to version 1.4.2.1.  There are no
56 fixes for older versions available, although the fix described below
57 may be adjusted for them.
58
59 To update please follow the instructions found at
60 http://www.gnupg.org/download/ or read on:
61
62 GnuPG 1.4.2.1 may be downloaded from one of the GnuPG mirror sites or
63 direct from ftp://ftp.gnupg.org/gcrypt/ .  The list of mirrors can be
64 found at http://www.gnupg.org/mirrors.html .  Note, that GnuPG is not
65 available at ftp.gnu.org.
66
67 On the mirrors you should find the following files in the *gnupg*
68 directory:
69
70   gnupg-1.4.2.1.tar.bz2 (2.8M)
71   gnupg-1.4.2.1.tar.bz2.sig
72
73       GnuPG source compressed using BZIP2 and OpenPGP signature.
74
75   gnupg-1.4.2.1.tar.gz (4.0M)
76   gnupg-1.4.2.1.tar.gz.sig
77
78       GnuPG source compressed using GZIP and OpenPGP signature.
79
80   gnupg-1.4.2-1.4.2.1.diff.bz2 (39k)
81
82       A patch file to upgrade a 1.4.2 GnuPG source. 
83
84 Select one of them. To shorten the download time, you probably want to
85 get the BZIP2 compressed file.  Please try another mirror if
86 exceptional your mirror is not yet up to date.
87
88 In the *binary* directory, you should find these files:
89
90   gnupg-w32cli-1.4.2.1.exe (1.4M)
91   gnupg-w32cli-1.4.2.1.exe.sig
92
93       GnuPG compiled for Microsoft Windows and OpenPGP signature.
94       Note that this is a command line version and now comes with a
95       graphical installer tool.  The source files are the same as
96       given above.  Note, that a new version of the Gpg4Win
97       package[4], including an updated version of GnuPG will be
98       available later the day.
99
100
101 In order to check that the version of GnuPG which you are going to
102 install is an original and unmodified one, you can do it in one of
103 the following ways:
104
105  * If you already have a trusted version of GnuPG installed, you
106    can simply check the supplied signature.  For example to check the
107    signature of the file gnupg-1.4.2.1.tar.bz2 you would use this command:
108
109      gpg --verify gnupg-1.4.2.1.tar.bz2.sig
110
111    This checks whether the signature file matches the source file.
112    You should see a message indicating that the signature is good and
113    made by that signing key.  Make sure that you have the right key,
114    either by checking the fingerprint of that key with other sources
115    or by checking that the key has been signed by a trustworthy other
116    key.  Note, that you can retrieve the signing key using "finger wk
117    'at' g10code.com" or "finger dd9jn 'at' gnu.org" or using the
118    keyservers.  From time to time I prolong the expiration date; thus
119    you might need a fresh copy of that key.
120
121    Never use a GnuPG version you just downloaded to check the
122    integrity of the source - use an existing GnuPG installation!
123    Watch out for a "Good signature" messages.
124
125  * If you are not able to use an old version of GnuPG, you have to
126    verify the SHA-1 checksum.  Assuming you downloaded the file
127    gnupg-1.4.2.1.tar.bz2, you would run the sha1sum command like this:
128
129      sha1sum gnupg-1.4.2.1.tar.bz2
130
131    and check that the output matches the first line from the
132    following list:
133
134 1c0306ade25154743d6f6f9ac05bee74c55c6eda  gnupg-1.4.2.1.tar.bz2
135 cefc74560f21bde74eed298d86460612cd7e12ee  gnupg-1.4.2.1.tar.gz
136 98d597b1a9871b4aadc820d8641b36ce09125612  gnupg-1.4.2-1.4.2.1.diff.bz2
137 a4db35a72d72df8e76751adc6f013b4c96112fd4  gnupg-w32cli-1.4.2.1.exe
138
139
140 Background:
141 ===========
142
143 If a file with arbitrary data, for example 64 times the character
144 0xCA, is used as the detached signature, any data file will lead to
145 gpg exiting with 0 (success).  There won't be any messages indicating
146 that the signature is valid or false:
147
148   $ fortune >x.txt
149   $ perl -e 'print "\xca"x"64"' >x.txt.sig
150   $ gpgv x.txt.sig x.txt
151   $ echo $?
152   0
153
154 Cleary this should not return success.
155
156 The same problem appears when using "gpg --verify" in place of gpgv.
157 However in this case any application should to do further checks to
158 make sure that the key verifying the signature is actually the desired
159 one, thus using "gpg --verify" without processing the --status-fd
160 generated output is in general the wrong approach.
161
162 The fixed version makes sure that gpgv and "gpg --verify" won't return
163 success if no signature has been seen.  A minimal but sufficient fix
164 against 1.4.2 and possible older versions is:
165
166 ====8<============
167 --- g10/mainproc.c      (revision 4001)
168 +++ g10/mainproc.c      (working copy)
169 @@ -77,6 +77,7 @@
170          int op;
171          int stop_now;
172      } pipemode;
173 +    int any_sig_seen;  /* Set to true if a signature packet has been seen. */
174  };
175  
176  
177 @@ -217,6 +218,7 @@
178  {
179      KBNODE node;
180  
181 +    c->any_sig_seen = 1;
182      if( pkt->pkttype == PKT_SIGNATURE && !c->list ) {
183         /* This is the first signature for the following datafile.
184          * GPG does not write such packets; instead it always uses
185 @@ -1137,6 +1139,18 @@
186      c->signed_data = signedfiles;
187      c->sigfilename = sigfilename;
188      rc = do_proc_packets( c, a );
189
190 +    /* If we have not encountered any signature we print an error
191 +       messages, send a NODATA status back and return an error code.
192 +       Using log_error is required because verify_files does not check
193 +       error codes for each file but we want to terminate the process
194 +       with an error. */ 
195 +    if (!rc && !c->any_sig_seen)
196 +      {
197 +        write_status_text (STATUS_NODATA, "4");
198 +        log_error (_("no signature found\n"));
199 +        rc = -1;
200 +      }
201      m_free( c );
202      return rc;
203  }
204 ====>8============
205
206 Note that the released version also includes a test case for this bug
207 and prints an additional diagnostic.  With the patch above the output
208 using the same test data as above should be:
209
210   $ gpgv x.txt.sig x.txt
211   gpgv: no signature found
212   gpgv: verify signatures failed: eof
213   $ echo $?
214   2
215
216
217
218 Thanks
219 ======
220
221 taviso from the Gentoo project found this vulnerability and informed
222 me on Monday evening.  Unfortunately I had already switched off my
223 monitor at that time.  The update has been released yesterday evening
224 (CET).
225
226
227
228
229 [1] http://lists.gnupg.org/mailman/listinfo/gnupg-devel
230 [2] http://www.gnupg.org/related_software/gpgme
231 [3] http://www.gpg4win.org