{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2026-43969", "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db", "state": "PUBLISHED", "assignerShortName": "EEF", "dateReserved": "2026-05-04T18:23:25.573Z", "datePublished": "2026-05-11T18:06:40.667Z", "dateUpdated": "2026-10-09T06:57:15.234Z" }, "containers": { "cna": { "affected": [ { "collectionURL": "https://repo.hex.pm", "cpes": [ "cpe:2.3:a:ninenines:cowlib:*:*:*:*:*:*:*:*" ], "defaultStatus": "unaffected", "modules": [ "cow_cookie" ], "packageName": "cowlib", "packageURL": "pkg:hex/cowlib", "product": "cowlib", "programFiles": [ "src/cow_cookie.erl" ], "programRoutines": [ { "name": "cow_cookie:cookie/1" } ], "repo": "https://github.com/ninenines/cowlib", "vendor": "ninenines", "versions": [ { "lessThan": "2.21.0", "status": "affected", "version": "2.9.0", "versionType": "semver" } ] }, { "collectionURL": "https://github.com", "cpes": [ "cpe:2.3:a:ninenines:cowlib:*:*:*:*:*:*:*:*" ], "defaultStatus": "unaffected", "modules": [ "cow_cookie" ], "packageName": "ninenines/cowlib", "packageURL": "pkg:github/ninenines/cowlib", "product": "cowlib", "programFiles": [ "src/cow_cookie.erl" ], "programRoutines": [ { "name": "cow_cookie:cookie/1" } ], "repo": "https://github.com/ninenines/cowlib", "vendor": "ninenines", "versions": [ { "lessThan": "c17fd73945ef536cccecc492d286fb6b6d1c3307", "status": "affected", "version": "f017f8a0ecbffd5033d9ab49bf180186f7a523a7", "versionType": "git" } ] } ], "configurations": [ { "lang": "en", "supportingMedia": [ { "base64": false, "type": "text/html", "value": "

The application must pass attacker-controlled bytes as cookie names or values to cow_cookie:cookie/1. Applications that construct cookie lists exclusively from trusted, application-controlled values are not affected.

" }, { "base64": false, "type": "text/markdown", "value": "The application must pass attacker-controlled bytes as cookie names or values to `cow_cookie:cookie/1`. Applications that construct cookie lists exclusively from trusted, application-controlled values are not affected." } ], "value": "The application must pass attacker-controlled bytes as cookie names or values to cow_cookie:cookie/1. Applications that construct cookie lists exclusively from trusted, application-controlled values are not affected." } ], "cpeApplicability": [ { "nodes": [ { "cpeMatch": [ { "criteria": "cpe:2.3:a:ninenines:cowlib:*:*:*:*:*:*:*:*", "versionEndExcluding": "2.21.0", "versionStartIncluding": "2.9.0", "vulnerable": true } ], "negate": false, "operator": "OR" } ], "operator": "AND" } ], "credits": [ { "lang": "en", "type": "finder", "value": "Peter Ullrich" }, { "lang": "en", "type": "remediation developer", "value": "Loïc Hoguin" }, { "lang": "en", "type": "coordinator", "value": "Jonatan Männchen / EEF" } ], "descriptions": [ { "lang": "en", "supportingMedia": [ { "base64": false, "type": "text/html", "value": "

Improper Neutralization of CRLF Sequences ('CRLF Injection') vulnerability in ninenines cowlib allows HTTP request splitting and cookie smuggling via unvalidated cookie name and value fields.

\n

cow_cookie:cookie/1 in cowlib builds a client-side Cookie: request header from a list of name-value pairs without validating either field. An attacker who controls the cookie names or values passed to this function can inject ;, ,, CR, LF, or TAB characters into the serialized header. This enables two classes of attack: cookie smuggling within a single header (e.g. injecting ; admin=1 to introduce a phantom cookie that the receiving server treats as authentic) and HTTP request header splitting (injecting CRLF to append arbitrary headers or smuggle a complete second request against a shared upstream proxy). The decoder side (parse_cookie_name/1, parse_cookie_value/1) and setcookie/3 already validate and reject these characters; the encoder alone is missing the check.

\n

This issue affects cowlib: from 2.9.0 before 2.21.0.

" }, { "base64": false, "type": "text/markdown", "value": "Improper Neutralization of CRLF Sequences ('CRLF Injection') vulnerability in ninenines cowlib allows HTTP request splitting and cookie smuggling via unvalidated cookie name and value fields.\n\n`cow_cookie:cookie/1` in cowlib builds a client-side `Cookie:` request header from a list of name-value pairs without validating either field. An attacker who controls the cookie names or values passed to this function can inject `;`, `,`, CR, LF, or TAB characters into the serialized header. This enables two classes of attack: cookie smuggling within a single header (e.g. injecting `; admin=1` to introduce a phantom cookie that the receiving server treats as authentic) and HTTP request header splitting (injecting CRLF to append arbitrary headers or smuggle a complete second request against a shared upstream proxy). The decoder side (`parse_cookie_name/1`, `parse_cookie_value/1`) and `setcookie/3` already validate and reject these characters; the encoder alone is missing the check.\n\nThis issue affects cowlib: from 2.9.0 before 2.21.0." } ], "value": "Improper Neutralization of CRLF Sequences ('CRLF Injection') vulnerability in ninenines cowlib allows HTTP request splitting and cookie smuggling via unvalidated cookie name and value fields.\n\ncow_cookie:cookie/1 in cowlib builds a client-side Cookie: request header from a list of name-value pairs without validating either field. An attacker who controls the cookie names or values passed to this function can inject ;, ,, CR, LF, or TAB characters into the serialized header. This enables two classes of attack: cookie smuggling within a single header (e.g. injecting ; admin=1 to introduce a phantom cookie that the receiving server treats as authentic) and HTTP request header splitting (injecting CRLF to append arbitrary headers or smuggle a complete second request against a shared upstream proxy). The decoder side (parse_cookie_name/1, parse_cookie_value/1) and setcookie/3 already validate and reject these characters; the encoder alone is missing the check.\n\nThis issue affects cowlib: from 2.9.0 before 2.21.0." } ], "impacts": [ { "capecId": "CAPEC-105", "descriptions": [ { "lang": "en", "value": "CAPEC-105 HTTP Request Splitting" } ] } ], "metrics": [ { "cvssV4_0": { "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "Safety": "NOT_DEFINED", "attackComplexity": "LOW", "attackRequirements": "PRESENT", "attackVector": "LOCAL", "baseScore": 2.1, "baseSeverity": "LOW", "privilegesRequired": "NONE", "providerUrgency": "NOT_DEFINED", "subAvailabilityImpact": "NONE", "subConfidentialityImpact": "NONE", "subIntegrityImpact": "LOW", "userInteraction": "NONE", "valueDensity": "NOT_DEFINED", "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N", "version": "4.0", "vulnAvailabilityImpact": "NONE", "vulnConfidentialityImpact": "NONE", "vulnIntegrityImpact": "LOW", "vulnerabilityResponseEffort": "NOT_DEFINED" }, "format": "CVSS", "scenarios": [ { "lang": "en", "value": "GENERAL" } ] } ], "problemTypes": [ { "descriptions": [ { "cweId": "CWE-93", "description": "CWE-93 Improper Neutralization of CRLF Sequences ('CRLF Injection')", "lang": "en", "type": "CWE" } ] } ], "providerMetadata": { "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db", "shortName": "EEF", "dateUpdated": "2026-10-09T06:57:15.234Z" }, "references": [ { "name": "GitHub Advisory", "tags": [ "patch" ], "url": "https://github.com/erlef/cowlib/commit/177953dd51540da11090666c1f007214127a1144" }, { "name": "EEF CNA record for CVE-2026-43969", "tags": [ "related", "third-party-advisory" ], "url": "https://cna.erlef.org/cves/CVE-2026-43969.html" }, { "name": "OSV record EEF-CVE-2026-43969", "tags": [ "related" ], "url": "https://osv.dev/vulnerability/EEF-CVE-2026-43969" }, { "name": "Introducing commit f017f8a in ninenines/cowlib", "tags": [ "related" ], "url": "https://github.com/ninenines/cowlib/commit/f017f8a0ecbffd5033d9ab49bf180186f7a523a7" }, { "name": "Fix commit c17fd73 in ninenines/cowlib", "tags": [ "patch" ], "url": "https://github.com/ninenines/cowlib/commit/c17fd73945ef536cccecc492d286fb6b6d1c3307" } ], "source": { "discovery": "EXTERNAL" }, "title": "Cookie Request Header Injection via Unvalidated Encoder in cow_cookie:cookie/1", "workarounds": [ { "lang": "en", "supportingMedia": [ { "base64": false, "type": "text/html", "value": "

Validate inputs into cow_cookie:cookie/1 to only include valid cookie name and value characters as defined in RFC 6265 Section 4.1.1 before passing them to the function.

" }, { "base64": false, "type": "text/markdown", "value": "Validate inputs into `cow_cookie:cookie/1` to only include valid cookie name and value characters as defined in RFC 6265 Section 4.1.1 before passing them to the function." } ], "value": "Validate inputs into cow_cookie:cookie/1 to only include valid cookie name and value characters as defined in RFC 6265 Section 4.1.1 before passing them to the function." } ] }, "adp": [ { "metrics": [ { "other": { "type": "ssvc", "content": { "timestamp": "2026-05-11T18:55:16.028478Z", "id": "CVE-2026-43969", "options": [ { "Exploitation": "none" }, { "Automatable": "no" }, { "Technical Impact": "partial" } ], "role": "CISA Coordinator", "version": "2.0.3" } } } ], "title": "CISA ADP Vulnrichment", "providerMetadata": { "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "shortName": "CISA-ADP", "dateUpdated": "2026-05-11T18:55:26.121Z" } } ] } }