From: Diego Fronza Date: Thu, 13 Feb 2020 23:35:25 +0000 (-0300) Subject: Add test for the proposed fix X-Git-Tag: v9.14.12~7^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=64c3c57b59670d17788191b047a561fb2397b9c4;p=thirdparty%2Fbind9.git Add test for the proposed fix 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". --- diff --git a/bin/tests/system/forward/ns4/malicious.db b/bin/tests/system/forward/ns4/malicious.db new file mode 100644 index 00000000000..f0b4b9cc6f0 --- /dev/null +++ b/bin/tests/system/forward/ns4/malicious.db @@ -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. diff --git a/bin/tests/system/forward/ns4/named.conf.in b/bin/tests/system/forward/ns4/named.conf.in index 643e1271b53..fee76b41e5d 100644 --- a/bin/tests/system/forward/ns4/named.conf.in +++ b/bin/tests/system/forward/ns4/named.conf.in @@ -55,3 +55,8 @@ zone "grafted" { forward only; forwarders { 10.53.0.2; }; }; + +zone "malicious." { + type master; + file "malicious.db"; +}; diff --git a/bin/tests/system/forward/ns5/named.conf.in b/bin/tests/system/forward/ns5/named.conf.in index f86de1a4241..6742222d4d0 100644 --- a/bin/tests/system/forward/ns5/named.conf.in +++ b/bin/tests/system/forward/ns5/named.conf.in @@ -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 index 00000000000..4741e8c4c3c --- /dev/null +++ b/bin/tests/system/forward/ns5/rebind.db @@ -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 diff --git a/bin/tests/system/forward/tests.sh b/bin/tests/system/forward/tests.sh index d76cd592173..fc3822cfb62 100644 --- a/bin/tests/system/forward/tests.sh +++ b/bin/tests/system/forward/tests.sh @@ -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