* getkey.c (get_pubkey_byname): Fix minor security problem with PKA when
authorDavid Shaw <dshaw@jabberwocky.com>
Tue, 21 Feb 2006 22:23:35 +0000 (22:23 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Tue, 21 Feb 2006 22:23:35 +0000 (22:23 +0000)
importing at -r time.  The URL in the PKA record may point to a key put in
by an attacker.  Fix is to use the fingerprint from the PKA record as the
recipient.  This ensures that the PKA record is followed.

* keyserver-internal.h, keyserver.c (keyserver_import_pka): Return the
fingerprint we requested.

g10/ChangeLog
g10/getkey.c
g10/gpgv.c
g10/keyserver-internal.h
g10/keyserver.c

index 7162a15..7ae181d 100644 (file)
@@ -1,5 +1,14 @@
 2006-02-21  David Shaw  <dshaw@jabberwocky.com>
 
+       * getkey.c (get_pubkey_byname): Fix minor security problem with
+       PKA when importing at -r time.  The URL in the PKA record may
+       point to a key put in by an attacker.  Fix is to use the
+       fingerprint from the PKA record as the recipient.  This ensures
+       that the PKA record is followed.
+
+       * keyserver-internal.h, keyserver.c (keyserver_import_pka): Return
+       the fingerprint we requested.
+
        * gpgv.c: Stub keyserver_import_ldap.
 
        * keyserver-internal.h, keyserver.c (keyserver_import_ldap):
index d247b3b..8ec1e52 100644 (file)
@@ -938,6 +938,7 @@ get_pubkey_byname (PKT_public_key *pk,
         && opt.allow_pka_lookup
         && (opt.keyserver_options.options&KEYSERVER_AUTO_PKA_RETRIEVE))
        {
+         unsigned char fpr[MAX_FINGERPRINT_LEN];
          /* If the requested name resembles a valid mailbox and
             automatic retrieval via PKA records has been enabled, we
             try to import the key via the URI and try again. */
@@ -945,13 +946,25 @@ get_pubkey_byname (PKT_public_key *pk,
          tried_pka=1;
 
          glo_ctrl.in_auto_key_retrieve++;
-         res=keyserver_import_pka(name);
+         res=keyserver_import_pka(name,fpr);
          glo_ctrl.in_auto_key_retrieve--;
 
          if(res==0)
            {
+             int i;
+             char fpr_string[2+(MAX_FINGERPRINT_LEN*2)+1];
+
              log_info(_("Automatically retrieved `%s' via %s\n"),
                       name,"PKA");
+
+             free_strlist(namelist);
+             namelist=NULL;
+
+             for(i=0;i<MAX_FINGERPRINT_LEN;i++)
+               sprintf(fpr_string+2*i,"%02X",fpr[i]);
+
+             add_to_strlist( &namelist, fpr_string );
+
              goto retry;
            }
        }
index 95bf097..2f4563e 100644 (file)
@@ -284,7 +284,7 @@ int
 keyserver_import_cert(const char *name) { return -1; }
 
 int
-keyserver_import_pka(const char *name) { return -1; }
+keyserver_import_pka(const char *name,unsigned char *fpr) { return -1; }
 
 int
 keyserver_import_name(const char *name) { return -1; }
index 48cb1ea..856f3f3 100644 (file)
@@ -42,7 +42,7 @@ int keyserver_refresh(STRLIST users);
 int keyserver_search(STRLIST tokens);
 int keyserver_fetch(STRLIST urilist);
 int keyserver_import_cert(const char *name);
-int keyserver_import_pka(const char *name);
+int keyserver_import_pka(const char *name,unsigned char *fpr);
 int keyserver_import_name(const char *name);
 int keyserver_import_ldap(const char *name);
 
index 240ea99..6eef109 100644 (file)
@@ -1979,12 +1979,11 @@ keyserver_import_cert(const char *name)
 
 /* Import key pointed to by a PKA record */
 int
-keyserver_import_pka(const char *name)
+keyserver_import_pka(const char *name,unsigned char *fpr)
 {
-  unsigned char fpr[MAX_FINGERPRINT_LEN];
   char *uri;
   int rc=-1;
-      
+
   uri = get_pka_info (name, fpr);
   if (uri)
     {