]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Code to blacklist authority signing keys
authorNick Mathewson <nickm@torproject.org>
Fri, 11 Apr 2014 14:22:14 +0000 (10:22 -0400)
committerNick Mathewson <nickm@torproject.org>
Mon, 14 Apr 2014 21:57:39 +0000 (17:57 -0400)
(I need a list of actual signing keys to blacklist.)

changes/bug11464_023 [new file with mode: 0644]
src/or/networkstatus.c
src/or/routerlist.c
src/or/routerlist.h
src/or/routerparse.c

diff --git a/changes/bug11464_023 b/changes/bug11464_023
new file mode 100644 (file)
index 0000000..a9cd658
--- /dev/null
@@ -0,0 +1,5 @@
+  o Major features (security):
+    - Block every authority signing key that was used on an authority
+      vulnerable to the "heartbleed" bug in openssl (CVE-2014-0160).
+      (We don't have any evidence that these keys _were_ compromised;
+      we're doing this to be prudent.) Resolves ticket 11464.
index e780eadac70cd2e7ed0291c762b2e046b04284e4..10cc56231f10d265d1b4ec15e31ba02c9e9a3d28 100644 (file)
@@ -453,6 +453,17 @@ networkstatus_check_document_signature(const networkstatus_t *consensus,
                  DIGEST_LEN))
     return -1;
 
+  if (authority_cert_is_blacklisted(cert)) {
+    /* We implement blacklisting for authority signing keys by treating
+     * all their signatures as always bad. That way we don't get into
+     * crazy loops of dropping and re-fetching signatures. */
+    log_warn(LD_DIR, "Ignoring a consensus signature made with deprecated"
+             " signing key %s",
+             hex_str(cert->signing_key_digest, DIGEST_LEN));
+    sig->bad_signature = 1;
+    return 0;
+  }
+
   signed_digest_len = crypto_pk_keysize(cert->signing_key);
   signed_digest = tor_malloc(signed_digest_len);
   if (crypto_pk_public_checksig(cert->signing_key,
index 3c39e362df851a42a509f4405b0279d9abedda04..e993e138eb7914d3e2d29e678cbeb29a31599582 100644 (file)
@@ -458,6 +458,28 @@ authority_cert_dl_failed(const char *id_digest, int status)
   download_status_failed(&cl->dl_status, status);
 }
 
+static const char *BAD_SIGNING_KEYS[] = {
+  "----------------------------------------",
+  NULL,
+};
+
+/** DOCDOC */
+int
+authority_cert_is_blacklisted(const authority_cert_t *cert)
+{
+  char hex_digest[HEX_DIGEST_LEN+1];
+  int i;
+  base16_encode(hex_digest, sizeof(hex_digest),
+                cert->signing_key_digest, sizeof(cert->signing_key_digest));
+
+  for (i = 0; BAD_SIGNING_KEYS[i]; ++i) {
+    if (!strcasecmp(hex_digest, BAD_SIGNING_KEYS[i])) {
+      return 1;
+    }
+  }
+  return 0;
+}
+
 /** Return true iff when we've been getting enough failures when trying to
  * download the certificate with ID digest <b>id_digest</b> that we're willing
  * to start bugging the user about it. */
index 8dcc6eb026774487080ebde86fa5b8599099d25d..bd55b7b20159a6c85779d31a2cb17d96e48d7b58 100644 (file)
@@ -25,6 +25,7 @@ void authority_cert_dl_failed(const char *id_digest, int status);
 void authority_certs_fetch_missing(networkstatus_t *status, time_t now);
 int router_reload_router_list(void);
 int authority_cert_dl_looks_uncertain(const char *id_digest);
+int authority_cert_is_blacklisted(const authority_cert_t *cert);
 smartlist_t *router_get_trusted_dir_servers(void);
 
 const routerstatus_t *router_pick_directory_server(dirinfo_type_t type,
index 299d07d376b3c3b3bf346e4e94b49016507849c5..97e0bc8c85434cfea95f637080f6a8dc311b72c2 100644 (file)
@@ -3053,6 +3053,14 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out,
         log_warn(LD_DIR,"Mismatch between identities in certificate and vote");
         goto err;
       }
+      if (ns->type != NS_TYPE_CONSENSUS) {
+        if (authority_cert_is_blacklisted(ns->cert)) {
+          log_warn(LD_DIR, "Rejecting vote signature made with blacklisted "
+                   "signing key %s",
+                   hex_str(ns->cert->signing_key_digest, DIGEST_LEN));
+          goto err;
+        }
+      }
       voter->address = tor_strdup(tok->args[2]);
       if (!tor_inet_aton(tok->args[3], &in)) {
         log_warn(LD_DIR, "Error decoding IP address %s in network-status.",