Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify endpoint reflecting request data into a header name
-
DeliveryCraft request data containing CRLF plus injected headers
-
Exploitheaders_to_array fails to strip CR/LF from name
-
ExecutionNon-validating PSGI server writes bytes to wire
-
ImpactResponse split delivers attacker-controlled headers
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization HTTP response header sanitization
|
| Exploitation Conditions | Exploitation requires two concrete conditions from the description, not raw network reachability: (1) the Dancer2 application must construct a response header NAME from request-controlled data (reflecting attacker input into the header key, not just the value), and (2) the underlying PSGI server must not validate/reject header keys, so the CRLF-bearing name is written verbatim to the wire. Affected versions are Dancer2 before 2.2.0. Because Dancer2 strips CR/LF from header values but not names, apps that only reflect data into header values are NOT affected. There is no user-interaction or authentication requirement (PR:N/UI:N), but the app-specific header-name-derivation pattern is the real limiting factor and makes default deployments generally not vulnerable. |
| Impact | All signals converge on LOW real-world priority despite the MEDIUM 6.5 CVSS. The vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N indicates remote, unauthenticated, low-complexity access, but every corroborating exploitation signal is cold: EPSS is 0.19% (9th percentile), there is no CISA KEV listing, no public exploit code is referenced, and CISA SSVC scores Exploitation=none, Automatable=no, Technical Impact=partial. The most important limiter is not in the CVSS base score at all: the flaw is only reachable when the application derives a response HEADER NAME (not merely a value) from attacker-controlled request data AND the underlying PSGI server does not validate header keys - an uncommon coding pattern. So although the base metrics read 'unauthenticated network', the true attack surface is narrow and application-specific. This is a legitimate correctness bug (CR/LF stripped from header values but not names in Dancer2::Core::Response::headers_to_array) worth patching in the normal cycle, not an emergency. No conflicting data: the CVSS, EPSS, SSVC, and absence of KEV/POC all agree this is low-urgency. |
| Exploit ScenarioDerived | A Dancer2 (<2.2.0) application reflects a piece of user-supplied request data into a response header NAME. An unauthenticated attacker supplies that data with an embedded CRLF sequence followed by attacker-chosen header lines; because headers_to_array strips CR/LF only from values, the name reaches a non-validating PSGI server intact and the injected bytes are written to the wire as separate header lines, splitting the response. No public exploit code is referenced and exploitation still depends on the app-specific header-name reflection pattern. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 22, 2026
HTTP response splitting in the Dancer2 Perl web framework before version 2.2.0 allows an attacker to inject arbitrary response headers and split an HTTP response when an application derives a response header NAME from request-controlled data: Dancer2's headers_to_array routine strips CR and LF from header values but not from names, so a crafted name reaches the PSGI server intact and, if that server does not validate header keys, the bytes following the CRLF are written to the wire as their own header line. The issue is unauthenticated and requires no user interaction (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N, 6.5 Medium), but exploitation is gated by two concrete application-specific preconditions - the app must reflect attacker input into a header key rather than a value, and the underlying PSGI server must fail to reject malformed keys - so default deployments are generally not vulnerable. No CISA KEV entry exists and no public exploit code was identified at time of analysis; EPSS is 0.19% (9th percentile) and CISA SSVC records exploitation as none and automatable exploitation as no, so all signals converge on low real-world priority despite the Medium CVSS.
RemediationAI
Vendor-released patch: upgrade Dancer2 to 2.2.0 or later (CPAN release CROMEDOME/Dancer2-2.2.0), which is the version that sanitizes header names in Dancer2::Core::Response::headers_to_array by folding linear whitespace and removing CR/LF from the header key; the change is visible in commit ff89ac12af7b8899812a79e9924dfea7a5d9833b.patch and the release notes at https://metacpan.org/release/CROMEDOME/Dancer2-2.2.0/changes, with the vendor advisory at https://seclists.org/oss-sec/2026/q3/858. Debian users on the 4 tracked releases should apply the distribution's updated Dancer2 package rather than installing the CPAN release over a system-managed module. If upgrading immediately is not possible, the most effective compensating control is application-side: never construct a response header name from request data, and if a name must be derived from input, whitelist it against a fixed set of allowed header names (rejecting anything else) or strip CR and LF from the name before passing it to the framework. Note the trade-off: aggressive stripping silently mutates names and can produce duplicate or unexpected headers, whereas a strict whitelist will reject legitimate dynamic header usage - prefer the whitelist where header names are known in advance. A second layer is to place a validating PSGI server or middleware in front of the application that rejects any response header key containing CR or LF, which neutralizes the framework bug regardless of application code; the trade-off is that this converts a silent injection into a failed response (HTTP 500) for affected code paths, so it should be paired with logging to identify applications still reflecting input into header names. Because exploitation requires the PSGI server to lack header-key validation, confirming and, if necessary, correcting that server-side behavior removes the second precondition entirely. No vendor-released patch was identified for downstream distributions at time of analysis beyond the upstream 2.2.0 release, and no public exploit code was identified, so remediation can proceed on a normal patch cadence rather than emergency footing.
Affected ProductsAI
Dancer2 for Perl, all versions before 2.2.0, as distributed on CPAN (the fixing release is CROMEDOME/Dancer2-2.2.0, documented at https://metacpan.org/release/CROMEDOME/Dancer2-2.2.0/changes). Debian tracks the package across 4 releases, meaning downstream Debian users should follow their distribution's security update rather than only the CPAN release. The problem is specific to applications that build a response header name from request data; applications that only reflect untrusted data into header values are not affected even on vulnerable versions. No CPE strings were included in the supplied intelligence, so exact package/version identifiers should be confirmed against the vendor advisory. Cross-references for this issue include the upstream GitHub issue https://github.com/PerlDancer/Dancer2/issues/1822, the fixing commit https://github.com/PerlDancer/Dancer2/commit/ff89ac12af7b8899812a79e9924dfea7a5d9833b.patch, the oss-security advisory https://seclists.org/oss-sec/2026/q3/858 (mirrored at http://www.openwall.com/lists/oss-security/2026/09/22/3), EUVD entry EUVD-2026-84257, and the NVD record https://nvd.nist.gov/vuln/detail/CVE-2026-93711. The issue was reported by CPANSec and is tagged as Information Disclosure.
Affects your stack
Find out whether the stacks and servers you run are on an affected version.
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The vulnerability is CWE-113, improper neutralization of CRLF sequences in HTTP headers (HTTP response splitting), in Dancer2's PSGI response serialization layer. Dancer2::Core::Response::headers_to_array converts response headers into the flat PSGI array form ([name, value, name, value, ...]); the pre-2.2.0 code applied a CR/LF-stripping filter to each header value but never to the corresponding header key. When an application populates a header name from request data, the attacker-controlled CRLF survives into the PSGI triplet, and any PSGI/HTTP server that does not itself validate header keys will emit the injected bytes as a new header line - enabling header injection and, depending on the server, response splitting. The upstream fix in commit ff89ac12af7b8899812a79e9924dfea7a5d9833b adds two substitutions on the key ($k): folding linear whitespace (CR/LF followed by space or tab) into a single space, and then removing any remaining CR and LF, mirroring the treatment already applied to values. The same commit also resets is_encoded(0) when content is assigned, addressing a separate content-encoding state issue, and adds t/unit/core/response.t covering encoding, Content-Length and PSGI array conversion. No CPE identifiers were supplied with this record; affected-version information is drawn from the vendor description and the Dancer2 2.2.0 change log, with EUVD-2026-84257 and a Debian tracking record (4 releases) providing additional cross-references.
Know when Perl gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N
Remote unauthenticated CRLF/response-splitting via reflected header name; low-complexity for the vulnerable app pattern, with limited confidentiality and integrity impact (header injection) and no availability effect.
Primary rating from Vendor (CPANSec).
CVSS VectorVendor: CPANSec
Lifecycle Timeline
2DescriptionCVE.org
Dancer2 versions before 2.2.0 for Perl do not strip CR and LF from response header names in headers_to_array.
The routine removes CR and LF from each header value but not from the name. A name carrying them therefore reaches the PSGI server intact. A server that does not validate keys writes it to the wire, so the bytes after the CRLF arrive as their own header line.
The application has to derive the header name from request data, not just the value.
An attacker who controls that data adds their own headers and splits the response.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Related Vulnerabilities in Dancer2 Perl Framework Multiple Vulnerabilities
View all 4The _compile function in Maketext.pm in the Locale::Maketext implementation in Perl before 5.17.7 does not properly hand
Stack-based buffer overflow in the CPerlHost::Add method in win32/perlhost.h in Perl before 5.24.3-RC1 and 5.26.x before
The VDir::MapPathA and VDir::MapPathW functions in Perl 5.22 allow remote attackers to cause a denial of service (out-of
Perl before 5.26.3 has a buffer overflow via a crafted regular expression that triggers invalid write operations. Rated
Perl before 5.26.3 and 5.28.0 before 5.28.1 has a buffer overflow via a crafted regular expression that triggers invalid
Perl before 5.26.3 has a buffer over-read via a crafted regular expression that triggers disclosure of sensitive informa
Perl might allow context-dependent attackers to bypass the taint protection mechanism in a child process via duplicate e
CPAN.pm before 2.35 does not verify TLS certificates when downloading distributions over HTTPS. Rated high severity (CVS
The XSLoader::load method in XSLoader in Perl does not properly locate .so files when called in a string eval, which mig
In Perl through 5.26.2, the Archive::Tar module allows remote attackers to bypass a directory-traversal protection mecha
Perl before 5.30.3 on 32-bit platforms allows a heap-based buffer overflow because nested regular expression quantifiers
The (1) S_reghop3, (2) S_reghop4, and (3) S_reghopmaybe3 functions in regexec.c in Perl before 5.24.0 allow context-depe
Same weakness CWE-113 – HTTP Response Splitting
View allSame technique Information Disclosure
View allVendor StatusVendor
Debian
| Release | Status | Fixed Version | Urgency |
|---|---|---|---|
| bookworm | vulnerable | 0.400001+dfsg-1 | - |
| trixie | vulnerable | 1.1.2+dfsg-1 | - |
| forky, sid | vulnerable | 2.1.0-1 | - |
| (unstable) | fixed | (unfixed) | - |
EUVD-2026-84257
GHSA-vp8p-vxw7-c877
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB