On Wednesday 22 March 2023 at 01:56 UTC, a TLS handshake exhaustion targeted a retail banking customer in the UK. The attack peaked at 390.9 million requests per second and lasted 110 minutes. Traffic originated from 4196 autonomous systems in 114 countries, predominantly misconfigured open reflectors.
| Vector | TLS handshake exhaustion |
| Peak | 390.9 million requests per second |
| Duration | 110 min |
| Time to mitigation | 0.466 s |
| Attack traffic reaching origin | 0.031% |
| Legitimate traffic challenged | 0.21% |
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 97 within 29 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
The customer’s status page stayed green throughout; they learned about the attack from our notification.
Recommendations
- Review allow-listed partner ranges quarterly.
- Keep origin IPs out of public DNS history.
- Lower challenge thresholds on authentication endpoints during high-risk events.
Our auditors asked for exactly this kind of incident evidence under DORA.
Machine-readable ranges are at /ips.json and via the API.
Solid runbook advice. The DNS-at-2am point hit home.
We moved from a scrubbing provider to always-on last year; time to mitigation went from minutes to basically nothing.
Clear and practical, thanks.
Thanks! Yes — the risk score and its components are included in every log record.
Could you share the dataset behind the percentages?
How do you avoid challenging uptime monitors and partners?
Any plans to support per-tenant limits keyed on a JWT claim?
Machine-readable ranges are at /ips.json and via the API.
Is the risk score exposed in the logs so we can build our own dashboards on it?