{"id":"CVE-2026-69206","aliases":["EUVD-2026-79236","GHSA-9xww-74xv-gjfp"],"status":"published","title":"Http4s: DigestAuth allows replay of captured requests","description":"Http4s is a Scala interface for HTTP services. Prior to 0.23.35 and 1.0.0-M47, DigestAuth replay protection records lastNc plus one instead of the highest nonce-count value it has accepted. When a legitimate client sends noncontiguous nc values because of parallel or retried requests, the stored counter remains below the accepted maximum, allowing a passive observer to replay a captured Authorization header multiple times. Successful replays execute authenticated requests, including state-changing operations, as the captured user. This issue is fixed in versions 0.23.35 and 1.0.0-M47.","severity":{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-09","score":0.00395,"percentile":0.33938,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-294"],"published":"2026-09-15T19:29:40Z","modified":"2026-10-28T02:30:28Z","fixes":[{"ecosystem":"Maven","package":"org.http4s:http4s-ember-core_2.12","fixed_in":["0.23.35"],"sources":["ghsa","osv"]},{"ecosystem":"Maven","package":"org.http4s:http4s-ember-core_2.13","fixed_in":["0.23.35","1.0.0-M47"],"sources":["ghsa","osv"]},{"ecosystem":"Maven","package":"org.http4s:http4s-ember-core_3","fixed_in":["0.23.35","1.0.0-M47"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"Maven","package":"org.http4s:http4s-ember-core_2.12","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"last_affected":"0.23.34"},{"fixed":"0.23.35"}]}]},{"source":"ghsa","ecosystem":"Maven","package":"org.http4s:http4s-ember-core_2.13","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"last_affected":"0.23.34"},{"fixed":"0.23.35"}]}]},{"source":"ghsa","ecosystem":"Maven","package":"org.http4s:http4s-ember-core_3","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"last_affected":"0.23.34"},{"fixed":"0.23.35"}]}]},{"source":"ghsa","ecosystem":"Maven","package":"org.http4s:http4s-ember-core_2.13","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"1.0.0-M1"},{"last_affected":"1.0.0-M46"},{"fixed":"1.0.0-M47"}]}]},{"source":"ghsa","ecosystem":"Maven","package":"org.http4s:http4s-ember-core_3","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"1.0.0-M1"},{"last_affected":"1.0.0-M46"},{"fixed":"1.0.0-M47"}]}]},{"source":"osv","ecosystem":"Maven","package":"org.http4s:http4s-ember-core_2.12","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.23.35"}]}],"versions":["0.10.0-M10","0.21.0","0.21.0-M2","0.21.0-M3","0.21.0-M4","0.21.0-M5","0.21.0-M6","0.21.0-RC1","0.21.0-RC2","0.21.0-RC3","0.21.0-RC4","0.21.0-RC5","0.21.1","0.21.11","0.21.12","0.21.13","0.21.14","0.21.15","0.21.16","0.21.17","0.21.18","0.21.19","0.21.2","0.21.20","0.21.21","0.21.22","0.21.23","0.21.24","0.21.25","0.21.26","0.21.27","0.21.28","0.21.29","0.21.3","0.21.30","0.21.31","0.21.32","0.21.33","0.21.34","0.21.4","0.21.5","0.21.6","0.21.7","0.21.8","0.21.9","0.22-129-24d065b","0.22-143-49b5a8d","0.22-53-01128f5","0.22-96-55d3184","0.22.0","0.22.0-M1","0.22.0-M2","0.22.0-M3","0.22.0-M4","0.22.0-M5","0.22.0-M6","0.22.0-M7","0.22.0-M8","0.22.0-RC1","0.22.1","0.22.10","0.22.11","0.22.12","0.22.13","0.22.14","0.22.15","0.22.2","0.22.3","0.22.4","0.22.5","0.22.6","0.22.7","0.22.8","0.22.9","0.23.0","0.23.0-M1","0.23.0-RC1","0.23.1","0.23.10","0.23.11","0.23.12","0.23.13","0.23.14","0.23.15","0.23.16","0.23.17","0.23.18","0.23.19","0.23.19-RC1","0.23.19-RC2","0.23.19-RC3","0.23.2","0.23.20","0.23.21","0.23.22","0.23.23","0.23.24","0.23.25","0.23.26","0.23.27","0.23.28","0.23.29","0.23.3","0.23.30","0.23.31","0.23.32","0.23.33","0.23.34","0.23.4","0.23.5","0.23.6","0.23.7","0.23.8","0.23.9"]},{"source":"osv","ecosystem":"Maven","package":"org.http4s:http4s-ember-core_2.13","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.23.35"}]}],"versions":["0.10.0-M10","0.21.0","0.21.0-M2","0.21.0-M3","0.21.0-M4","0.21.0-M5","0.21.0-M6","0.21.0-RC1","0.21.0-RC2","0.21.0-RC3","0.21.0-RC4","0.21.0-RC5","0.21.1","0.21.11","0.21.12","0.21.13","0.21.14","0.21.15","0.21.16","0.21.17","0.21.18","0.21.19","0.21.2","0.21.20","0.21.21","0.21.22","0.21.23","0.21.24","0.21.25","0.21.26","0.21.27","0.21.28","0.21.29","0.21.3","0.21.30","0.21.31","0.21.32","0.21.33","0.21.34","0.21.4","0.21.5","0.21.6","0.21.7","0.21.8","0.21.9","0.22-129-24d065b","0.22-143-49b5a8d","0.22-53-01128f5","0.22-96-55d3184","0.22.0","0.22.0-M1","0.22.0-M2","0.22.0-M3","0.22.0-M4","0.22.0-M5","0.22.0-M6","0.22.0-M7","0.22.0-M8","0.22.0-RC1","0.22.1","0.22.10","0.22.11","0.22.12","0.22.13","0.22.14","0.22.15","0.22.2","0.22.3","0.22.4","0.22.5","0.22.6","0.22.7","0.22.8","0.22.9","0.23.0","0.23.0-M1","0.23.0-RC1","0.23.1","0.23.10","0.23.11","0.23.12","0.23.13","0.23.14","0.23.15","0.23.16","0.23.17","0.23.18","0.23.19","0.23.19-RC1","0.23.19-RC2","0.23.19-RC3","0.23.2","0.23.20","0.23.21","0.23.22","0.23.23","0.23.24","0.23.25","0.23.26","0.23.27","0.23.28","0.23.29","0.23.3","0.23.30","0.23.31","0.23.32","0.23.33","0.23.34","0.23.4","0.23.5","0.23.6","0.23.7","0.23.8","0.23.9"]},{"source":"osv","ecosystem":"Maven","package":"org.http4s:http4s-ember-core_3","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.23.35"}]}],"versions":["0.22.0","0.22.0-M8","0.22.0-RC1","0.22.1","0.22.10","0.22.11","0.22.12","0.22.13","0.22.14","0.22.15","0.22.2","0.22.3","0.22.4","0.22.5","0.22.6","0.22.7","0.22.8","0.22.9","0.23.0","0.23.0-M1","0.23.0-RC1","0.23.1","0.23.10","0.23.11","0.23.12","0.23.13","0.23.14","0.23.15","0.23.16","0.23.17","0.23.18","0.23.19","0.23.19-RC1","0.23.19-RC2","0.23.19-RC3","0.23.2","0.23.20","0.23.21","0.23.22","0.23.23","0.23.24","0.23.25","0.23.26","0.23.27","0.23.28","0.23.29","0.23.3","0.23.30","0.23.31","0.23.32","0.23.33","0.23.34","0.23.4","0.23.5","0.23.6","0.23.7","0.23.8","0.23.9"]},{"source":"osv","ecosystem":"Maven","package":"org.http4s:http4s-ember-core_2.13","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"1.0.0-M1"},{"fixed":"1.0.0-M47"}]}],"versions":["1.0.0-M10","1.0.0-M11","1.0.0-M13","1.0.0-M14","1.0.0-M15","1.0.0-M16","1.0.0-M17","1.0.0-M18","1.0.0-M19","1.0.0-M2","1.0.0-M20","1.0.0-M21","1.0.0-M22","1.0.0-M23","1.0.0-M24","1.0.0-M25","1.0.0-M27","1.0.0-M28","1.0.0-M29","1.0.0-M3","1.0.0-M30","1.0.0-M31","1.0.0-M32","1.0.0-M33","1.0.0-M34","1.0.0-M35","1.0.0-M36","1.0.0-M37","1.0.0-M38","1.0.0-M39","1.0.0-M4","1.0.0-M40","1.0.0-M41","1.0.0-M42","1.0.0-M43","1.0.0-M44","1.0.0-M45","1.0.0-M46","1.0.0-M5","1.0.0-M6","1.0.0-M7","1.0.0-M8","1.0.0-M9"]},{"source":"osv","ecosystem":"Maven","package":"org.http4s:http4s-ember-core_3","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"1.0.0-M1"},{"fixed":"1.0.0-M47"}]}],"versions":["1.0.0-M22","1.0.0-M23","1.0.0-M24","1.0.0-M25","1.0.0-M27","1.0.0-M28","1.0.0-M29","1.0.0-M30","1.0.0-M31","1.0.0-M32","1.0.0-M33","1.0.0-M34","1.0.0-M35","1.0.0-M36","1.0.0-M37","1.0.0-M38","1.0.0-M39","1.0.0-M40","1.0.0-M41","1.0.0-M42","1.0.0-M43","1.0.0-M44","1.0.0-M45","1.0.0-M46"]}],"products":[{"vendor":"http4s","product":"http4s"}],"references":[{"url":"https://github.com/http4s/http4s/security/advisories/GHSA-9xww-74xv-gjfp","tags":["x_refsource_CONFIRM","advisory","web"]},{"url":"https://github.com/http4s/http4s/commit/7f065101c45f3d86bc105e8fc6323c2c4a11471f","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/http4s/http4s/releases/tag/v0.23.35","tags":["x_refsource_MISC","web"]},{"url":"https://github.com/http4s/http4s/releases/tag/v1.0.0-M47","tags":["x_refsource_MISC","web"]},{"url":"https://github.com/advisories/GHSA-9xww-74xv-gjfp"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/69xxx/CVE-2026-69206.json","tags":["advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-69206","tags":["advisory"]},{"url":"https://github.com/http4s/http4s","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-69206","title":"Http4s: DigestAuth allows replay of captured requests","description":"Http4s is a Scala interface for HTTP services. Prior to 0.23.35 and 1.0.0-M47, DigestAuth replay protection records lastNc plus one instead of the highest nonce-count value it has accepted. When a legitimate client sends noncontiguous nc values because of parallel or retried requests, the stored counter remains below the accepted maximum, allowing a passive observer to replay a captured Authorization header multiple times. Successful replays execute authenticated requests, including state-changing operations, as the captured user. This issue is fixed in versions 0.23.35 and 1.0.0-M47.","status":"published","published":"2026-09-15T19:29:40.341Z","modified":"2026-09-16T17:45:17.854Z","cvss":[{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N","level":"medium","assessor":"cna"}],"cwes":["CWE-294"],"updated_at":"2026-11-02T13:50:16.178634Z"}],"euvd":[{"id":"EUVD-2026-79236","description":"Http4s is a Scala interface for HTTP services. Prior to 0.23.35 and 1.0.0-M47, DigestAuth replay protection records lastNc plus one instead of the highest nonce-count value it has accepted. When a legitimate client sends noncontiguous nc values because of parallel or retried requests, the stored counter remains below the accepted maximum, allowing a passive observer to replay a captured Authorization header multiple times. Successful replays execute authenticated requests, including state-changing operations, as the captured user. This issue is fixed in versions 0.23.35 and 1.0.0-M47.","status":"published","published":"2026-09-15T19:29:40Z","modified":"2026-09-16T17:45:17Z","cvss":[{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N","level":"medium"}],"updated_at":"2026-11-02T17:28:15.055852Z"}],"ghsa":[{"id":"GHSA-9xww-74xv-gjfp","title":"Http4s: DigestAuth allows replay of captured requests","description":"The `DigestAuth` replay defence stores `lastNc + 1` rather than the nonce-count (`nc`) value it just accepted. When a legitimate client sends non-contiguous `nc` values (parallel or retried requests, as browsers do), the server's counter lags behind the highest `nc` seen, and a captured `Authorization` header can be replayed multiple times.\n\n## Impact\n\nA passive observer can turn one captured Digest-authenticated request into several replayed authenticated (state-changing) requests, defeating the core\nreplay protection Digest provides over Basic.\n\n## Preconditions\n\n- Application uses `DigestAuth`.\n- Attacker can passively observe at least one legitimate digest request.\n- Legitimate client emits an `nc` more than one greater than the last, for instance from a parallel or retried request.\n\n## Workarounds\n\n- Deploy over TLS so requests cannot be captured.","status":"published","published":"2026-09-15T19:54:32Z","modified":"2026-09-15T19:54:33Z","cvss":[{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N","level":"medium"}],"cwes":["CWE-294"],"updated_at":"2026-11-02T14:41:17.136201Z"}],"nvd":[{"id":"CVE-2026-69206","description":"Http4s is a Scala interface for HTTP services. Prior to 0.23.35 and 1.0.0-M47, DigestAuth replay protection records lastNc plus one instead of the highest nonce-count value it has accepted. When a legitimate client sends noncontiguous nc values because of parallel or retried requests, the stored counter remains below the accepted maximum, allowing a passive observer to replay a captured Authorization header multiple times. Successful replays execute authenticated requests, including state-changing operations, as the captured user. This issue is fixed in versions 0.23.35 and 1.0.0-M47.","status":"published","published":"2026-09-15T20:17:40.18Z","modified":"2026-09-16T20:39:16.61Z","cvss":[{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N","level":"medium","assessor":"secondary"}],"cwes":["CWE-294"],"updated_at":"2026-11-02T14:12:47.974509Z"}],"osv":[{"id":"CVE-2026-69206","title":"Http4s: DigestAuth allows replay of captured requests","description":"Http4s is a Scala interface for HTTP services. Prior to 0.23.35 and 1.0.0-M47, DigestAuth replay protection records lastNc plus one instead of the highest nonce-count value it has accepted. When a legitimate client sends noncontiguous nc values because of parallel or retried requests, the stored counter remains below the accepted maximum, allowing a passive observer to replay a captured Authorization header multiple times. Successful replays execute authenticated requests, including state-changing operations, as the captured user. This issue is fixed in versions 0.23.35 and 1.0.0-M47.","status":"published","published":"2026-09-15T19:29:40.341Z","modified":"2026-10-28T02:30:28.99633695Z","cvss":[{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N","level":"medium"}],"cwes":["CWE-294"],"updated_at":"2026-11-02T15:45:15.164658Z"},{"id":"GHSA-9xww-74xv-gjfp","title":"Http4s: DigestAuth allows replay of captured requests","description":"The `DigestAuth` replay defence stores `lastNc + 1` rather than the nonce-count (`nc`) value it just accepted. When a legitimate client sends non-contiguous `nc` values (parallel or retried requests, as browsers do), the server's counter lags behind the highest `nc` seen, and a captured `Authorization` header can be replayed multiple times.\n\n## Impact\n\nA passive observer can turn one captured Digest-authenticated request into several replayed authenticated (state-changing) requests, defeating the core\nreplay protection Digest provides over Basic.\n\n## Preconditions\n\n- Application uses `DigestAuth`.\n- Attacker can passively observe at least one legitimate digest request.\n- Legitimate client emits an `nc` more than one greater than the last, for instance from a parallel or retried request.\n\n## Workarounds\n\n- Deploy over TLS so requests cannot be captured.","status":"published","published":"2026-09-15T19:54:32Z","modified":"2026-09-15T20:00:39.601196817Z","cvss":[{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N","level":"medium"}],"cwes":["CWE-294"],"updated_at":"2026-11-02T15:46:44.225359Z"}]}}
