CVE-2026-17673
Overview
Files Changed
DEPSnet/third_party/quiche/README.chromiumnet/third_party/quiche/src
Patch
From 1dd7e59295c6cfb8a120af720debec3bb4e51c54 Mon Sep 17 00:00:00 2001
From: Patrick Meenan <pmeenan@chromium.org>
Date: Mon, 01 Jun 2026 18:28:33 -0700
Subject: [PATCH] Roll src/net/third_party/quiche/src/ 997d65430..31bcbe18e (9 commits)
https://quiche.googlesource.com/quiche.git/+log/997d654308b6..31bcbe18e357
$ git log 997d65430..31bcbe18e --date=short --no-merges --format='%ad %ae %s'
2026-06-01 haoyuewang No public description
2026-06-01 martinduke Get rid of MoqtUpstreamFetch::LocationIsValid because FETCH streams are diff-encoded; Malformed Tracks are no longer possible to encode in a FETCH stream.
2026-06-01 martinduke Move parameter handling from session to RemoteTrack.
2026-05-29 quiche-dev Fix 1 ClangTidyReadability finding: * function 'ClientFullyConnected' has inline specifier but is implicitly inlined. For more info, see go/clang_tidy/checks/readability-redundant-inline-specifier
2026-05-29 dschinazi Improve socket fd logging in MasqueConnectionPool
2026-05-29 rch No public description
2026-05-29 dschinazi Fix OHTTP test client status checks
2026-05-29 diannahu No public description
2026-05-29 dschinazi Handle GOAWAY gracefully in MasqueH2Connection
Created with:
roll-dep src/net/third_party/quiche/src src/third_party/quic_trace/src
Bug: 513735177
Change-Id: Ie1c2c33ef33fecb89965673b578f079fa150e004
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7890986
Commit-Queue: Patrick Meenan <pmeenan@chromium.org>
Reviewed-by: Nidhi Jaju <nidhijaju@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1639845}
---
diff --git a/DEPS b/DEPS
index 555d263..cd7b84e 100644
--- a/DEPS
+++ b/DEPS
@@ -435,7 +435,7 @@
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling feed
# and whatever else without interference from each other.
- 'quiche_revision': '997d654308b6a1a17435e472ef5190aecb12e3eb',
+ 'quiche_revision': '31bcbe18e357974ea51e068867ba98ccea05fef0',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling ink
# and whatever else without interference from each other.
diff --git a/net/third_party/quiche/README.chromium b/net/third_party/quiche/README.chromium
index ed8e1f5..545eda7 100644
--- a/net/third_party/quiche/README.chromium
+++ b/net/third_party/quiche/README.chromium
@@ -1,6 +1,6 @@
Name: QUICHE
URL: https://quiche.googlesource.com/quiche
-Revision: 997d654308b6a1a17435e472ef5190aecb12e3eb
+Revision: 31bcbe18e357974ea51e068867ba98ccea05fef0
Version: git
Update Mechanism: Manual
License: BSD-3-Clause
diff --git a/net/third_party/quiche/src b/net/third_party/quiche/src
index 997d654..31bcbe1 160000
--- a/net/third_party/quiche/src
+++ b/net/third_party/quiche/src
@@ -1 +1 @@
-Subproject commit 997d654308b6a1a17435e472ef5190aecb12e3eb
+Subproject commit 31bcbe18e357974ea51e068867ba98ccea05fef0
Original Bug Report
Potential Heap OOB Write in http2::HuffmanEncode via 32-bit Integer Overflow
Project Fortify, an experimental security project, has identified the following potential security issue. If you’re a feature owner CC-ed on this bug, please do your best to review these reports. Please see https://chromium.googlesource.com/chromium/src/+/main/docs/security/ai-generated-security-bugs-faq.md for more information.
Overview: A 32-bit integer overflow in Huffman size calculation can lead to an undersized heap allocation. This results in a potential linear heap out-of-bounds write in the browser process on 32-bit Android devices when processing large HTTP headers.
Affected files:
net/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_encoder.ccnet/third_party/quiche/src/quiche/http2/hpack/hpack_encoder.ccnet/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_encoder.cc
Estimated timestamp from git blame: 2020-10-04
Summary
On 32-bit platforms, a potential integer overflow in http2::HuffmanSize() can lead to a heap out-of-bounds (OOB) write in http2::HuffmanEncode(). This issue arises when calculating the total bit length of a large input string during HPACK or QPACK encoding. On Android, where the Network Service typically runs within the browser process, this could potentially be exploited by a compromised renderer to achieve a sandbox escape.
Root Cause Analysis
The issue is located in net/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_encoder.cc. The function HuffmanSize calculates the total number of bits required for encoding:
size_t HuffmanSize(absl::string_view plain) {
size_t bits = 0;
for (const uint8_t c : plain) {
bits += HuffmanSpecTables::kCodeLengths[c];
}
return (bits + 7) / 8;
}
On 32-bit systems, size_t is 32 bits. The maximum Huffman code length is 30 bits. An input string of approximately 143 million bytes (e.g., repeating a byte with a 30-bit code) will cause the bits counter to overflow. For instance, 143,165,577 iterations of a 30-bit code length results in a total of 4,294,967,310 bits, which overflows a 32-bit integer to the value 14. The function then returns an incorrectly small size (e.g., 2 bytes).
Subsequently, HuffmanEncode uses this overflowed size to allocate the output buffer:
void HuffmanEncode(absl::string_view input, size_t encoded_size,
std::string* output) {
const size_t original_size = output->size();
const size_t final_size = original_size + encoded_size;
output->resize(final_size + 4, 0);
// ...
size_t bit_counter = 0;
for (uint8_t c : input) {
char* const current = first + (bit_counter / 8);
bit_counter += HuffmanSpecTables::kCodeLengths[c];
*current |= code >> 32;
// ... potential OOB writes occur here
}
}
Because encoded_size is incorrectly small, output->resize creates an undersized buffer. However, the encoding loop continues to process the full input string, using bit_counter to calculate write offsets, leading to a potential linear heap OOB write.
Potential Attack Vector
A compromised renderer process could potentially trigger this by sending a very large HTTP header (e.g., ~140 MiB) via the network.mojom.URLLoaderFactory Mojo interface. On 32-bit Android, the Network Service runs in the browser process by default, meaning this corruption would occur in a high-privilege context.
Suggested Fix
- Modify
HuffmanSizeandHuffmanEncodeto use 64-bit integers (uint64_t) for bit counters to prevent overflows on 32-bit platforms. - Add explicit checks in
HuffmanSizeto handle cases where the calculated size would exceed platform limits. - Ensure that
HuffmanEncodeverifies the consistency of the providedencoded_sizewith a check that remains active in release builds.
Evaluated with Chrome root at commit: 1a8d40fc44df2088d5945c0bf53584038aa1614a
Results so far have been promising, but there can be wrong deductions. Feel free to adjust as follows:
- If you are familiar with the severity guidelines, you may adjust the severity.
- If this is a false positive, and there’s no work to be done, please close as WAI.
- If there is work to do here but not a vulnerability, please change the issue type to Task/Bug/FR.
Data from false positives will be used to improve accuracy over time. And please feel free to reach out to me directly if you have concerns or feedback on the project.