Description
Improper Neutralization of CRLF Sequences in HTTP Headers ('HTTP Request/Response Splitting') vulnerability in ninenines cowlib allows HTTP response splitting via non-VCHAR bytes in structured-fields string values.

cow_http_struct_hd:escape_string/2 in cowlib only escapes \ and ", passing all other bytes through verbatim. This creates an encoder/decoder asymmetry: the matching parser accepts only printable ASCII (0x20–0x7E, excluding " and \), but the encoder emits any byte including CR and LF. An application that builds a structured HTTP header via cow_http_struct_hd:item/1 (or a higher-level wrapper such as cow_http_hd:wt_protocol/1) from attacker-controlled input can have \r\n injected into the serialized header value. Once on the wire, the injected CRLF terminates the current header and any following bytes are interpreted as a new header, enabling HTTP response splitting.

This issue affects cowlib from 2.9.0.
Published: 2026-06-08
Score: 6.3 Medium
EPSS: n/a
KEV: No
Impact: n/a
Action: n/a
AI Analysis

Impact

The flaw stems from cow_http_struct_hd:escape_string/2 in the cowlib library, which only escapes backslash and quote characters but passes all other byte values unchanged. This creates an asymmetry between the encoder and its parser—while the decoder accepts only printable ASCII characters, the encoder can emit any byte, including carriage return and line feed. When an application constructs a structured HTTP header using cow_http_struct_hd:item/1 or higher‑level wrappers and incorporates attacker‑controlled data, the non‑VCHAR CR or LF bytes become part of the serialized header value. Once transmitted, these injected CRLF sequences terminate the current header and treat following data as a new header, enabling response‑splitting attacks that can lead to header injection, cache poisoning or cross‑site scripting. The associated weakness is identified as CWE‑113, improper neutralization of CRLF sequences in HTTP headers.

Affected Systems

The vulnerability is present in versions of the cowlib library from 2.9.0 onward. Applications that depend on cowlib directly, or through higher‑level frameworks such as cowboy 2.16.0+ and gun 2.4.0+, are potentially exposed. Practical mitigation is available in those frameworks via configuration: cowboy can be configured with invalid_response_headers set to error_terminate, while gun offers an invalid_request_headers option that raises an exception when a header contains CR or LF. However, any user of cowlib that does not honor these options remains vulnerable.

Risk and Exploitability

With a CVSS score of 6.3, the vulnerability is considered moderate severity. EPSS data is not available, and the issue is not listed in the CISA KEV catalog, indicating that it is not a known actively exploited vulnerability at this time. The attack vector requires an attacker to influence the content of a header constructed by the application. In practice this could be exploited via crafted HTTP requests to the target service if the application forwards or incorporates untrusted input into structured HTTP headers.

Generated by OpenCVE AI on June 8, 2026 at 18:23 UTC.

Remediation

Vendor Workaround

Validate all values passed into structured-fields header builders (directly via cow_http_struct_hd:item/1 or indirectly via higher-level wrappers) before calling the encoder. Reject any value that is not from a trusted, application-controlled source or that contains CR (\r) or LF (\n) bytes. Applications using cowboy 2.16.0 or later are protected on the server side by the invalid_response_headers option (defaults to error_terminate), which rejects any outgoing response header value containing CR or LF before it reaches the wire. Applications using gun 2.4.0 or later are protected on the client side by the invalid_request_headers request option (defaults to raise), which raises an exception when an outgoing request header value contains CR or LF.


OpenCVE Recommended Actions

  • Upgrade cowlib to the latest release that contains the fix for this splitting issue.
  • Validate all header values that pass through cow_http_struct_hd:item or higher‑level wrappers; reject or sanitize any value that is not from a trusted source or that contains CR or LF characters.
  • If using cowboy, set the invalid_response_headers option to error_terminate to reject untrusted header values before they are sent to the network. If using gun, configure the invalid_request_headers option to raise an exception whenever a request header contains CR or LF.

Generated by OpenCVE AI on June 8, 2026 at 18:23 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Mon, 08 Jun 2026 19:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'no', 'Exploitation': 'none', 'Technical Impact': 'partial'}, 'version': '2.0.3'}


Mon, 08 Jun 2026 17:00:00 +0000

Type Values Removed Values Added
Description Improper Neutralization of CRLF Sequences in HTTP Headers ('HTTP Request/Response Splitting') vulnerability in ninenines cowlib allows HTTP response splitting via non-VCHAR bytes in structured-fields string values. cow_http_struct_hd:escape_string/2 in cowlib only escapes \ and ", passing all other bytes through verbatim. This creates an encoder/decoder asymmetry: the matching parser accepts only printable ASCII (0x20–0x7E, excluding " and \), but the encoder emits any byte including CR and LF. An application that builds a structured HTTP header via cow_http_struct_hd:item/1 (or a higher-level wrapper such as cow_http_hd:wt_protocol/1) from attacker-controlled input can have \r\n injected into the serialized header value. Once on the wire, the injected CRLF terminates the current header and any following bytes are interpreted as a new header, enabling HTTP response splitting. This issue affects cowlib from 2.9.0.
Title HTTP Response Splitting via Non-VCHAR Bytes in cow_http_struct_hd:escape_string/2
First Time appeared Ninenines
Ninenines cowlib
Weaknesses CWE-113
CPEs cpe:2.3:a:ninenines:cowlib:*:*:*:*:*:*:*:*
Vendors & Products Ninenines
Ninenines cowlib
References
Metrics cvssV4_0

{'score': 6.3, 'vector': 'CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:L/SA:N'}


Subscriptions

Ninenines Cowlib
cve-icon MITRE

Status: PUBLISHED

Assigner: EEF

Published:

Updated: 2026-06-08T18:38:08.160Z

Reserved: 2026-05-04T18:23:25.573Z

Link: CVE-2026-43966

cve-icon Vulnrichment

Updated: 2026-06-08T18:38:04.203Z

cve-icon NVD

Status : Received

Published: 2026-06-08T17:16:43.447

Modified: 2026-06-08T17:16:43.447

Link: CVE-2026-43966

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-06-08T19:30:06Z

Weaknesses