]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add test for the proposed fix
authorDiego Fronza <diego@isc.org>
Thu, 13 Feb 2020 23:35:25 +0000 (20:35 -0300)
committerOndřej Surý <ondrej@isc.org>
Wed, 8 Apr 2020 07:00:16 +0000 (09:00 +0200)
This test asserts that option "deny-answer-aliases" works correctly
when forwarding requests.

As a matter of example, the behavior expected for a forwarder BIND
instance, having an option such as deny-answer-aliases { "domain"; }
is that when forwarding a request for *.anything-but-domain, it is
expected that it will return SERVFAIL if any answer received has a CNAME
for "*.domain".

bin/tests/system/forward/ns4/malicious.db [new file with mode: 0644]
bin/tests/system/forward/ns4/named.conf.in
bin/tests/system/forward/ns5/named.conf.in
bin/tests/system/forward/ns5/rebind.db [new file with mode: 0644]
bin/tests/system/forward/tests.sh

diff --git a/bin/tests/system/forward/ns4/malicious.db b/bin/tests/system/forward/ns4/malicious.db
new file mode 100644 (file)
index 0000000..f0b4b9c
--- /dev/null
@@ -0,0 +1,13 @@
+$TTL    86400
+@       IN      SOA     malicious. admin.malicious. (
+                              1         ; Serial
+                         604800         ; Refresh
+                          86400         ; Retry
+                        2419200         ; Expire
+                          86400 )       ; Negative Cache TTL
+
+@           IN    NS      ns
+
+ns          IN    A       10.53.0.4
+
+target      IN    CNAME   subdomain.rebind.
index 643e1271b53ae85e91a169413259afe84dfe1fee..fee76b41e5d46d5bfdb9fc10bd6e914436417a2b 100644 (file)
@@ -55,3 +55,8 @@ zone "grafted" {
        forward only;
        forwarders { 10.53.0.2; };
 };
+
+zone "malicious." {
+       type master;
+       file "malicious.db";
+};
index f86de1a4241220b76dca147bd814b295c75af0b9..6742222d4d088807ce1765c1073ef8ba16768d9c 100644 (file)
@@ -19,6 +19,7 @@ options {
        listen-on-v6 { none; };
        forward only;
        forwarders { 10.53.0.4; };
+       deny-answer-aliases { "rebind"; };
        dnssec-validation yes;
 };
 
@@ -26,3 +27,8 @@ zone "." {
        type hint;
        file "root.db";
 };
+
+zone "rebind" {
+       type master;
+       file "rebind.db";
+};
diff --git a/bin/tests/system/forward/ns5/rebind.db b/bin/tests/system/forward/ns5/rebind.db
new file mode 100644 (file)
index 0000000..4741e8c
--- /dev/null
@@ -0,0 +1,13 @@
+$TTL    86400
+@       IN      SOA     rebind. admin.rebind. (
+                              1         ; Serial
+                         604800         ; Refresh
+                          86400         ; Retry
+                        2419200         ; Expire
+                          86400 )       ; Negative Cache TTL
+
+@           IN    NS    ns
+
+ns          IN    A     10.53.0.5
+
+subdomain   IN    A     10.53.0.1
index d76cd592173f35774f17c4da9350da6781183b35..fc3822cfb6220628b26f5a62e2fde1ad8398d48d 100644 (file)
@@ -217,5 +217,18 @@ grep "status: NOERROR" dig.out.$n.f8 > /dev/null || ret=1
 if [ $ret != 0 ]; then echo_i "failed"; fi
 status=$((status+ret))
 
+n=$((n+1))
+echo_i "checking that rebinding protection works in forward only mode ($n)"
+ret=0
+# 10.53.0.5 will forward target.malicious. query to 10.53.0.4
+# which in turn will return a CNAME for subdomain.rebind.
+# to honor the option deny-answer-aliases { "rebind"; };
+# ns5 should return a SERVFAIL to avoid potential rebinding attacks
+dig_with_opts +noadd +noauth @10.53.0.5 target.malicious. > dig.out.$n || ret=1
+grep "status: SERVFAIL" dig.out.$n > /dev/null || ret=1
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=$((status+ret))
+
+
 echo_i "exit status: $status"
 [ $status -eq 0 ] || exit 1