{"id":"CVE-2026-115779","aliases":["EUVD-2026-116496","GHSA-chp3-j5qr-2vfr"],"status":"published","title":"Effect: Cookie attribute injection via domain, path, and name fields in @effect/platform makeCookie()","description":"Effect is a TypeScript framework that consists of several packages that work together to help build TypeScript applications. From @effect/platform 0.1.0 until 0.97.1 and effect 4.0.0-beta.0 until 4.0.0-beta.103, the name, domain, and path fields passed to makeCookie() allow semicolon delimiters that serializeCookie() writes verbatim into Set-Cookie headers. A caller that supplies attacker-controlled values can append cookie attributes, including a broader Domain or, when the caller has not set those options itself, SameSite=None or Max-Age. Encoded cookie values and CR or LF characters remain unaffected. This can widen a cookie's scope or add otherwise-unset cookie attributes. This issue is fixed in @effect/platform 0.97.1 and effect 4.0.0-beta.103.","severity":{"version":"4.0","score":6.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-12","score":0.00627,"percentile":0.50568,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-20","CWE-74"],"published":"2026-11-03T20:40:19.864Z","modified":"2026-11-10T16:15:04Z","fixes":[{"ecosystem":"npm","package":"@effect/platform","fixed_in":["0.97.1"],"sources":["ghsa","osv"]},{"ecosystem":"npm","package":"effect","fixed_in":["4.0.0-beta.103"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"npm","package":"@effect/platform","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0.1.0"},{"fixed":"0.97.1"}]}]},{"source":"ghsa","ecosystem":"npm","package":"effect","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"4.0.0-beta.0"},{"fixed":"4.0.0-beta.103"}]}]},{"source":"osv","ecosystem":"npm","package":"@effect/platform","ranges":[{"type":"SEMVER","events":[{"introduced":"0.1.0"},{"fixed":"0.97.1"}]}]},{"source":"osv","ecosystem":"npm","package":"effect","ranges":[{"type":"SEMVER","events":[{"introduced":"4.0.0-beta.0"},{"fixed":"4.0.0-beta.103"}]}]}],"products":[{"vendor":"@effect","product":"platform"},{"vendor":"effect-ts","product":"effect"},{"vendor":"runzero","product":"platform"}],"references":[{"url":"https://github.com/Effect-TS/effect/security/advisories/GHSA-chp3-j5qr-2vfr","tags":["x_refsource_CONFIRM","advisory","web"]},{"url":"https://github.com/Effect-TS/effect/pull/6763","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/Effect-TS/effect/pull/6765","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/Effect-TS/effect/commit/4a57af24011db1d66e947289d2f7ffc2074696d2","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/Effect-TS/effect/commit/5859b373b9be04d5037a594196b4743ad80379bd","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/Effect-TS/effect/releases/tag/@effect/platform@0.97.1","tags":["x_refsource_MISC","web"]},{"url":"https://github.com/Effect-TS/effect/releases/tag/effect@4.0.0-beta.103","tags":["x_refsource_MISC","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-115779","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-chp3-j5qr-2vfr"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/115xxx/CVE-2026-115779.json","tags":["advisory"]},{"url":"https://github.com/Effect-TS/effect","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-115779","title":"Effect: Cookie attribute injection via domain, path, and name fields in @effect/platform makeCookie()","description":"Effect is a TypeScript framework that consists of several packages that work together to help build TypeScript applications. From @effect/platform 0.1.0 until 0.97.1 and effect 4.0.0-beta.0 until 4.0.0-beta.103, the name, domain, and path fields passed to makeCookie() allow semicolon delimiters that serializeCookie() writes verbatim into Set-Cookie headers. A caller that supplies attacker-controlled values can append cookie attributes, including a broader Domain or, when the caller has not set those options itself, SameSite=None or Max-Age. Encoded cookie values and CR or LF characters remain unaffected. This can widen a cookie's scope or add otherwise-unset cookie attributes. This issue is fixed in @effect/platform 0.97.1 and effect 4.0.0-beta.103.","status":"published","published":"2026-11-03T20:40:19.864Z","modified":"2026-11-03T21:26:55.431Z","cvss":[{"version":"4.0","score":6.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N","level":"medium","assessor":"cna"}],"cwes":["CWE-74"],"updated_at":"2026-11-03T22:58:37.667595Z"}],"euvd":[{"id":"EUVD-2026-116496","description":"Effect: Cookie attribute injection via domain, path, and name fields in @effect/platform makeCookie()","status":"published","published":"2026-11-10T15:57:32Z","modified":"2026-11-10T15:57:32Z","cvss":[{"version":"4.0","score":6.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N","level":"medium"}],"updated_at":"2026-11-10T17:21:44.229469Z"}],"ghsa":[{"id":"GHSA-chp3-j5qr-2vfr","title":"Effect: Cookie attribute injection via domain, path, and name fields in @effect/platform makeCookie()","description":"### Impact\n\nThe `name`, `domain`, and `path` fields of `makeCookie()` were validated with a regex that allows `;`, the attribute separator in `Set-Cookie` headers. Because `serializeCookie()` writes those fields verbatim, a caller who passes untrusted input into any of them can append arbitrary attributes to the header.\n\nFor example, a `domain` of `\"legit.com; Domain=.parent.tld\"` serializes to `session=token; Domain=legit.com; Domain=.parent.tld`. RFC 6265 §5.3 takes the last occurrence, so the injected domain wins and the cookie widens to the parent domain. The same trick sets `SameSite=None` or `Max-Age` when the caller has not set those options itself.\n\nThe `value` field is unaffected: it passes through `encodeURIComponent`, which encodes `;`. CR and LF are rejected by the existing regex, so header splitting is not possible.\n\n### Patches\n\nFixed in #6763 (v4) and #6765 (v3): the shared regex is split into per-field validators that reject `;`, and `serializeCookie()` now validates before writing the header.\n\n### Workarounds\n\nDo not pass user input into `name`, `domain`, or `path`; set them from application constants.","status":"published","published":"2026-11-10T15:57:32Z","modified":"2026-11-10T15:57:33Z","cvss":[{"version":"4.0","score":6.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N","level":"medium"}],"cwes":["CWE-20","CWE-74"],"updated_at":"2026-11-10T16:25:10.795148Z"}],"nvd":[{"id":"CVE-2026-115779","description":"Effect is a TypeScript framework that consists of several packages that work together to help build TypeScript applications. From @effect/platform 0.1.0 until 0.97.1 and effect 4.0.0-beta.0 until 4.0.0-beta.103, the name, domain, and path fields passed to makeCookie() allow semicolon delimiters that serializeCookie() writes verbatim into Set-Cookie headers. A caller that supplies attacker-controlled values can append cookie attributes, including a broader Domain or, when the caller has not set those options itself, SameSite=None or Max-Age. Encoded cookie values and CR or LF characters remain unaffected. This can widen a cookie's scope or add otherwise-unset cookie attributes. This issue is fixed in @effect/platform 0.97.1 and effect 4.0.0-beta.103.","status":"published","published":"2026-11-03T21:17:02.19Z","modified":"2026-11-03T22:19:17.923Z","cvss":[{"version":"4.0","score":6.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","level":"medium","assessor":"secondary"}],"cwes":["CWE-74"],"updated_at":"2026-11-04T00:48:10.032782Z"}],"osv":[{"id":"CVE-2026-115779","title":"Effect: Cookie attribute injection via domain, path, and name fields in @effect/platform makeCookie()","description":"Effect is a TypeScript framework that consists of several packages that work together to help build TypeScript applications. From @effect/platform 0.1.0 until 0.97.1 and effect 4.0.0-beta.0 until 4.0.0-beta.103, the name, domain, and path fields passed to makeCookie() allow semicolon delimiters that serializeCookie() writes verbatim into Set-Cookie headers. A caller that supplies attacker-controlled values can append cookie attributes, including a broader Domain or, when the caller has not set those options itself, SameSite=None or Max-Age. Encoded cookie values and CR or LF characters remain unaffected. This can widen a cookie's scope or add otherwise-unset cookie attributes. This issue is fixed in @effect/platform 0.97.1 and effect 4.0.0-beta.103.","status":"published","published":"2026-11-03T20:40:19.864Z","modified":"2026-11-05T03:29:50.955130028Z","cvss":[{"version":"4.0","score":6.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N","level":"medium"}],"cwes":["CWE-74"],"updated_at":"2026-11-05T07:12:46.161235Z"},{"id":"GHSA-chp3-j5qr-2vfr","title":"Effect: Cookie attribute injection via domain, path, and name fields in @effect/platform makeCookie()","description":"### Impact\n\nThe `name`, `domain`, and `path` fields of `makeCookie()` were validated with a regex that allows `;`, the attribute separator in `Set-Cookie` headers. Because `serializeCookie()` writes those fields verbatim, a caller who passes untrusted input into any of them can append arbitrary attributes to the header.\n\nFor example, a `domain` of `\"legit.com; Domain=.parent.tld\"` serializes to `session=token; Domain=legit.com; Domain=.parent.tld`. RFC 6265 §5.3 takes the last occurrence, so the injected domain wins and the cookie widens to the parent domain. The same trick sets `SameSite=None` or `Max-Age` when the caller has not set those options itself.\n\nThe `value` field is unaffected: it passes through `encodeURIComponent`, which encodes `;`. CR and LF are rejected by the existing regex, so header splitting is not possible.\n\n### Patches\n\nFixed in #6763 (v4) and #6765 (v3): the shared regex is split into per-field validators that reject `;`, and `serializeCookie()` now validates before writing the header.\n\n### Workarounds\n\nDo not pass user input into `name`, `domain`, or `path`; set them from application constants.","status":"published","published":"2026-11-10T15:57:32Z","modified":"2026-11-10T16:15:04.15593998Z","cvss":[{"version":"4.0","score":6.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N","level":"medium"}],"cwes":["CWE-20","CWE-74"],"updated_at":"2026-11-10T16:33:22.61896Z"}]}}
