On Sunday 7 August 2022 at 04:41 UTC, a TLS handshake exhaustion targeted a fashion retail customer in the UK. The attack peaked at 85.3 million requests per second and lasted 162 minutes. Traffic originated from 3017 autonomous systems in 73 countries, predominantly a rented booter service.
| Vector | TLS handshake exhaustion |
| Peak | 85.3 million requests per second |
| Duration | 162 min |
| Time to mitigation | 0.364 s |
| Attack traffic reaching origin | 0.051% |
| Legitimate traffic challenged | 0.38% |
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 603 within 22 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
- Enable authenticated origin pulls.
- Keep origin IPs out of public DNS history.
- Add a dedicated rate limit for the targeted route.
We had the exact false-positive issue with CGNAT carriers. The weighting change makes sense.
Good question. We will cover that in a follow-up post.
Our auditors asked for exactly this kind of incident evidence under DORA.
How does the proof-of-work challenge behave on older Android devices? Any numbers below Android 10?
Any plans to support per-tenant limits keyed on a JWT claim?
Thanks! Yes — the risk score and its components are included in every log record.
Interesting that most attacks are under ten minutes. Our experience is similar.
Interesting that most attacks are under ten minutes. Our experience is similar.
Clear and practical, thanks.
Is the risk score exposed in the logs so we can build our own dashboards on it?