mirror of
https://github.com/coredns/coredns.git
synced 2025-10-28 00:34:24 -04:00
Add nameerror proof
This commit is contained in:
@@ -20,3 +20,45 @@ func (z *Zone) ClosestEncloser(rr dns.RR) string {
|
|||||||
|
|
||||||
return z.SOA.Header().Name
|
return z.SOA.Header().Name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// nameErrorProof finds the closest encloser and return an NSEC that proofs
|
||||||
|
// the wildcard does not exist and an NSEC that proofs the name does no exist.
|
||||||
|
func (z *Zone) nameErrorProof(rr dns.RR) []dns.RR {
|
||||||
|
elem := z.Tree.Prev(rr)
|
||||||
|
if elem == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
nsec := z.lookupNSEC(elem, true)
|
||||||
|
nsecIndex := 0
|
||||||
|
for i := 0; i < len(nsec); i++ {
|
||||||
|
if nsec[i].Header().Rrtype == dns.TypeNSEC {
|
||||||
|
nsecIndex = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ce := z.ClosestEncloser(rr)
|
||||||
|
wildcard := "*." + ce
|
||||||
|
rr.Header().Name = wildcard
|
||||||
|
elem = z.Tree.Prev(rr)
|
||||||
|
if elem == nil {
|
||||||
|
// Root?
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
nsec1 := z.lookupNSEC(elem, true)
|
||||||
|
nsec1Index := 0
|
||||||
|
for i := 0; i < len(nsec1); i++ {
|
||||||
|
if nsec1[i].Header().Rrtype == dns.TypeNSEC {
|
||||||
|
nsec1Index = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for duplicate NSEC.
|
||||||
|
if nsec[nsecIndex].Header().Name == nsec1[nsec1Index].Header().Name &&
|
||||||
|
nsec[nsecIndex].(*dns.NSEC).NextDomain == nsec1[nsec1Index].(*dns.NSEC).NextDomain {
|
||||||
|
return nsec
|
||||||
|
}
|
||||||
|
|
||||||
|
return append(nsec, nsec1...)
|
||||||
|
}
|
||||||
|
|||||||
@@ -64,6 +64,33 @@ var dnssecTestCases = []coretest.Case{
|
|||||||
Qname: "b.miek.nl.", Qtype: dns.TypeA, Do: true,
|
Qname: "b.miek.nl.", Qtype: dns.TypeA, Do: true,
|
||||||
Rcode: dns.RcodeNameError,
|
Rcode: dns.RcodeNameError,
|
||||||
Ns: []dns.RR{
|
Ns: []dns.RR{
|
||||||
|
coretest.NSEC("archive.miek.nl. 14400 IN NSEC go.dns.miek.nl. CNAME RRSIG NSEC"),
|
||||||
|
coretest.RRSIG("archive.miek.nl. 14400 IN RRSIG NSEC 8 3 14400 20160426031301 20160327031301 12051 miek.nl. jEpx8lcp4do5fWXg="),
|
||||||
|
coretest.NSEC("miek.nl. 14400 IN NSEC a.miek.nl. A NS SOA MX AAAA RRSIG NSEC DNSKEY"),
|
||||||
|
coretest.RRSIG("miek.nl. 14400 IN RRSIG NSEC 8 2 14400 20160426031301 20160327031301 12051 miek.nl. mFfc3r/9PSC1H6oSpdC"),
|
||||||
|
coretest.RRSIG("miek.nl. 1800 IN RRSIG SOA 8 2 1800 20160426031301 20160327031301 12051 miek.nl. FIrzy07acBbtyQczy1dc="),
|
||||||
|
coretest.SOA("miek.nl. 1800 IN SOA linode.atoom.net. miek.miek.nl. 1282630057 14400 3600 604800 14400"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Qname: "b.blaat.miek.nl.", Qtype: dns.TypeA, Do: true,
|
||||||
|
Rcode: dns.RcodeNameError,
|
||||||
|
Ns: []dns.RR{
|
||||||
|
coretest.NSEC("archive.miek.nl. 14400 IN NSEC go.dns.miek.nl. CNAME RRSIG NSEC"),
|
||||||
|
coretest.RRSIG("archive.miek.nl. 14400 IN RRSIG NSEC 8 3 14400 20160426031301 20160327031301 12051 miek.nl. jEpx8lcp4do5fWXg="),
|
||||||
|
coretest.NSEC("miek.nl. 14400 IN NSEC a.miek.nl. A NS SOA MX AAAA RRSIG NSEC DNSKEY"),
|
||||||
|
coretest.RRSIG("miek.nl. 14400 IN RRSIG NSEC 8 2 14400 20160426031301 20160327031301 12051 miek.nl. mFfc3r/9PSC1H6oSpdC"),
|
||||||
|
coretest.RRSIG("miek.nl. 1800 IN RRSIG SOA 8 2 1800 20160426031301 20160327031301 12051 miek.nl. FIrzy07acBbtyQczy1dc="),
|
||||||
|
coretest.SOA("miek.nl. 1800 IN SOA linode.atoom.net. miek.miek.nl. 1282630057 14400 3600 604800 14400"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Qname: "b.a.miek.nl.", Qtype: dns.TypeA, Do: true,
|
||||||
|
Rcode: dns.RcodeNameError,
|
||||||
|
Ns: []dns.RR{
|
||||||
|
// dedupped NSEC, because 1 nsec tells all
|
||||||
|
coretest.NSEC("a.miek.nl. 14400 IN NSEC archive.miek.nl. A AAAA RRSIG NSEC"),
|
||||||
|
coretest.RRSIG("a.miek.nl. 14400 IN RRSIG NSEC 8 3 14400 20160426031301 20160327031301 12051 miek.nl. GqnF6cut/RRGPQ1QGQE1ipmSHEao="),
|
||||||
coretest.RRSIG("miek.nl. 1800 IN RRSIG SOA 8 2 1800 20160426031301 20160327031301 12051 miek.nl. FIrzy07acBbtyQczy1dc="),
|
coretest.RRSIG("miek.nl. 1800 IN RRSIG SOA 8 2 1800 20160426031301 20160327031301 12051 miek.nl. FIrzy07acBbtyQczy1dc="),
|
||||||
coretest.SOA("miek.nl. 1800 IN SOA linode.atoom.net. miek.miek.nl. 1282630057 14400 3600 604800 14400"),
|
coretest.SOA("miek.nl. 1800 IN SOA linode.atoom.net. miek.miek.nl. 1282630057 14400 3600 604800 14400"),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -72,8 +72,7 @@ func (z *Zone) nameError(elem *tree.Elem, rr dns.RR, do bool) ([]dns.RR, []dns.R
|
|||||||
ret := []dns.RR{z.SOA}
|
ret := []dns.RR{z.SOA}
|
||||||
if do {
|
if do {
|
||||||
ret = append(ret, z.SIG...)
|
ret = append(ret, z.SIG...)
|
||||||
// Now we need two NSEC, one to deny the wildcard and one to deny the name.
|
ret = append(ret, z.nameErrorProof(rr)...)
|
||||||
// Needs closest encloser!!
|
|
||||||
}
|
}
|
||||||
return nil, ret, nil, NameError
|
return nil, ret, nil, NameError
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user