aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2013-10-04 11:44:39 +0000
committerWerner Koch <[email protected]>2013-10-04 18:58:51 +0000
commitd74dd36c11f1643bd92efb50714e2448cdb885d0 (patch)
tree4d595ce20884023247e04aad5a29d63d990b4adf
parentgpg: Allow setting of all zero key flags (diff)
downloadgnupg-d74dd36c11f1643bd92efb50714e2448cdb885d0.tar.gz
gnupg-d74dd36c11f1643bd92efb50714e2448cdb885d0.zip
gpg: Protect against rogue keyservers sending secret keys.
* g10/options.h (IMPORT_NO_SECKEY): New. * g10/keyserver.c (keyserver_spawn, keyserver_import_cert): Set new flag. * g10/import.c (import_secret_one): Deny import if flag is set. -- By modifying a keyserver or a DNS record to send a secret key, an attacker could trick a user into signing using a different key and user id. The trust model should protect against such rogue keys but we better make sure that secret keys are never received from remote sources. Suggested-by: Stefan Tomanek Signed-off-by: Werner Koch <[email protected]> (cherry picked from commit e7abed3448c1c1a4e756c12f95b665b517d22ebe) Resolved conflicts: g10/options.h
-rw-r--r--g10/import.c6
-rw-r--r--g10/keyserver.c15
-rw-r--r--g10/options.h7
3 files changed, 20 insertions, 8 deletions
diff --git a/g10/import.c b/g10/import.c
index 90fc2d678..441dcca9d 100644
--- a/g10/import.c
+++ b/g10/import.c
@@ -1175,6 +1175,12 @@ import_secret_one( const char *fname, KBNODE keyblock,
}
stats->secret_read++;
+ if ((options & IMPORT_NO_SECKEY))
+ {
+ log_error (_("importing secret keys not allowed\n"));
+ return 0;
+ }
+
if( !uidnode )
{
log_error( _("key %s: no user ID\n"), keystr_from_sk(sk));
diff --git a/g10/keyserver.c b/g10/keyserver.c
index 1eadff19f..7bf983064 100644
--- a/g10/keyserver.c
+++ b/g10/keyserver.c
@@ -1503,10 +1503,14 @@ keyserver_spawn(enum ks_action action,STRLIST list,KEYDB_SEARCH_DESC *desc,
It's harmless to ignore them, but ignoring them does make
gpg complain about "no valid OpenPGP data found". One
way to do this could be to continue parsing this
- line-by-line and make a temp iobuf for each key. */
+ line-by-line and make a temp iobuf for each key. Note
+ that we don't allow the import of secret keys from a
+ keyserver. Keyservers should never accept or send them
+ but we better protect against rogue keyservers. */
- import_keys_stream(spawn->fromchild,stats_handle,fpr,fpr_len,
- opt.keyserver_options.import_options);
+ import_keys_stream (spawn->fromchild, stats_handle, fpr, fpr_len,
+ (opt.keyserver_options.import_options
+ | IMPORT_NO_SECKEY));
import_print_stats(stats_handle);
import_release_stats_handle(stats_handle);
@@ -2037,8 +2041,9 @@ keyserver_import_cert(const char *name,unsigned char **fpr,size_t *fpr_len)
/* CERTs are always in binary format */
opt.no_armor=1;
- rc=import_keys_stream(key,NULL,fpr,fpr_len,
- opt.keyserver_options.import_options);
+ rc=import_keys_stream (key, NULL, fpr, fpr_len,
+ (opt.keyserver_options.import_options
+ | IMPORT_NO_SECKEY));
opt.no_armor=armor_status;
diff --git a/g10/options.h b/g10/options.h
index cac1c4c2c..de4a2e2ac 100644
--- a/g10/options.h
+++ b/g10/options.h
@@ -30,7 +30,7 @@
#if defined (__riscos__) && !defined (INCLUDED_BY_MAIN_MODULE)
#define EXTERN_UNLESS_MAIN_MODULE extern
#else
-#define EXTERN_UNLESS_MAIN_MODULE
+#define EXTERN_UNLESS_MAIN_MODULE
#endif
#endif
@@ -86,7 +86,7 @@ struct
const char *homedir;
char *display; /* 5 options to be passed to the gpg-agent */
- char *ttyname;
+ char *ttyname;
char *ttytype;
char *lc_ctype;
char *lc_messages;
@@ -208,7 +208,7 @@ struct
/* If > 0, limit the number of card insertion prompts to this
value. */
- int limit_card_insert_tries;
+ int limit_card_insert_tries;
#ifdef ENABLE_CARD_SUPPORT
const char *ctapi_driver; /* Library to access the ctAPI. */
@@ -293,6 +293,7 @@ struct {
#define IMPORT_MERGE_ONLY (1<<4)
#define IMPORT_MINIMAL (1<<5)
#define IMPORT_CLEAN (1<<6)
+#define IMPORT_NO_SECKEY (1<<7)
#define EXPORT_LOCAL_SIGS (1<<0)
#define EXPORT_ATTRIBUTES (1<<1)