]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Verify mirror zone files loaded from disk
authorMichał Kępień <michal@isc.org>
Thu, 28 Jun 2018 11:38:39 +0000 (13:38 +0200)
committerMichał Kępień <michal@isc.org>
Thu, 28 Jun 2018 11:38:39 +0000 (13:38 +0200)
Verify data read from mirror zone files before it is used in order to
prevent loading corrupt mirror zones from disk.

bin/tests/system/mirror/ns2/sign.sh
bin/tests/system/mirror/ns3/named.conf.in
bin/tests/system/mirror/setup.sh
bin/tests/system/mirror/tests.sh
lib/dns/zone.c

index b9d9c266e7dfc3d3cab3efc9cb3b1094f12831dc..77fbb3a89410799546c3c9446e0d652b34900f1d 100644 (file)
@@ -18,7 +18,7 @@ ORIGINAL_SERIAL=`awk '$2 == "SOA" {print $5}' verify.db.in`
 UPDATED_SERIAL_BAD=`expr ${ORIGINAL_SERIAL} + 1`
 UPDATED_SERIAL_GOOD=`expr ${ORIGINAL_SERIAL} + 2`
 
-for variant in axfr ixfr untrusted; do
+for variant in axfr ixfr load untrusted; do
        zone=verify-$variant
        infile=verify.db.in
        zonefile=verify-$variant.db
index 7006c4af8e72b42a154d00195ebc7ec19db022db..775a7fe6b95d6635625ff0717f718f21bb1355e4 100644 (file)
@@ -48,6 +48,14 @@ zone "verify-ixfr" {
        file "verify-ixfr.db.mirror";
 };
 
+zone "verify-load" {
+       type slave;
+       masters { 10.53.0.2; };
+       mirror yes;
+       file "verify-load.db.mirror";
+       masterfile-format text;
+};
+
 zone "verify-unsigned" {
        type slave;
        masters { 10.53.0.2; };
index 07c90da9dcd9e2d518e5fa5399a0feca11c7e6c8..9fb8063d4475b2d6fe86006d5019d17b9f781ee6 100644 (file)
@@ -22,4 +22,5 @@ copy_setports ns3/named.conf.in ns3/named.conf
 
 cat ns2/verify-axfr.db.bad.signed > ns2/verify-axfr.db.signed
 cat ns2/verify-ixfr.db.original.signed > ns2/verify-ixfr.db.signed
+cat ns2/verify-load.db.bad.signed > ns3/verify-load.db.mirror
 cat ns2/verify-untrusted.db.original.signed > ns2/verify-untrusted.db.signed
index 87d60e88f6b75f945dd7a8cdc9d4d3e135241285..e5748328d4a898889eb604cb401c30f3db322a04 100644 (file)
@@ -145,5 +145,29 @@ grep "${UPDATED_SERIAL_GOOD}.*; serial" dig.out.ns3.test$n > /dev/null || ret=1
 if [ $ret != 0 ]; then echo_i "failed"; fi
 status=`expr $status + $ret`
 
+n=`expr $n + 1`
+echo_i "checking that loading an incorrectly signed mirror zone from disk fails ($n)"
+ret=0
+nextpartreset ns3/named.run
+wait_for_load verify-load ${UPDATED_SERIAL_BAD} ns3/named.run
+$DIG $DIGOPTS @10.53.0.3 +norec verify-load SOA > dig.out.ns3.test$n 2>&1 || ret=1
+grep "${UPDATED_SERIAL_BAD}.*; serial" dig.out.ns3.test$n > /dev/null && ret=1
+nextpart ns3/named.run | grep "No correct RSASHA256 signature for verify-load SOA" > /dev/null || ret=1
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=`expr $status + $ret`
+
+n=`expr $n + 1`
+echo_i "checking that loading a correctly signed mirror zone from disk succeeds ($n)"
+ret=0
+$PERL $SYSTEMTESTTOP/stop.pl --use-rndc --port ${CONTROLPORT} . ns3
+cat ns2/verify-load.db.good.signed > ns3/verify-load.db.mirror
+nextpart ns3/named.run > /dev/null
+$PERL $SYSTEMTESTTOP/start.pl --noclean --restart --port ${PORT} . ns3
+wait_for_load verify-load ${UPDATED_SERIAL_GOOD} ns3/named.run
+$DIG $DIGOPTS @10.53.0.3 +norec verify-load SOA > dig.out.ns3.test$n 2>&1 || ret=1
+grep "${UPDATED_SERIAL_GOOD}.*; serial" dig.out.ns3.test$n > /dev/null || ret=1
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=`expr $status + $ret`
+
 echo_i "exit status: $status"
 [ $status -eq 0 ] || exit 1
index 667a83466e5a9b24ae61becd8715ed4e77d17d08..0acf2e0305cda8e14088a0fb88da2f59a4f6c7b9 100644 (file)
@@ -4609,6 +4609,11 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
                        goto cleanup;
                }
 
+               result = dns_zone_verifydb(zone, db, NULL);
+               if (result != ISC_R_SUCCESS) {
+                       goto cleanup;
+               }
+
                if (zone->db != NULL) {
                        unsigned int oldsoacount;