On Sunday 16 January 2022 at 17:19 UTC, a HTTP GET flood targeted a education platform customer in Latin America. The attack peaked at 886.1 million requests per second and lasted 180 minutes. Traffic originated from 1894 autonomous systems in 69 countries, predominantly hijacked home routers.
| Vector | HTTP GET flood |
| Peak | 886.1 million requests per second |
| Duration | 180 min |
| Time to mitigation | 0.168 s |
| Attack traffic reaching origin | 0.065% |
| Legitimate traffic challenged | 0.04% |
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 155 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
Checkout conversion was unchanged compared with the same hour of the previous week.
Recommendations
- Review allow-listed partner ranges quarterly.
- Keep origin IPs out of public DNS history.
- Enable authenticated origin pulls.
Is the risk score exposed in the logs so we can build our own dashboards on it?
Good question. We will cover that in a follow-up post.
Any plans to support per-tenant limits keyed on a JWT claim?
Machine-readable ranges are at /ips.json and via the API.
Carpet bombing is nasty. Good to see a clear explanation of it.
The billing model is what got our finance team on board, honestly.
Any plans to support per-tenant limits keyed on a JWT claim?
Interesting that most attacks are under ten minutes. Our experience is similar.
How does the proof-of-work challenge behave on older Android devices? Any numbers below Android 10?
Our auditors asked for exactly this kind of incident evidence under DORA.