]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2112. [security] Warn if weak RSA exponent is used. [RT #16460]
authorMark Andrews <marka@isc.org>
Thu, 7 Dec 2006 05:25:03 +0000 (05:25 +0000)
committerMark Andrews <marka@isc.org>
Thu, 7 Dec 2006 05:25:03 +0000 (05:25 +0000)
CHANGES
bin/named/server.c
lib/dns/zone.c

diff --git a/CHANGES b/CHANGES
index 0a7be546838157bb1fafa10ec920cf0f5d80d5ae..f31a1d463a894ff552deb8bd21b98e173df9a838 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+2112.  [security]      Warn if weak RSA exponent is used. [RT #16460]
+
 2111.  [bug]           Fix a number of errors reported by Coverity.
                        [RT #16507]
 
index 737afbcf40535329a374eb7f51a4b5ca6b428b0f..59afab87586930a8c497f71d997d1a6d202967c9 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: server.c,v 1.339.2.37 2006/03/01 01:34:05 marka Exp $ */
+/* $Id: server.c,v 1.339.2.38 2006/12/07 05:25:03 marka Exp $ */
 
 #include <config.h>
 
@@ -239,6 +239,12 @@ configure_view_dnsseckey(const cfg_obj_t *vconfig, const cfg_obj_t *key,
        keystruct.datalen = r.length;
        keystruct.data = r.base;
 
+       if (keystruct.algorithm == DST_ALG_RSAMD5 &&
+           r.length > 1 && r.base[0] == 1 && r.base[1] == 3)
+               cfg_obj_log(key, ns_g_lctx, ISC_LOG_WARNING,
+                           "trusted key '%s' has a weak exponent",
+                           keynamestr);
+
        CHECK(dns_rdata_fromstruct(NULL,
                                   keystruct.common.rdclass,
                                   keystruct.common.rdtype,
index cee46e1525acc43a393da59d8bcfd682fb00ab93..dce4c71c95bbc1c6e0440d02146f2b7ac6234458 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: zone.c,v 1.333.2.44 2006/05/18 02:30:20 marka Exp $ */
+/* $Id: zone.c,v 1.333.2.45 2006/12/07 05:25:03 marka Exp $ */
 
 #include <config.h>
 
@@ -1158,6 +1158,59 @@ zone_startload(dns_db_t *db, dns_zone_t *zone, isc_time_t loadtime) {
        return (result);
 }
 
+/*
+ * OpenSSL verification of RSA keys with exponent 3 is known to be
+ * broken prior OpenSSL 0.9.8c/0.9.7k.  Look for such keys and warn
+ * if they are in use.
+ */
+static void
+zone_check_keys(dns_zone_t *zone, dns_db_t *db) {
+       dns_dbnode_t *node = NULL;
+       dns_dbversion_t *version = NULL;
+       dns_rdata_key_t key;
+       dns_rdata_t rdata = DNS_RDATA_INIT;
+       dns_rdataset_t rdataset;
+       isc_result_t result;
+
+       result = dns_db_findnode(db, &zone->origin, ISC_FALSE, &node);
+       if (result != ISC_R_SUCCESS)
+               goto cleanup;
+
+       dns_db_currentversion(db, &version);
+       dns_rdataset_init(&rdataset);
+       result = dns_db_findrdataset(db, node, version, dns_rdatatype_key,
+                                    dns_rdatatype_none, 0, &rdataset, NULL);
+       if (result != ISC_R_SUCCESS)
+               goto cleanup;
+
+       for (result = dns_rdataset_first(&rdataset);
+            result == ISC_R_SUCCESS;
+            result = dns_rdataset_next(&rdataset)) 
+       {
+               dns_rdataset_current(&rdataset, &rdata);
+               result = dns_rdata_tostruct(&rdata, &key, NULL);
+               INSIST(result == ISC_R_SUCCESS);
+               
+               if (key.algorithm == DST_ALG_RSAMD5 && key.datalen > 1 &&
+                   key.data[0] == 1 && key.data[1] == 3)
+               {
+                       dns_zone_log(zone, ISC_LOG_WARNING,
+                                    "weak RSAMD5 (%u) key found "
+                                    "(exponent=3)", key.algorithm);
+                       break;
+               }
+               dns_rdata_reset(&rdata);
+       }
+       dns_rdataset_disassociate(&rdataset);
+
+ cleanup:
+       if (node != NULL)
+               dns_db_detachnode(db, &node);
+       if (version != NULL)
+               dns_db_closeversion(db, &version, ISC_FALSE);
+       
+}
+
 static isc_result_t
 zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
              isc_result_t result)
@@ -1322,6 +1375,12 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
        }
 
 
+       /*
+        * Check for weak KEY's.
+        */
+       if (zone->type == dns_zone_master)
+               zone_check_keys(zone, db);
+
 #if 0
        /* destroy notification example. */
        {
@@ -3736,7 +3795,7 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) {
                        char namebuf[DNS_NAME_FORMATSIZE];
                        dns_name_format(keyname, namebuf, sizeof(namebuf));
                        dns_zone_log(zone, ISC_LOG_ERROR,
-                                    "unable to find key: %s", namebuf);
+                                    "unable to find key: %s", namebuf);
                }
        }
        if (key == NULL)
@@ -3789,7 +3848,7 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) {
        if (message != NULL)
                dns_message_destroy(&message);
   unlock:
-        if (key != NULL)
+       if (key != NULL)
                dns_tsigkey_detach(&key);
        UNLOCK_ZONE(zone);
        return;