<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Thu, 01 Oct 2026 14:45:43 +0000</lastBuildDate>
    <item>
      <title>GHSA-h8mm-c463-wjq3 — CoreDNS' transfer stanza selection uses lexicographic compare (subzone ACL bypass)</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-h8mm-c463-wjq3</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Go: github.com/coredns/coredns&lt;/p&gt;
&lt;p&gt;### Summary
CoreDNS&amp;#39; transfer plugin can select the wrong ACL stanza when both a parent zone and a more-specific subzone are configured. A permissive parent-zone transfer rule can override a restrictive subzone rule (name-dependent), allowing an unauthorized client to perform AXFR/IXFR for the subzone and retrieve its zone contents.&lt;/p&gt;
&lt;p&gt;### Details
In plugin/transfer/transfer.go, stanza selection is implemented by longestMatch(), which is documented as &amp;#34;longest zone match wins&amp;#34;, but it actually chooses the winner via a lexicographic string comparison:
- zone := &amp;#34;&amp;#34; // longest zone match wins (plugin/transfer/transfer.go)
- if z &amp;gt; zone { zone = z; x = xfr } (plugin/transfer/transfer.go)&lt;/p&gt;
&lt;p&gt;So, a parent zone like example.org. can beat a child zone like a.example.org. purely due to lexicographic ordering (&amp;#34;example.org.&amp;#34; &amp;gt; &amp;#34;a.example.org.&amp;#34;), even though the child zone is the longer/more specific suffix match. The bypass is data-dependent (some child labels will win, some will lose), making it operationally non-intuitive.&lt;/p&gt;
&lt;p&gt;### PoC
1. Adjust COREDNS_BIN in the PoC to point at right path (see the top-level const definitions for tunables as well)
2. Run python3 ./acl-repro.py
3. Expected output:
*** Baseline (only subzone transfer rule) ***
axfr a.example.org.: rcode=5 ancount=0 (expected REFUSED=5)&lt;/p&gt;
&lt;p&gt;*** Candidate (add permissive parent transfer rule) ***
axfr a.example.org.: rcode=0 ancount=5 (expected NOERROR=0 with ancount&amp;gt;0)&lt;/p&gt;
&lt;p&gt;*** OK ***
Subzone transfer ACL bypass reproduced: adding a…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Go: github.com/coredns/coredns&lt;/p&gt;
&lt;p&gt;### Summary
CoreDNS&amp;#39; transfer plugin can select the wrong ACL stanza when both a parent zone and a more-specific subzone are configured. A permissive parent-zone transfer rule can override a restrictive subzone rule (name-dependent), allowing an unauthorized client to perform AXFR/IXFR for the subzone and retrieve its zone contents.&lt;/p&gt;
&lt;p&gt;### Details
In plugin/transfer/transfer.go, stanza selection is implemented by longestMatch(), which is documented as &amp;#34;longest zone match wins&amp;#34;, but it actually chooses the winner via a lexicographic string comparison:
- zone := &amp;#34;&amp;#34; // longest zone match wins (plugin/transfer/transfer.go)
- if z &amp;gt; zone { zone = z; x = xfr } (plugin/transfer/transfer.go)&lt;/p&gt;
&lt;p&gt;So, a parent zone like example.org. can beat a child zone like a.example.org. purely due to lexicographic ordering (&amp;#34;example.org.&amp;#34; &amp;gt; &amp;#34;a.example.org.&amp;#34;), even though the child zone is the longer/more specific suffix match. The bypass is data-dependent (some child labels will win, some will lose), making it operationally non-intuitive.&lt;/p&gt;
&lt;p&gt;### PoC
1. Adjust COREDNS_BIN in the PoC to point at right path (see the top-level const definitions for tunables as well)
2. Run python3 ./acl-repro.py
3. Expected output:
*** Baseline (only subzone transfer rule) ***
axfr a.example.org.: rcode=5 ancount=0 (expected REFUSED=5)&lt;/p&gt;
&lt;p&gt;*** Candidate (add permissive parent transfer rule) ***
axfr a.example.org.: rcode=0 ancount=5 (expected NOERROR=0 with ancount&amp;gt;0)&lt;/p&gt;
&lt;p&gt;*** OK ***
Subzone transfer ACL bypass reproduced: adding a…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-h8mm-c463-wjq3</guid>
    </item>
  </channel>
</rss>
