On Sunday 14 May 2023 at 00:34 UTC, a WebSocket connection flood targeted a airline booking customer in Western Europe. The attack peaked at 938.7 million requests per second and lasted 102 minutes. Traffic originated from 1589 autonomous systems in 89 countries, predominantly compromised cloud VMs.
| Vector | WebSocket connection flood |
| Peak | 938.7 million requests per second |
| Duration | 102 min |
| Time to mitigation | 0.546 s |
| Attack traffic reaching origin | 0.000% |
| Legitimate traffic challenged | 0.11% |
Timeline
The attack was preceded by a hacktivist channel announcing the target. Request rates on the targeted routes exceeded their hourly baseline by a factor of 741 within 8 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
- Enable log streaming to your SIEM for faster correlation.
- Lower challenge thresholds on authentication endpoints during high-risk events.
- Enable authenticated origin pulls.
Would love a follow-up on how you handle HTTP/3 fingerprinting.
Thanks! Yes — the risk score and its components are included in every log record.
This matches what we see in iGaming around big matches.
We had the exact false-positive issue with CGNAT carriers. The weighting change makes sense.
Machine-readable ranges are at /ips.json and via the API.
Great write-up. We saw almost the same pattern on our login endpoint last month.
How does the proof-of-work challenge behave on older Android devices? Any numbers below Android 10?
Do you publish the edge IP ranges in a machine-readable format?
Carpet bombing is nasty. Good to see a clear explanation of it.
Thanks! Yes — the risk score and its components are included in every log record.