-
Notifications
You must be signed in to change notification settings - Fork 18.4k
Description
This is a followup to CVE-2023-44487/CVE-2023-39325.
The fix shipped is a very welcome change and nicely caps the number of handlers in the system. However, it's still insufficient in certain cases, for example kube and some of our own services. It is difficult to impossible in practice to tweak MAX_CONCURRENT_STREAMS below 100 without hitting client compatibility issues, and even at 100 the rapid reset attack may incur significant resource use, especially in cases where the go server is a gateway to other heavyweight services.
A wide number of mitigations have been deployed in other stacks; a non-exhaustive summary:
- a token bucket rate limiter across all http2 frames (this has proven to be effective even against new attacks; some projects put these in place after the 2019 http2 vulnerabilities and were not affected by this latest issue), then terminating connection
- a token bucket rate limiter strictly for RST_STREAM frames, then terminating connection
- heuristics for tracking total "overhead" frames, then terminating connection
- delays in processing new frames on connections that are exhibiting unusual behavior
The thing all these mitigations have in common is visibility into the types of frames flowing over a connection. Additionally, this level of visibility is necessary to produce metrics and get insights into what attacks are even being seen, something that is not possible with the current APIs.
Proposal is to add a single callback hook that would receive basic frame information scoped to the individual connection: frame type, frame length, and stream ID. The callback's return value may trigger termination of the connection. With this hook, all necessary metrics can be gathered and all mentioned variants of frame policers may be built. The default is unset and will have no changes to out of the box behavior.
Attached is a patch that we deployed to build our mitigation for the CVE -
0001-introducing-ConnectionCalmer.patch
Metadata
Metadata
Assignees
Labels
Type
Projects
Status