Denial-of-Service in gRPC
- Published
- Last modified
- Where the record stands: published, rejected by its publisher, or superseded by another id.What do these mean? →
- published
- Whether CISA lists it in its Known Exploited Vulnerabilities catalog: proof that attackers are using it.What do these mean? →
- Not listed in CISA KEV
- Fix
- Fixed in 1.56.1, 1.53.2, 1.54.3, 1.55.2, 1.56.2
- Whether working attack code is public (Exploit-DB, Metasploit, Nuclei or GitHub). Public code makes attacks easier.What do these mean? →
- None on Exploit-DB, Metasploit or GitHub
- Exploitation: none
- Automatable: yes
- Technical impact: partial
Summary
gRPC contains a vulnerability that allows hpack table accounting errors could lead to unwanted disconnects between clients and servers in exceptional cases/ Three vectors were found that allow the following DOS attacks: • Unbounded memory buffering in the HPACK parser • Unbounded CPU consumption in the HPACK parser The unbounded CPU consumption is down to a copy that occurred per-input-block in the parser, and because that could be unbounded due to the memory copy bug we end up with an O(n^2) parsing loop, with n selected by the client. The unbounded memory buffering bugs: • The header size limit check was behind the string reading code, so we needed to first buffer up to a 4 gigabyte string before rejecting it as longer than 8 or 16kb. • HPACK varints have an encoding quirk whereby an infinite number of 0’s can be added at the start of an integer. gRPC’s hpack parser needed to read all of them before concluding a parse. • gRPC’s metadata overflow check was performed per frame, so that the following sequence of frames could cause infinite buffering: HEADERS: containing a: 1 CONTINUATION: containing a: 2 CONTINUATION: containing a: 3 etc…
Timeline
- CVE published
- CISA SSVC assessment
Exploitation: none · Automatable: yes · Technical impact: partial
- Record last updated
Affected versions
- Google gRPC
fixed in 1.56.1
- grpcioPyPI
fixed in 1.53.2
- grpcioPyPI
From 1.54.0 · fixed in 1.54.3
- grpcioPyPI
From 1.55.0 · fixed in 1.55.2
- grpcioPyPI
From 1.56.0 · fixed in 1.56.2
- grpcRubyGems
fixed in 1.53.2
- grpcRubyGems
From 1.54.0 · fixed in 1.54.3
- grpcRubyGems
From 1.55.0 · fixed in 1.55.2
- grpcRubyGems
From 1.56.0 · fixed in 1.56.2
- grpcioPyPI
fixed in 1.53.2; From 1.54.0 · fixed in 1.54.3; From 1.55.0 · fixed in 1.55.2; From 1.56.0 · fixed in 1.56.2