Mar 6, 2026·5 min read·36 visits
CoreDNS < 1.14.2 evaluates ACLs before rewriting query names. Attackers can query an allowed domain that rewrites to a restricted internal domain, bypassing security controls.
A logical vulnerability in CoreDNS versions prior to 1.14.2 allows attackers to bypass access control lists (ACLs) via a Time-of-Check Time-of-Use (TOCTOU) flaw. The default plugin execution order processes security enforcement plugins (such as `acl`, `firewall`, and `opa`) before the `rewrite` plugin. Consequently, an attacker can query a permitted domain name that is subsequently rewritten to a restricted internal domain, bypassing the intended security policies and resolving the restricted target.
CoreDNS is a modular DNS server widely used in cloud-native environments, particularly Kubernetes, where it serves as the cluster DNS provider. Its architecture relies on a chain of plugins (middleware) to process DNS queries sequentially. Each plugin inspects, modifies, or answers the query before passing it to the next plugin in the chain. The execution order is statically defined at compile time via a plugin.cfg file.
In versions prior to 1.14.2, the default configuration placed security enforcement plugins—specifically acl, firewall, and opa—earlier in the execution chain than the rewrite plugin. This ordering created a logical flaw: the authorization decision was based on the initial query name (Time-of-Check), while the actual resolution occurred on a modified query name (Time-of-Use) after the rewrite plugin had altered the request.
This discrepancy allows an attacker to exploit the rewrite rules to access restricted records. By crafting a DNS query for a domain that is permitted by the ACL but explicitly rewritten to a restricted domain (e.g., an internal service or sensitive infrastructure), the attacker can successfully resolve the restricted target, effectively bypassing the access control layer.
The root cause is a Time-of-Check Time-of-Use (TOCTOU) race condition (CWE-367) inherent in the static plugin ordering defined in plugin.cfg. In CoreDNS, the order of lines in plugin.cfg dictates the order of Handler registration in the compiled binary. The vulnerable configuration prioritized acl over rewrite.
The processing pipeline functioned as follows:
acl plugin receives the dns.Msg structure. It inspects the Question section (QNAME) against its configured rules. If the QNAME matches an allow list (or fails to match a block list), the plugin calls next.ServeDNS() to pass control down the chain.rewrite plugin receives the request. It matches the QNAME against rewrite rules. If a match is found, it modifies the QNAME in place within the dns.Msg structure (e.g., changing public-proxy.example.com to admin-panel.internal).kubernetes, etcd, or file) receive the modified request. They resolve the new QNAME (admin-panel.internal) and return the IP address.Because the acl plugin does not re-verify the request after it returns from the chain (or before the backend resolves it), the security context established at step 1 is invalid for the parameters used at step 3. The system effectively authorizes the alias but resolves the target.
The vulnerability is not a syntax error in Go code but a semantic error in the build configuration plugin.cfg. Below is a conceptual comparison of the vulnerable vs. fixed execution order.
Vulnerable Configuration (Conceptual)
The acl plugin runs before rewrite. The query passes the security check before it is transformed.
# plugin.cfg (Vulnerable)
# Security plugins execute first
acl:acl
firewall:firewall
# ... intermediary plugins ...
# Mutation plugins execute later
rewrite:rewrite
# Backend resolution
kubernetes:kubernetes
file:fileFixed Configuration (CoreDNS v1.14.2)
The fix involves moving rewrite (and other normalization plugins like template) before the security plugins. This ensures that the ACL checks are applied to the final, normalized state of the query.
# plugin.cfg (Fixed)
# Mutation/Normalization executes first
rewrite:rewrite
# Security plugins execute on the transformed query
acl:acl
firewall:firewall
# Backend resolution
kubernetes:kubernetes
file:fileThis reordering ensures that if rewrite changes public.com to private.internal, the acl plugin sees private.internal and correctly blocks the request based on the policy for the internal domain.
An attacker can exploit this vulnerability in environments where CoreDNS is configured with both ACLs (to restrict access to internal names) and Rewrites (to map external aliases to internal names). Consider a Kubernetes cluster where *.internal is restricted to authorized pods, but proxy.example.com is publicly resolvable and rewrites to db.internal.
Attack Steps:
DIG @target-server proxy.example.comproxy.example.com. The ACL allows this public domain. Code: Allowed.proxy.example.com → db.internal.kubernetes plugin looks up db.internal and finds the ClusterIP 10.96.0.50.The impact of this vulnerability is significant in multi-tenant or segmented network environments utilizing CoreDNS for service discovery.
Security Implications:
admin.* services), this bypass renders those controls ineffective against aliased domains.Severity Metrics:
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
CoreDNS CoreDNS | < 1.14.2 | 1.14.2 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-367 (TOCTOU) |
| Attack Vector | Network |
| CVSS v3.1 | 7.7 (High) |
| Impact | ACL Bypass / Information Disclosure |
| Exploit Status | No Active Exploitation |
| Fixed Version | 1.14.2 |
A CSV Formula Injection vulnerability (CWE-1236) exists in the Spree headless eCommerce platform within the customer export functionality. An unauthenticated attacker can register a customer profile containing malicious formula sequences in fields like the first name or last name. When an administrator exports the customer data to a CSV file and opens it in a spreadsheet application, the spreadsheet engine can interpret and execute these formulas, potentially leading to remote command execution on the administrator's workstation or out-of-band data exfiltration.
A Stored Cross-Site Scripting (XSS) vulnerability exists in WWBN AVideo versions up to and including 29.0. Unsanitized category descriptions are stored in the database and subsequently rendered as raw HTML in the Gallery view plugin, allowing low-privileged authenticated users to execute arbitrary JavaScript in the browsers of visiting users.
A critical supply chain compromise was identified in the Node.js package @cap-js/openapi at version 1.4.1. An attacker gained unauthorized publishing access to the npm registry and distributed a backdoored release that harvests sensitive developer credentials, environment variables, and SSH keys. The malicious code then exfiltrates the collected data to external actor-controlled servers.
An authenticated wallet credit bypass vulnerability exists in WWBN AVideo version 29.0 and earlier. The AuthorizeNet plugin includes an unfinished mockup endpoint, processPayment.json.php, which lacks actual transaction verification and hardcodes success. This allows any authenticated user to credit their wallet with arbitrary balances without making any payments.
An unauthenticated stored DOM-based Cross-Site Scripting (DOM XSS) vulnerability in the YPTSocket plugin of WWBN AVideo (formerly YouPHPTube) allows remote attackers to execute arbitrary JavaScript within the session context of administrative users. Unsanitized metadata parameters supplied during the WebSocket handshake are persisted in an SQLite database and broadcast to connected users. The frontend application processes these parameters through an unsafe jQuery append sink, leading to silent, high-impact administrative context compromise.
A path parsing and normalization inconsistency vulnerability exists in the Hono web framework prior to version 4.12.21. When hosting sub-applications via the app.mount() routing interface, Hono calculates the routing path prefix length on a percent-decoded representation of the URI but executes the path-slicing offset on the raw, percent-encoded string. This discrepancy results in malformed request paths being dispatched to mounted sub-applications, potentially leading to route bypasses, route confusion, and application-level Denial of Service.