On Saturday 25 February 2023 at 16:14 UTC, a HTTP GET flood targeted a online payments customer in the Nordics. The attack peaked at 447.5 million requests per second and lasted 90 minutes. Traffic originated from 1581 autonomous systems in 110 countries, predominantly misconfigured open reflectors.
| Vector | HTTP GET flood |
| Peak | 447.5 million requests per second |
| Duration | 90 min |
| Time to mitigation | 0.673 s |
| Attack traffic reaching origin | 0.009% |
| Legitimate traffic challenged | 0.79% |
Timeline
The attack was preceded by a ransom note demanding payment in Monero. Request rates on the targeted routes exceeded their hourly baseline by a factor of 892 within 11 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
- Keep origin IPs out of public DNS history.
- Enable authenticated origin pulls.
- Add a dedicated rate limit for the targeted route.
Interesting that most attacks are under ten minutes. Our experience is similar.
Solid runbook advice. The DNS-at-2am point hit home.
This matches what we see in iGaming around big matches.
Any plans to support per-tenant limits keyed on a JWT claim?
How does the proof-of-work challenge behave on older Android devices? Any numbers below Android 10?
Thanks! Yes — the risk score and its components are included in every log record.
Would love a follow-up on how you handle HTTP/3 fingerprinting.