{"id":"GHSA-h2v8-394m-p7vv","revision":null,"records":[{"revision":"ee8e40a10944493280ec12309b5e229a","observedAt":"2026-10-27T16:45:46.193+00:00","statement":{"source":"osv","id":"GHSA-h2v8-394m-p7vv","aliases":["RUSTSEC-2026-0348"],"title":"Rustls: Brotli certificate decompression can allocate an attacker-controlled amount of memory up to 1 GiB before authentication.","description":"### Summary\n\nThe built-in (but disabled by default) Brotli certificate decoder bounds the output buffer but accepts an input-selected history window. A header of five bytes can specify a 1 GiB window allocation. A peer can abort a process whose allocator cannot satisfy that request. A client must enable Brotli and connect to the peer; a server must enable Brotli and request a client certificate. Neither direction requires a trusted attacker certificate.\n\n### Details\n\nrustls calls `BrotliDecompress` which enables Brotli's large-window extension. rustls applies a limit to certificates, but this applies to the decompressed result, and not to any internal allocations the process requires.\n\n### Impact\n\nClient applications that enable the `brotli` feature will be vulnerable to malicious servers. Server applications that enable the `brotli` feature and enable client authentication will be vulnerable to malicious clients.\n\nPotential for denial of service due to memory exhaustion from peers sending malicious Brotli-encoded certificates, for applications that enable Brotli decompression.\n\n### Acknowledgement\nThanks to OpenAI [OutboundDisclosures@openai.com](mailto:OutboundDisclosures@openai.com) for the disclosure.","state":0,"publishedAt":"2026-10-27T16:08:36+00:00","modifiedAt":"2026-10-27T16:15:05.3378195+00:00","affected":[{"ecosystem":"crates.io","name":"rustls","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"0.23.46"}]}],"versions":[],"rawVersionEvidence":null},{"ecosystem":"crates.io","name":"rustls","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0.24.0-dev.1"},{"kind":"fixed","version":"0.24.0-dev.2"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"LOW"}],"references":["https://github.com/rustls/rustls/security/advisories/GHSA-h2v8-394m-p7vv","https://github.com/rustls/rustls/pull/3297","https://github.com/rustls/rustls/pull/3354","https://github.com/rustls/rustls/commit/1aa987af37d0d79b98781d345895ac0059ce345c","https://github.com/rustls/rustls/commit/402b7b78b7ae87d59e19cf07ee07f3fc19e6537e","https://github.com/rustls/rustls","https://github.com/rustls/rustls/releases/tag/v/0.23.46","https://rustsec.org/advisories/RUSTSEC-2026-0348.html"],"sourceUrl":"https://github.com/advisories/GHSA-h2v8-394m-p7vv","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-h2v8-394m-p7vv","identifiers":["GHSA-h2v8-394m-p7vv","RUSTSEC-2026-0348"]},"retained":false,"historicalAffected":[]},{"revision":"80920544afe848e4acd8e7c92f704d18","observedAt":"2026-10-24T13:19:54.901+00:00","statement":{"source":"osv","id":"RUSTSEC-2026-0348","aliases":["GHSA-h2v8-394m-p7vv"],"title":"Brotli certificate decompression can allocate up to 1 GiB before authentication","description":"The built-in Brotli certificate decompressor (enabled by the non-default\n`brotli` crate feature) bounded the size of the decompressed output, but\naccepted a peer-selected history window. Brotli's large-window extension was\nenabled, so a five-byte header could cause an allocation of 1 GiB. A peer can\nabort a process whose allocator cannot satisfy that request.\n\nNo trusted certificate is required by the attacker. Affected configurations are:\n\n- clients that enable the `brotli` feature and connect to a malicious server, and\n- servers that enable the `brotli` feature and request client certificates.\n\nApplications that do not enable the `brotli` feature are not affected.","state":0,"publishedAt":"2026-10-14T12:00:00+00:00","modifiedAt":"2026-10-14T13:30:02.4809253+00:00","affected":[{"ecosystem":"crates.io","name":"rustls","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0.23.9"},{"kind":"fixed","version":"0.23.46"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L","score":null,"severity":null}],"references":["https://crates.io/crates/rustls","https://rustsec.org/advisories/RUSTSEC-2026-0348.html","https://github.com/rustls/rustls/pull/3297"],"sourceUrl":"https://osv.dev/vulnerability/RUSTSEC-2026-0348","license":"OSV · upstream source license applies","key":"osv:RUSTSEC-2026-0348","identifiers":["RUSTSEC-2026-0348","GHSA-h2v8-394m-p7vv"]},"retained":false,"historicalAffected":[]}],"coverage":[{"source":"cisa-kev:global","scope":"Complete CISA KEV catalog; all vendors. Missing entries do not establish absence of exploitation.","generation":"2026-10-30T14:45:26.6987549+00:00","complete":true,"records":1764,"lastAttemptAt":"2026-10-30T14:45:26.6987549+00:00","lastSuccessAt":"2026-10-30T14:45:26.9497648+00:00","error":null,"lastVerifiedAt":"2026-10-30T14:45:26.9497653+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"cve-program","scope":"Official CVE Program baseline and cumulative hourly delta; all vendors, published and rejected records","generation":"cve-7e2c4e7288f2c464ad8c61f3bb6017374714faedcc781283ac06a706ee1a820b-9ae73af7991357f8171c14345365990a8a2ca2ac30d2f5c0345295ca47cd8b59","complete":true,"records":417062,"lastAttemptAt":"2026-10-30T14:45:26.2761545+00:00","lastSuccessAt":"2026-10-30T13:45:42.363036+00:00","error":null,"lastVerifiedAt":"2026-10-30T14:45:26.2761545+00:00","snapshotPublishedAt":"2026-10-30T13:19:40+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"euvd","scope":"Rolling EUVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global EUVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-2061c7564831481480eca7336a6a2d59","complete":false,"records":13525,"lastAttemptAt":"2026-10-30T14:57:22.1548673+00:00","lastSuccessAt":"2026-10-30T14:57:22.151+00:00","error":"74 identifier lookups failed; latest failures include HTTP 403. Other identifiers were checked independently.","lastVerifiedAt":"2026-10-30T14:57:22.151+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":12100,"expectedIdentifiers":13603,"failedIdentifiers":74},{"source":"first-epss:nuget","scope":"FIRST EPSS for explicit CVE aliases in the collected public NuGet archive. Not a global EPSS backfill.","generation":"2026-10-30T14:45:26.6987549+00:00","complete":true,"records":1094,"lastAttemptAt":"2026-10-30T14:45:26.6987549+00:00","lastSuccessAt":"2026-10-30T14:45:26.9516817+00:00","error":null,"lastVerifiedAt":"2026-10-30T14:45:26.951682+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"nvd","scope":"Rolling NVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global NVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-6a13c6f8f39a448a8b96c895e97b0fc8","complete":true,"records":13543,"lastAttemptAt":"2026-10-30T14:45:34.6994115+00:00","lastSuccessAt":"2026-10-30T14:45:34.696+00:00","error":null,"lastVerifiedAt":"2026-10-30T14:45:34.696+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13603,"expectedIdentifiers":13603,"failedIdentifiers":0},{"source":"osv:Go","scope":"Complete OSV Go ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"go-b597efeb8fc540d31a792e2148f8b153f027cb0902f6eec1f988f717bba80dd6","complete":true,"records":9806,"lastAttemptAt":"2026-10-30T14:45:26.6211704+00:00","lastSuccessAt":"2026-10-30T11:49:32.1566+00:00","error":null,"lastVerifiedAt":"2026-10-30T14:45:26.6211704+00:00","snapshotPublishedAt":"2026-10-30T11:03:04+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:NuGet","scope":"Complete OSV NuGet ecosystem archive, including GitHub Advisory Database records; NuGet version matching only","generation":"nuget-2de9ccc5290f060c7aa63f89c25dd76f655a64ba1aba7c05c97fa3bee4f09899","complete":true,"records":1967,"lastAttemptAt":"2026-10-30T14:45:26.3367706+00:00","lastSuccessAt":"2026-10-28T20:55:34.2982937+00:00","error":null,"lastVerifiedAt":"2026-10-30T14:45:26.3367706+00:00","snapshotPublishedAt":"2026-10-28T20:03:08+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:crates.io","scope":"Complete OSV crates.io ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"crates.io-f63fa91e750071ae88c9f82019ecd6c982fa4fcc1d3dc5ceb5d9c642fb6bf05c","complete":true,"records":3023,"lastAttemptAt":"2026-10-30T14:45:26.6363468+00:00","lastSuccessAt":"2026-10-30T11:49:36.4759887+00:00","error":null,"lastVerifiedAt":"2026-10-30T14:45:26.6363468+00:00","snapshotPublishedAt":"2026-10-30T11:18:14+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:npm","scope":"Complete OSV npm ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"npm-38769c8a86ea1c9a6224e5523e119bd23337098bd8f535cc5952f8ec88cdd622","complete":true,"records":230950,"lastAttemptAt":"2026-10-30T14:45:26.5064351+00:00","lastSuccessAt":"2026-10-30T13:47:22.3495471+00:00","error":null,"lastVerifiedAt":"2026-10-30T14:45:26.5064351+00:00","snapshotPublishedAt":"2026-10-30T13:33:12+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}