{"id":"CVE-2026-59883","aliases":["CLSA-2026-1784856237","CLSA-2026-1785380882","CLSA-2026-1786439704","CLSA-2026-1788433786","DEBIAN-CVE-2026-59883","EUVD-2026-42320","GHSA-94pj-82f3-465w","GHSA-f283-ghqc-fg79","GHSA-g446-98w2-8p5w","GHSA-h95v-h523-3mw8","GHSA-wm3w-8rrp-j577","UBUNTU-CVE-2026-59883"],"status":"published","title":"Guzzle: Cookie Disclosure and Injection via IP-Address Domains","description":"Guzzle is an extensible PHP HTTP client. Prior to 7.12.3, CookieJar did not restrict cookies scoped to IP-address or bare-numeric Domain values to the exact host that set them, because SetCookie::matchesDomain() applied ordinary suffix matching to domains such as 192.168.0.1, [::1], or 1, allowing cross-host cookie disclosure, cookie injection, or session fixation. This issue is fixed in version 7.12.3.","severity":{"version":"3.1","score":4.7,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-09","score":0.00167,"percentile":0.06027,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-200","CWE-346","CWE-384"],"published":"2026-07-08T15:56:03Z","modified":"2026-10-28T02:31:00Z","fixes":[{"ecosystem":"Packagist","package":"guzzlehttp/guzzle","fixed_in":["7.12.3"],"sources":["ghsa","osv"]},{"ecosystem":"Debian:14","package":"guzzle","fixed_in":["7.12.3-1"],"sources":["osv"]}],"affected":[{"source":"ghsa","ecosystem":"Packagist","package":"guzzlehttp/guzzle","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"7.12.3"}]}]},{"source":"osv","ecosystem":"TuxCare:Packagist","package":"guzzlehttp/guzzle","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"7.10.0"},{"fixed":"7.10.0-p2+tuxcare"}]}],"versions":["7.10.0","7.10.0-p1+tuxcare"],"bundled":5},{"source":"osv","ecosystem":"TuxCare:Packagist","package":"guzzlehttp/guzzle","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"6.5.8"},{"fixed":"6.5.8-p2+tuxcare"}]}],"versions":["6.5.8","6.5.8-p1+tuxcare"],"bundled":5},{"source":"osv","ecosystem":"TuxCare:Packagist","package":"guzzlehttp/guzzle","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"6.3.3"},{"fixed":"6.3.3-p2+tuxcare"}]}],"versions":["6.3.3","6.3.3-p1+tuxcare"],"bundled":3},{"source":"osv","ecosystem":"TuxCare:Packagist","package":"guzzlehttp/guzzle","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"6.0.2"},{"fixed":"6.0.2-p5+tuxcare"}]}],"versions":["6.0.2","6.0.2-p1+tuxcare","6.0.2-p2+tuxcare","6.0.2-p3+tuxcare","6.0.2-p4+tuxcare"],"bundled":7},{"source":"osv","ecosystem":"Debian:12","package":"guzzle","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["7.11.0-1","7.12.0-1","7.12.1-1","7.12.3-1","7.13.1-1","7.14.0-1","7.14.1-1","7.14.2-1","7.15.0-1","7.15.1-1","7.15.2-1","7.15.3-1","7.15.5-1","7.4.5-1","7.9.2-0.1","8.0.1-1","8.0.2-1","8.1.0-1","8.2.0-1"]},{"source":"osv","ecosystem":"Debian:13","package":"guzzle","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["7.11.0-1","7.12.0-1","7.12.1-1","7.12.3-1","7.13.1-1","7.14.0-1","7.14.1-1","7.14.2-1","7.15.0-1","7.15.1-1","7.15.2-1","7.15.3-1","7.15.5-1","7.9.2-0.1","8.0.1-1","8.0.2-1","8.1.0-1","8.2.0-1"]},{"source":"osv","ecosystem":"Debian:14","package":"guzzle","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"7.12.3-1"}]}],"versions":["7.11.0-1","7.12.0-1","7.12.1-1","7.9.2-0.1"]},{"source":"osv","ecosystem":"Packagist","package":"guzzlehttp/guzzle","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"7.12.3"}]}],"versions":["4.0.0","4.0.0-rc.1","4.0.0-rc.2","4.0.1","4.0.2","4.1.0","4.1.1","4.1.2","4.1.3","4.1.4","4.1.5","4.1.6","4.1.7","4.1.8","4.2.0","4.2.1","4.2.2","4.2.3","4.2.4","5.0.0","5.0.1","5.0.2","5.0.3","5.1.0","5.2.0","5.3.0","5.3.1","5.3.2","5.3.3","5.3.4","6.0.0","6.0.1","6.0.2","6.1.0","6.1.1","6.2.0","6.2.1","6.2.2","6.2.3","6.3.0","6.3.1","6.3.2","6.3.3","6.4.0","6.4.1","6.5.0","6.5.1","6.5.2","6.5.3","6.5.4","6.5.5","6.5.6","6.5.7","6.5.8","7.0.0","7.0.0-beta.1","7.0.0-beta.2","7.0.0-rc.1","7.0.1","7.1.0","7.1.1","7.10.0","7.10.1","7.10.2","7.10.3","7.10.4","7.10.5","7.10.6","7.11.0","7.11.1","7.11.2","7.12.0","7.12.1","7.12.2","7.2.0","7.3.0","7.4.0","7.4.1","7.4.2","7.4.3","7.4.4","7.4.5","7.5.0","7.5.1","7.5.2","7.5.3","7.6.0","7.6.1","7.7.0","7.7.1","7.8.0","7.8.1","7.8.2","7.9.0","7.9.1","7.9.2","7.9.3","v1.0.3","v1.0.4","v2.0.0","v2.0.1","v2.0.2","v2.0.3","v2.0.4","v2.0.5","v2.1.0","v2.1.1","v2.1.2","v2.1.3","v2.1.4","v2.2.0","v2.2.1","v2.2.2","v2.2.3","v2.2.4","v2.3.2","v2.4.0","v2.4.1","v2.5.0","v2.6.0","v2.6.1","v2.6.2","v2.6.3","v2.6.4","v2.6.5","v2.6.6","v2.7.0","v2.7.1","v2.7.2","v2.8.0","v2.8.1","v2.8.2","v2.8.3","v2.8.4","v2.8.5","v2.8.6","v2.8.7","v2.8.8","v3.0.0","v3.0.1","v3.0.2","v3.0.3","v3.0.4","v3.0.5","v3.0.6","v3.0.7","v3.1.0","v3.1.1","v3.1.2","v3.2.0","v3.3.0","v3.3.1","v3.4.0","v3.4.1","v3.4.2","v3.4.3","v3.5.0","v3.6.0","v3.7.0","v3.7.1","v3.7.2","v3.7.3","v3.7.4","v3.8.0","v3.8.1"]},{"source":"osv","ecosystem":"Ubuntu:24.04:LTS","package":"guzzle","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["7.4.5-1"]},{"source":"osv","ecosystem":"Ubuntu:25.10","package":"guzzle","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["7.9.2-0.1"]},{"source":"osv","ecosystem":"Ubuntu:26.10","package":"guzzle","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["7.9.2-0.1build1","7.13.1-1","7.15.1-1","7.15.2-1","7.15.3-1"]},{"source":"osv","ecosystem":"Ubuntu:26.04:LTS","package":"guzzle","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["7.9.2-0.1","7.9.2-0.1build1"]}],"products":[{"vendor":"guzzle","product":"guzzle"},{"vendor":"guzzlephp","product":"guzzle"}],"references":[{"url":"https://github.com/guzzle/guzzle/security/advisories/GHSA-g446-98w2-8p5w","tags":["x_refsource_CONFIRM","Mitigation","Vendor Advisory","advisory","web","report"]},{"url":"https://github.com/guzzle/guzzle/pull/3694","tags":["x_refsource_MISC","Issue Tracking","Patch","fix","web","report"]},{"url":"https://github.com/guzzle/guzzle/commit/b9944c161b12d9ee9c9334cfc5b9659ecd7451f8","tags":["x_refsource_MISC","Patch","fix","web"]},{"url":"https://github.com/guzzle/guzzle/releases/tag/7.12.3","tags":["x_refsource_MISC","Release Notes","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-59883","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-g446-98w2-8p5w"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/59xxx/CVE-2026-59883.json","tags":["advisory"]},{"url":"https://security-tracker.debian.org/tracker/CVE-2026-59883","tags":["advisory"]},{"url":"https://github.com/guzzle/guzzle","tags":["package"]},{"url":"https://ubuntu.com/security/CVE-2026-59883","tags":["report"]},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-59883","tags":["report"]}],"sources":{"cve":[{"id":"CVE-2026-59883","title":"Guzzle: Cookie Disclosure and Injection via IP-Address Domains","description":"Guzzle is an extensible PHP HTTP client. Prior to 7.12.3, CookieJar did not restrict cookies scoped to IP-address or bare-numeric Domain values to the exact host that set them, because SetCookie::matchesDomain() applied ordinary suffix matching to domains such as 192.168.0.1, [::1], or 1, allowing cross-host cookie disclosure, cookie injection, or session fixation. This issue is fixed in version 7.12.3.","status":"published","published":"2026-07-08T15:56:03.689Z","modified":"2026-07-09T13:49:43.875Z","cvss":[{"version":"3.1","score":4.7,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium","assessor":"cna"}],"cwes":["CWE-346","CWE-384"],"updated_at":"2026-11-02T14:19:58.560602Z"}],"euvd":[{"id":"EUVD-2026-42320","description":"Guzzle is an extensible PHP HTTP client. Prior to 7.12.3, CookieJar did not restrict cookies scoped to IP-address or bare-numeric Domain values to the exact host that set them, because SetCookie::matchesDomain() applied ordinary suffix matching to domains such as 192.168.0.1, [::1], or 1, allowing cross-host cookie disclosure, cookie injection, or session fixation. This issue is fixed in version 7.12.3.","status":"published","published":"2026-07-08T15:56:03Z","modified":"2026-07-09T13:49:43Z","cvss":[{"version":"3.1","score":4.7,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium"}],"updated_at":"2026-11-02T18:20:04.523855Z"}],"ghsa":[{"id":"GHSA-g446-98w2-8p5w","title":"Guzzle: Cookie Disclosure and Injection via IP-Address Domains","description":"### Impact\n\n`CookieJar` does not restrict a cookie scoped to an IP address to the exact host that set it. When a stored cookie's `Domain` attribute is an IPv4 literal (`Domain=192.168.0.1`), a bracketed IPv6 literal (`Domain=[::1]`), or a bare numeric value that denotes an IPv4 address (`Domain=1`, which is `0.0.0.1`), `SetCookie::matchesDomain()` applies ordinary subdomain (suffix) matching to it instead of requiring an exact host. The IP-address check inside `matchesDomain()` is applied only to the request host and never to the cookie's own domain, and response cookies that carry an explicit `Domain` attribute are stored as suffix-matchable. As a result Guzzle sends such a cookie to any host whose name ends in that value as a trailing label, for example sending a `Domain=192.168.0.1` cookie to `evil.192.168.0.1`, or a `Domain=1` cookie to `evil.1`. The same flaw lets a look-alike host store a cookie that Guzzle then sends to the bare IP address. Depending on how the receiving service interprets the cookie, the impact is cross-host cookie disclosure, cookie injection, or session fixation.\n\nYou are affected if your application uses Guzzle's cookie support, for example `new Client(['cookies' =\u003e true])` or an explicit `CookieJar`, reuses one cookie jar across more than one host or trust boundary, and that jar can hold a cookie scoped to an IP-address or bare-numeric host. To actually leak a cookie the application must also resolve and connect to a look-alike host whose name ends in the IP-address label, such as `evil.192.168.0.1`. Such names are not publicly registrable, so in practice an attacker needs some influence over name resolution, which is realistic on private, split-horizon, container, or development networks. You are not affected if you do not use Guzzle's cookie support, if you use a separate cookie jar per host or trust boundary, or if your jars never hold cookies scoped to IP-address or bare-numeric hosts. This issue is independent of public suffix list validation. Per RFC 6265, an IP-address cookie domain must match only the exact host that set it and must never match a subdomain.\n\n### Patches\n\nThe issue is patched in `7.12.3` and later. Starting in that release, Guzzle matches an IPv4 literal, a bracketed IPv6 literal, or a bare-numeric cookie `Domain` only against the exact request host, and no longer applies subdomain suffix matching to them.\n\n### Workarounds\n\nIf you cannot upgrade immediately, do not reuse one `CookieJar` instance across untrusted and trusted origins. Use a separate cookie jar per host or trust boundary, or disable cookie handling for requests to untrusted hosts, and avoid scoping cookies to IP-address or bare-numeric hosts. In particular, avoid `new Client(['cookies' =\u003e true])` for any client that may contact unrelated hosts at different trust levels, because that option creates a single shared jar for the whole client.\n\n### References\n\n* https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.3\n* https://datatracker.ietf.org/doc/html/rfc6265#section-5.3\n* https://url.spec.whatwg.org/#concept-ipv4-parser","status":"published","published":"2026-07-20T22:00:09Z","modified":"2026-07-20T22:00:10Z","cvss":[{"version":"3.1","score":4.7,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium"}],"cwes":["CWE-200","CWE-346","CWE-384"],"updated_at":"2026-11-02T14:40:48.410776Z"}],"nvd":[{"id":"CVE-2026-59883","description":"Guzzle is an extensible PHP HTTP client. Prior to 7.12.3, CookieJar did not restrict cookies scoped to IP-address or bare-numeric Domain values to the exact host that set them, because SetCookie::matchesDomain() applied ordinary suffix matching to domains such as 192.168.0.1, [::1], or 1, allowing cross-host cookie disclosure, cookie injection, or session fixation. This issue is fixed in version 7.12.3.","status":"published","published":"2026-07-08T17:17:26.737Z","modified":"2026-07-13T14:01:39.7Z","cvss":[{"version":"3.1","score":4.7,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium","assessor":"secondary"},{"version":"3.1","score":6.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium","assessor":"primary"}],"cwes":["CWE-346","CWE-384"],"updated_at":"2026-11-02T14:12:28.040501Z"}],"osv":[{"id":"CVE-2026-59883","title":"Guzzle: Cookie Disclosure and Injection via IP-Address Domains","description":"Guzzle is an extensible PHP HTTP client. Prior to 7.12.3, CookieJar did not restrict cookies scoped to IP-address or bare-numeric Domain values to the exact host that set them, because SetCookie::matchesDomain() applied ordinary suffix matching to domains such as 192.168.0.1, [::1], or 1, allowing cross-host cookie disclosure, cookie injection, or session fixation. This issue is fixed in version 7.12.3.","status":"published","published":"2026-07-08T15:56:03.689Z","modified":"2026-10-28T02:31:00.110280793Z","cvss":[{"version":"3.1","score":4.7,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium"}],"cwes":["CWE-346","CWE-384"],"updated_at":"2026-11-02T15:45:12.496548Z"},{"id":"DEBIAN-CVE-2026-59883","description":"Guzzle is an extensible PHP HTTP client. Prior to 7.12.3, CookieJar did not restrict cookies scoped to IP-address or bare-numeric Domain values to the exact host that set them, because SetCookie::matchesDomain() applied ordinary suffix matching to domains such as 192.168.0.1, [::1], or 1, allowing cross-host cookie disclosure, cookie injection, or session fixation. This issue is fixed in version 7.12.3.","status":"published","published":"2026-07-08T17:17:26.737Z","modified":"2026-10-01T03:03:28.893631136Z","cvss":[{"version":"3.1","score":6.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium"}],"updated_at":"2026-11-02T15:45:57.932517Z"},{"id":"GHSA-g446-98w2-8p5w","title":"Guzzle: Cookie Disclosure and Injection via IP-Address Domains","description":"### Impact\n\n`CookieJar` does not restrict a cookie scoped to an IP address to the exact host that set it. When a stored cookie's `Domain` attribute is an IPv4 literal (`Domain=192.168.0.1`), a bracketed IPv6 literal (`Domain=[::1]`), or a bare numeric value that denotes an IPv4 address (`Domain=1`, which is `0.0.0.1`), `SetCookie::matchesDomain()` applies ordinary subdomain (suffix) matching to it instead of requiring an exact host. The IP-address check inside `matchesDomain()` is applied only to the request host and never to the cookie's own domain, and response cookies that carry an explicit `Domain` attribute are stored as suffix-matchable. As a result Guzzle sends such a cookie to any host whose name ends in that value as a trailing label, for example sending a `Domain=192.168.0.1` cookie to `evil.192.168.0.1`, or a `Domain=1` cookie to `evil.1`. The same flaw lets a look-alike host store a cookie that Guzzle then sends to the bare IP address. Depending on how the receiving service interprets the cookie, the impact is cross-host cookie disclosure, cookie injection, or session fixation.\n\nYou are affected if your application uses Guzzle's cookie support, for example `new Client(['cookies' =\u003e true])` or an explicit `CookieJar`, reuses one cookie jar across more than one host or trust boundary, and that jar can hold a cookie scoped to an IP-address or bare-numeric host. To actually leak a cookie the application must also resolve and connect to a look-alike host whose name ends in the IP-address label, such as `evil.192.168.0.1`. Such names are not publicly registrable, so in practice an attacker needs some influence over name resolution, which is realistic on private, split-horizon, container, or development networks. You are not affected if you do not use Guzzle's cookie support, if you use a separate cookie jar per host or trust boundary, or if your jars never hold cookies scoped to IP-address or bare-numeric hosts. This issue is independent of public suffix list validation. Per RFC 6265, an IP-address cookie domain must match only the exact host that set it and must never match a subdomain.\n\n### Patches\n\nThe issue is patched in `7.12.3` and later. Starting in that release, Guzzle matches an IPv4 literal, a bracketed IPv6 literal, or a bare-numeric cookie `Domain` only against the exact request host, and no longer applies subdomain suffix matching to them.\n\n### Workarounds\n\nIf you cannot upgrade immediately, do not reuse one `CookieJar` instance across untrusted and trusted origins. Use a separate cookie jar per host or trust boundary, or disable cookie handling for requests to untrusted hosts, and avoid scoping cookies to IP-address or bare-numeric hosts. In particular, avoid `new Client(['cookies' =\u003e true])` for any client that may contact unrelated hosts at different trust levels, because that option creates a single shared jar for the whole client.\n\n### References\n\n* https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.3\n* https://datatracker.ietf.org/doc/html/rfc6265#section-5.3\n* https://url.spec.whatwg.org/#concept-ipv4-parser","status":"published","published":"2026-07-20T22:00:09Z","modified":"2026-09-10T03:50:51.915343345Z","cvss":[{"version":"3.1","score":4.7,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium"}],"cwes":["CWE-200","CWE-346","CWE-384"],"updated_at":"2026-11-02T15:46:47.119724Z"},{"id":"UBUNTU-CVE-2026-59883","description":"Guzzle is an extensible PHP HTTP client. Prior to 7.12.3, CookieJar did not restrict cookies scoped to IP-address or bare-numeric Domain values to the exact host that set them, because SetCookie::matchesDomain() applied ordinary suffix matching to domains such as 192.168.0.1, [::1], or 1, allowing cross-host cookie disclosure, cookie injection, or session fixation. This issue is fixed in version 7.12.3.","status":"published","published":"2026-07-08T17:17:00Z","modified":"2026-10-17T12:59:14.436528357Z","cvss":[{"version":"3.1","score":4.7,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium"},{"version":"3.1","score":6.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium"}],"updated_at":"2026-11-02T16:56:41.911783Z"},{"id":"CLSA-2026-1784856237","title":"TuxCare security update for guzzlehttp/guzzle (9 CVEs)","description":"TuxCare rebuilt guzzlehttp/guzzle to address 9 CVEs. Fixed in 7.10.0-p2+tuxcare.","status":"published","published":"2026-08-04T14:52:48Z","modified":"2026-10-15T09:47:59.494487814Z","updated_at":"2026-11-02T15:43:46.482572Z"},{"id":"CLSA-2026-1785380882","title":"TuxCare security update for guzzlehttp/guzzle (8 CVEs)","description":"TuxCare rebuilt guzzlehttp/guzzle to address 8 CVEs. Fixed in 6.5.8-p2+tuxcare.","status":"published","published":"2026-08-04T14:52:51Z","modified":"2026-10-15T09:47:59.63093301Z","updated_at":"2026-11-02T15:43:46.850893Z"},{"id":"CLSA-2026-1786439704","title":"TuxCare security update for guzzlehttp/guzzle (6 CVEs)","description":"TuxCare rebuilt guzzlehttp/guzzle to address 6 CVEs. Fixed in 6.3.3-p2+tuxcare.","status":"published","published":"2026-08-11T09:15:04Z","modified":"2026-10-15T09:47:59.545023913Z","updated_at":"2026-11-02T15:43:46.850893Z"},{"id":"CLSA-2026-1788433786","title":"TuxCare security update for guzzlehttp/guzzle (11 CVEs)","description":"TuxCare rebuilt guzzlehttp/guzzle to address 11 CVEs. Fixed in 6.0.2-p5+tuxcare.","status":"published","published":"2026-09-03T11:09:46Z","modified":"2026-10-15T09:48:00.458370155Z","updated_at":"2026-11-02T15:43:47.591214Z"}]}}
