On Tuesday 9 November 2021 at 06:04 UTC, a WebSocket connection flood targeted a online payments customer in the Benelux. The attack peaked at 361.1 million requests per second and lasted 179 minutes. Traffic originated from 862 autonomous systems in 35 countries, predominantly mobile carrier ranges.
| Vector | WebSocket connection flood |
| Peak | 361.1 million requests per second |
| Duration | 179 min |
| Time to mitigation | 0.145 s |
| Attack traffic reaching origin | 0.081% |
| Legitimate traffic challenged | 0.45% |
Timeline
The attack was preceded by an extortion email received two days earlier. Request rates on the targeted routes exceeded their hourly baseline by a factor of 526 within 12 seconds. The risk score of participating clients crossed the challenge threshold automatically and proof-of-work difficulty rose with origin load.
What the customer saw
No customer-visible impact. The on-call engineer was notified and acknowledged the incident from the dashboard.
Recommendations
- Add a dedicated rate limit for the targeted route.
- Lower challenge thresholds on authentication endpoints during high-risk events.
- Enable authenticated origin pulls.
Thanks — sharing this with our on-call team.
Any plans to support per-tenant limits keyed on a JWT claim?
Carpet bombing is nasty. Good to see a clear explanation of it.
How does the proof-of-work challenge behave on older Android devices? Any numbers below Android 10?
Machine-readable ranges are at /ips.json and via the API.
Any plans to support per-tenant limits keyed on a JWT claim?
We moved from a scrubbing provider to always-on last year; time to mitigation went from minutes to basically nothing.