diff --git a/CHANGES b/CHANGES index 19eaa1efb4..6677d725d1 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,8 @@ +1947. [func] It is now possible to configure named to accept + expired RRSIGs. Default "dnssec-accept-expired no;". + Setting "dnssec-accept-expired yes;" leaves named + vulnerable to replay attacks. [RT #14685] + 1946. [bug] resume_dslookup() could trigger a REQUIRE failure when using forwarders. [RT #15549] diff --git a/bin/named/config.c b/bin/named/config.c index f91ed42890..0de205fe08 100644 --- a/bin/named/config.c +++ b/bin/named/config.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: config.c,v 1.62 2005/11/30 03:33:48 marka Exp $ */ +/* $Id: config.c,v 1.63 2006/01/04 02:35:49 marka Exp $ */ /*! \file */ @@ -133,6 +133,7 @@ options {\n\ acache-cleaning-interval 60;\n\ max-acache-size 0;\n\ dnssec-enable no; /* Make yes for 9.4. */ \n\ + dnssec-accept-expired no;\n\ clients-per-query 10;\n\ max-clients-per-query 100;\n\ " diff --git a/bin/named/named.conf.docbook b/bin/named/named.conf.docbook index d9d7952363..3572d2a172 100644 --- a/bin/named/named.conf.docbook +++ b/bin/named/named.conf.docbook @@ -17,7 +17,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> - + Aug 13, 2004 @@ -253,13 +253,14 @@ options { ( quoted_string port integer | ipv4_address port integer | ipv6_address port integer ); ... - } + }; edns-udp-size integer; root-delegation-only exclude { quoted_string; ... } ; disable-algorithms string { string; ... }; dnssec-enable boolean; dnssec-lookaside string trust-anchor string; dnssec-must-be-secure string boolean; + dnssec-accept-expired boolean; empty-server string; empty-contact string; @@ -399,8 +400,8 @@ view string optional_class disable-algorithms string { string; ... }; dnssec-enable boolean; dnssec-lookaside string trust-anchor string; - dnssec-must-be-secure string boolean; + dnssec-accept-expired boolean; empty-server string; empty-contact string; diff --git a/bin/named/query.c b/bin/named/query.c index d8a5f85178..6a3cc84ce4 100644 --- a/bin/named/query.c +++ b/bin/named/query.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: query.c,v 1.276 2005/11/30 03:33:48 marka Exp $ */ +/* $Id: query.c,v 1.277 2006/01/04 02:35:49 marka Exp $ */ /*! \file */ @@ -2360,13 +2360,21 @@ get_key(ns_client_t *client, dns_db_t *db, dns_rdata_rrsig_t *rrsig, static isc_boolean_t verify(dst_key_t *key, dns_name_t *name, dns_rdataset_t *rdataset, - dns_rdata_t *rdata, isc_mem_t *mctx) + dns_rdata_t *rdata, isc_mem_t *mctx, isc_boolean_t acceptexpired) { isc_result_t result; dns_fixedname_t fixed; + isc_boolean_t ignore = ISC_FALSE; + dns_fixedname_init(&fixed); - result = dns_dnssec_verify2(name, rdataset, key, ISC_FALSE, - mctx, rdata, NULL); + +again: + result = dns_dnssec_verify2(name, rdataset, key, ignore, mctx, + rdata, NULL); + if (result == DNS_R_SIGEXPIRED && acceptexpired) { + ignore = ISC_TRUE; + goto again; + } if (result == ISC_R_SUCCESS || result == DNS_R_FROMWILDCARD) return (ISC_TRUE); return (ISC_FALSE); @@ -2406,7 +2414,8 @@ validate(ns_client_t *client, dns_db_t *db, dns_name_t *name, do { if (!get_key(client, db, &rrsig, &keyrdataset, &key)) break; - if (verify(key, name, rdataset, &rdata, client->mctx)) { + if (verify(key, name, rdataset, &rdata, client->mctx, + client->view->acceptexpired)) { dst_key_free(&key); dns_rdataset_disassociate(&keyrdataset); mark_secure(client, db, name, rdataset, diff --git a/bin/named/server.c b/bin/named/server.c index 4f4eaeba3d..153886fce0 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: server.c,v 1.451 2005/11/30 03:33:48 marka Exp $ */ +/* $Id: server.c,v 1.452 2006/01/04 02:35:49 marka Exp $ */ /*! \file */ @@ -1395,6 +1395,11 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig, INSIST(result == ISC_R_SUCCESS); view->enablednssec = cfg_obj_asboolean(obj); + obj = NULL; + result = ns_config_get(maps, "dnssec-accept-expired", &obj); + INSIST(result == ISC_R_SUCCESS); + view->acceptexpired = cfg_obj_asboolean(obj); + obj = NULL; result = ns_config_get(maps, "dnssec-lookaside", &obj); if (result == ISC_R_SUCCESS) { diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml index 1f74bc6ef1..3d249e7822 100644 --- a/doc/arm/Bv9ARM-book.xml +++ b/doc/arm/Bv9ARM-book.xml @@ -18,7 +18,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> - + BIND 9 Administrator Reference Manual @@ -4389,6 +4389,7 @@ category notify { null; }; dnssec-enable yes_or_no; dnssec-lookaside domain trust-anchor domain; dnssec-must-be-secure domain yes_or_no; + dnssec-accept-expired yes_or_no; forward ( only | first ); forwarders { ip_addr port ip_port ; ... }; dual-stack-servers port ip_port { @@ -5476,6 +5477,16 @@ options { + + dnssec-accept-expired + + + When verifying DNSSEC signatures accept expired signatures. + The default is no. + + + + querylog diff --git a/lib/dns/include/dns/view.h b/lib/dns/include/dns/view.h index d967dcf995..1cdd85af61 100644 --- a/lib/dns/include/dns/view.h +++ b/lib/dns/include/dns/view.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: view.h,v 1.97 2005/09/05 00:11:04 marka Exp $ */ +/* $Id: view.h,v 1.98 2006/01/04 02:35:49 marka Exp $ */ #ifndef DNS_VIEW_H #define DNS_VIEW_H 1 @@ -112,6 +112,7 @@ struct dns_view { isc_boolean_t additionalfromauth; isc_boolean_t minimalresponses; isc_boolean_t enablednssec; + isc_boolean_t acceptexpired; dns_transfer_format_t transfer_format; dns_acl_t * queryacl; dns_acl_t * recursionacl; diff --git a/lib/dns/validator.c b/lib/dns/validator.c index 363966ec68..b8cac78e8a 100644 --- a/lib/dns/validator.c +++ b/lib/dns/validator.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.c,v 1.138 2005/12/04 23:54:00 marka Exp $ */ +/* $Id: validator.c,v 1.139 2006/01/04 02:35:49 marka Exp $ */ /*! \file */ @@ -1287,15 +1287,27 @@ verify(dns_validator_t *val, dst_key_t *key, dns_rdata_t *rdata, { isc_result_t result; dns_fixedname_t fixed; + isc_boolean_t ignore = ISC_FALSE; val->attributes |= VALATTR_TRIEDVERIFY; dns_fixedname_init(&fixed); + again: result = dns_dnssec_verify2(val->event->name, val->event->rdataset, - key, ISC_FALSE, val->view->mctx, rdata, + key, ignore, val->view->mctx, rdata, dns_fixedname_name(&fixed)); - validator_log(val, ISC_LOG_DEBUG(3), - "verify rdataset (keyid=%u): %s", - keyid, isc_result_totext(result)); + if (result == DNS_R_SIGEXPIRED && val->view->acceptexpired) { + ignore = ISC_TRUE; + goto again; + } + if (ignore && (result == ISC_R_SUCCESS || result == DNS_R_FROMWILDCARD)) + validator_log(val, ISC_LOG_INFO, + "accepted expired %sRRSIG (keyid=%u)", + (result == DNS_R_FROMWILDCARD) ? + "" : "wildcard ", keyid); + else + validator_log(val, ISC_LOG_DEBUG(3), + "verify rdataset (keyid=%u): %s", + keyid, isc_result_totext(result)); if (result == DNS_R_FROMWILDCARD) { if (!dns_name_equal(val->event->name, dns_fixedname_name(&fixed))) diff --git a/lib/dns/view.c b/lib/dns/view.c index e8e38c982a..2add9883e5 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: view.c,v 1.133 2005/09/05 00:11:02 marka Exp $ */ +/* $Id: view.c,v 1.134 2006/01/04 02:35:49 marka Exp $ */ /*! \file */ @@ -160,6 +160,7 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, view->additionalfromcache = ISC_TRUE; view->additionalfromauth = ISC_TRUE; view->enablednssec = ISC_TRUE; + view->acceptexpired = ISC_FALSE; view->minimalresponses = ISC_FALSE; view->transfer_format = dns_one_answer; view->queryacl = NULL; diff --git a/lib/isccfg/namedconf.c b/lib/isccfg/namedconf.c index c06e001c8a..1bfa8e36a5 100644 --- a/lib/isccfg/namedconf.c +++ b/lib/isccfg/namedconf.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: namedconf.c,v 1.58 2005/10/26 04:35:56 marka Exp $ */ +/* $Id: namedconf.c,v 1.59 2006/01/04 02:35:49 marka Exp $ */ /*! \file */ @@ -770,6 +770,7 @@ view_clauses[] = { { "dnssec-lookaside", &cfg_type_lookaside, CFG_CLAUSEFLAG_MULTI }, { "dnssec-must-be-secure", &cfg_type_mustbesecure, CFG_CLAUSEFLAG_MULTI }, + { "dnssec-accept-expired", &cfg_type_boolean, 0 }, { "ixfr-from-differences", &cfg_type_ixfrdifftype, 0 }, { "use-additional-cache", &cfg_type_boolean, 0 }, { "acache-cleaning-interval", &cfg_type_uint32, 0 },