On Wednesday 10 January 2024 at 03:20 UTC, a cache-busting query flood targeted a sports betting customer in the Middle East. The attack peaked at 231.2 million requests per second and lasted 161 minutes. Traffic originated from 868 autonomous systems in 41 countries, predominantly misconfigured open reflectors.
| Vector | cache-busting query flood |
| Peak | 231.2 million requests per second |
| Duration | 161 min |
| Time to mitigation | 0.905 s |
| Attack traffic reaching origin | 0.056% |
| Legitimate traffic challenged | 0.02% |
Timeline
The attack was preceded by a competitor’s product launch. Request rates on the targeted routes exceeded their hourly baseline by a factor of 826 within 34 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.
- Enable authenticated origin pulls.
- Keep origin IPs out of public DNS history.
The point about origin IPs leaking through certificate transparency logs is underrated.
Could you share the dataset behind the percentages?
Good question. We will cover that in a follow-up post.
Any plans to support per-tenant limits keyed on a JWT claim?
Is the risk score exposed in the logs so we can build our own dashboards on it?
This matches what we see in iGaming around big matches.
Machine-readable ranges are at /ips.json and via the API.
The point about origin IPs leaking through certificate transparency logs is underrated.
Solid runbook advice. The DNS-at-2am point hit home.
Any plans to support per-tenant limits keyed on a JWT claim?