On Friday 26 December 2025 at 00:00 UTC, a credential stuffing targeted a municipal services customer in Iberia. The attack peaked at 55.9 million requests per second and lasted 85 minutes. Traffic originated from 1475 autonomous systems in 105 countries, predominantly misconfigured open reflectors.
| Vector | credential stuffing |
| Peak | 55.9 million requests per second |
| Duration | 85 min |
| Time to mitigation | 0.224 s |
| Attack traffic reaching origin | 0.029% |
| Legitimate traffic challenged | 0.32% |
Timeline
The attack was preceded by no stated motive. Request rates on the targeted routes exceeded their hourly baseline by a factor of 238 within 12 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
A brief increase in p99 latency of 169 ms during the first minute, then normal service.
Recommendations
- Review allow-listed partner ranges quarterly.
- Add a dedicated rate limit for the targeted route.
- Keep origin IPs out of public DNS history.
Could you share the dataset behind the percentages?
How does the proof-of-work challenge behave on older Android devices? Any numbers below Android 10?
The point about origin IPs leaking through certificate transparency logs is underrated.
Great to hear, thanks for sharing your experience.
Any plans to support per-tenant limits keyed on a JWT claim?
The point about origin IPs leaking through certificate transparency logs is underrated.
Good question. We will cover that in a follow-up post.
This matches what we see in iGaming around big matches.
Machine-readable ranges are at /ips.json and via the API.
How do you avoid challenging uptime monitors and partners?
Machine-readable ranges are at /ips.json and via the API.
We had the exact false-positive issue with CGNAT carriers. The weighting change makes sense.