2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-02 15:45:25 +00:00

Fix RPZ radix tree search() for CLIENT-IP triggers (#39481)

This commit is contained in:
Mukund Sivaraman
2015-05-21 11:09:29 +05:30
parent 9208b81867
commit 705cea35a8
8 changed files with 68 additions and 4 deletions

View File

@@ -1,3 +1,8 @@
4122. [bug] The server could match a shorter prefix than what was
available in CLIENT-IP policy triggers, and so, an
unexpected action could be taken. This has been
corrected. [RT #39481]
4121. [bug] When updating a response-policy zone via AXFR, 4121. [bug] When updating a response-policy zone via AXFR,
summary data about other policy zones could fall summary data about other policy zones could fall
out of sync. Ultimately this could trigger an out of sync. Ultimately this could trigger an

View File

@@ -5166,6 +5166,7 @@ rpz_rewrite(ns_client_t *client, dns_rdatatype_t qtype,
st->m.type = DNS_RPZ_TYPE_BAD; st->m.type = DNS_RPZ_TYPE_BAD;
st->m.policy = DNS_RPZ_POLICY_MISS; st->m.policy = DNS_RPZ_POLICY_MISS;
st->m.ttl = ~0; st->m.ttl = ~0;
st->m.prefix = 0;
memset(&st->r, 0, sizeof(st->r)); memset(&st->r, 0, sizeof(st->r));
memset(&st->q, 0, sizeof(st->q)); memset(&st->q, 0, sizeof(st->q));
dns_fixedname_init(&st->_p_namef); dns_fixedname_init(&st->_p_namef);

View File

@@ -0,0 +1,6 @@
$TTL 60
@ IN SOA root.ns ns 1996072700 3600 1800 86400 60
NS ns
ns A 127.0.0.1
32.4.0.53.10.rpz-client-ip A 10.53.0.2
24.0.0.53.10.rpz-client-ip A 10.53.0.1

View File

@@ -0,0 +1,5 @@
$TTL 60
@ IN SOA root.ns ns 1996072700 3600 1800 86400 60
NS ns
ns A 127.0.0.1
24.0.0.53.10.rpz-client-ip A 10.53.0.3

View File

@@ -0,0 +1,19 @@
# common configuration
include "named.conf.header";
view "recursive" {
zone "." {
type hint;
file "root.hint";
};
# policy configuration to be tested
response-policy {
zone "clientip1";
zone "clientip2";
} qname-wait-recurse no;
# policy zones to be tested
zone "clientip1" { type master; file "db.clientip1"; };
zone "clientip2" { type master; file "db.clientip2"; };
};

View File

@@ -231,4 +231,18 @@ for n in 1 2 3 4 5 6 7 8 9; do
} }
done done
# Check CLIENT-IP behavior
t=`expr $t + 1`
echo "I:testing CLIENT-IP behavior (${t})"
run_server clientip
$DIG $DIGOPTS l2.l1.l0 a @10.53.0.2 -p 5300 -b 10.53.0.4 > dig.out.${t}
grep "status: NOERROR" dig.out.${t} > /dev/null 2>&1 || {
echo "I:test $t failed: query failed"
status=1
}
grep "^l2.l1.l0.[[:space:]]*[0-9]*[[:space:]]*IN[[:space:]]*A[[:space:]]*10.53.0.2" dig.out.${t} > /dev/null 2>&1 || {
echo "I:test $t failed: didn't get expected answer"
status=1
}
exit $status exit $status

View File

@@ -652,6 +652,14 @@
[RT #39567] [RT #39567]
</para> </para>
</listitem> </listitem>
<listitem>
<para>
The server could match a shorter prefix than what was
available in CLIENT-IP policy triggers, and so, an
unexpected action could be taken. This has been
corrected. [RT #39481]
</para>
</listitem>
</itemizedlist> </itemizedlist>
</itemizedlist> </itemizedlist>
</sect2> </sect2>

View File

@@ -827,7 +827,7 @@ name2ipkey(int log_level,
if (--ip_labels == 4 && !strchr(cp, 'z')) { if (--ip_labels == 4 && !strchr(cp, 'z')) {
/* /*
* Convert an IPv4 address * Convert an IPv4 address
* from the form "prefix.w.z.y.x" * from the form "prefix.z.y.x.w"
*/ */
if (prefix_num > 32U) { if (prefix_num > 32U) {
badname(log_level, src_name, badname(log_level, src_name,
@@ -911,6 +911,12 @@ name2ipkey(int log_level,
prefix += DNS_RPZ_CIDR_WORD_BITS; prefix += DNS_RPZ_CIDR_WORD_BITS;
} }
/*
* XXXMUKS: Should the following check be enabled in a
* production build? It can be expensive for large IP zones
* from 3rd parties.
*/
/* /*
* Convert the address back to a canonical domain name * Convert the address back to a canonical domain name
* to ensure that the original name is in canonical form. * to ensure that the original name is in canonical form.
@@ -1093,7 +1099,7 @@ search(dns_rpz_zones_t *rpzs,
child->set.ip |= tgt_set->ip; child->set.ip |= tgt_set->ip;
child->set.nsip |= tgt_set->nsip; child->set.nsip |= tgt_set->nsip;
set_sum_pair(child); set_sum_pair(child);
*found = cur; *found = child;
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);
} }
@@ -1186,8 +1192,8 @@ search(dns_rpz_zones_t *rpzs,
*/ */
find_result = DNS_R_PARTIALMATCH; find_result = DNS_R_PARTIALMATCH;
*found = cur; *found = cur;
set.client_ip = trim_zbits(set.ip, set.client_ip = trim_zbits(set.client_ip,
cur->set.client_ip); cur->set.client_ip);
set.ip = trim_zbits(set.ip, set.ip = trim_zbits(set.ip,
cur->set.ip); cur->set.ip);
set.nsip = trim_zbits(set.nsip, set.nsip = trim_zbits(set.nsip,