xonPlus Logo
Stop account takeover: step up auth on new breach exposure. A sign-in dialog asks for one more check because the user's email appeared in a recently published data breach, offering a passkey or an authenticator code, with SMS skipped because the phone number leaked.
Technical Guide15 min read

Stop Account Takeover: Step Up Auth on New Breach Exposure

When a user's email address turns up in a newly indexed data breach, raise the risk on that one account and ask for a stronger check at its next sign-in.

Keep the flag for a set window. Clear it once the user passes a strong factor and changes their credentials. Everyone else signs in exactly as they did yesterday.

That's the whole idea, and it's cheap. Often it lands before an attacker's first try, instead of after the third failed one.

The short version

  • One large study of 1.9 billion leaked usernames and passwords found the matching accounts were roughly 10 times likelier to be hijacked than a random account (ACM CCS 2017).
  • Every challenge costs you. When Google challenged sign-ins it already found suspicious, 52% of the real users failed at first (WWW 2019). So challenge the exposed few.
  • New exposure isn't rare, either. We added 149 breaches to our catalog in the 52 weeks to 28 September 2026, and only seven of those weeks passed without one.
Five-step loop: a breach is indexed, you learn which users are in it, you flag those accounts, their next sign-in steps up, and the flag clears once they pass a strong factor and change credentials

What is step-up authentication?

Step-up authentication is simple to describe. You ask for more proof only when a sign-in (or something the user is about to do) looks riskier than usual. A normal login gets the normal flow, and a risky one gets an extra factor, a fresh check, or a block.

Most identity stacks already work this way. They weigh device, location, time of day and behaviour (that's the "adaptive" or "risk-based" part), then pick a response.

The standards allow for it, too. NIST SP 800-63B-4 says indicators of potential fraud "MAY be used to lower the risk of misauthentication" at every assurance level. And when fraud is suspected mid-session, the service "SHOULD" reauthenticate, end the session or notify support.

OWASP's credential stuffing cheat sheet lands in the same place. Ask for the second factor "only in specific circumstances where there is reason to suspect that the login attempt may not be legitimate."

So the machinery is there. What it usually lacks is a reason that shows up before the attacker does.

Why breach exposure belongs in your risk engine

Device and location signals fire when someone is already at your login page. Breach exposure fires earlier.

It tells you a user's email address (and often a lot more) has just gone into circulation. Often nobody has tried it on your platform yet. So you may still get the first move.

The research on what happens next is blunt. Thomas et al. , a Google and UC Berkeley team, matched 1.9 billion leaked usernames and passwords to Google accounts (ACM CCS 2017). Those accounts were "roughly 10x" likelier to be hijacked than a random Google user.

And across all the hijacked accounts in that study, the median user took 168 days to re-secure theirs. Half a year. Breaches without passwords are a weaker signal than that, which is why the policy further down weighs what leaked (the account takeover guide covers how a takeover starts).

Why would a breach at some other company become your problem? Reuse, mostly.

Das et al. (NDSS 2014) estimated that 43 to 51% of users reuse the same password across sites. OWASP's own definition of credential stuffing notes that the stolen usernames are "often email addresses", taken from "publicly available breach data dumps." So your users' email addresses are often half of every attempt.

And the attempts don't stop. Verizon's 2025 DBIR research looked at single sign-on logs. Credential stuffing made up a median 19% of all daily authentication attempts there, 25% at larger organisations, and 44% on the worst single day.

Verizon's 2026 report still has credential abuse on top. Count every point in an attack rather than the first step alone, and it turns up in 39% of breaches.

So for a platform team the reading is simple. A fresh breach tells you whose accounts are likeliest to turn up in that traffic next.

It's expensive when it lands. Javelin's 2026 Identity Fraud Study puts US account takeover losses above $15 billion for 2025, the costliest fraud type it tracks. Six million people were affected, and each spent 17 hours, on average, sorting it out.

The FBI's IC3 logged about 4,700 account takeover complaints and $359.7 million in reported losses in its 2025 report . Some of those hours end up as tickets on your support queue.

What we give you is the earlier signal. Which of your users just landed in a new breach, and what leaked with their email.

How often does "new exposure" actually happen?

More often than most teams expect. Every entry in our public breach catalog carries the date we added it, so the cadence is easy to see.

Bar chart of breaches added to the XposedOrNot catalog each month from October 2025 to August 2026: 13, 5, 3, 6, 21, 16, 22, 13, 23, 13 and 9, 144 in total

From October 2025 to August 2026 we added 144 breaches. Even the quietest month, December, brought three. June brought 23.

Stretch it to the full year to 28 September 2026 and you get 149 breaches, 1,178,129,424 records, and just seven weeks with nothing new. Records, not people: one address that sits in five breaches is counted five times.

There's a wrinkle, though. New to our index isn't always new to the world.

Of the 123 breaches we added between January and August 2026, 35 had happened more than a year before they reached us. The median gap was about two months. (Our breach disclosure lag analysis goes into why.)

Does an old breach stop mattering? Not really. The user may never have been told, and in our experience a breach that's just surfaced is often one that's just started circulating.

So treat the add date as the trigger. The breach date is one input to how hard you step up.

What leaked decides which check you ask for

From what we've seen, this is the part teams skip. A breach tells you more than "this user is exposed." It says what came out alongside the email, and that changes which factor you can still trust.

Every breach in our catalog includes email addresses, because that's what we match on (here's why email sits in all of them ). Across the 123 breaches we added from January to August 2026, this is what else came out:

Exposed next to the emailBreachesShare of 123What it makes weaker
Names9779%Phishing that uses their real name, help-desk social engineering
Phone numbers7763%SMS codes, phone-based recovery
Physical addresses6855%Knowledge-based questions
Dates of birth3428%Birth-date checks at support
Passwords, in any form3125%The old secret for that site, if it was reused

Three in four of those breaches (92 of 123) exposed a phone number, a home address or a date of birth. Those are exactly the facts that security questions and a lot of recovery flows lean on.

Five exposed data types with the share of 2026 breaches that exposed each, what each one weakens, and which step-up to use instead: names 79%, phone numbers 63%, physical addresses 55%, dates of birth 28%, passwords 25%

So match the factor to the leak. A leaked phone number makes SMS the weak choice (Microsoft's own 2023 study , not peer reviewed, found SMS 40.8% less effective than an authenticator app).

Security questions are the next casualty once the address and birth date are out there. Doerfler et al. (Google, WWW 2019) found knowledge-based challenges stopped as few as 10% of takeover attempts that started with phishing.

Device-based checks are the ones to reach for. In the same Google research , on-device prompts helped block 100% of automated bots, 99% of bulk phishing and 90% of targeted attacks, while SMS codes fell to 76% against targeted attacks.

Bar chart of takeover attempts blocked by challenge type: SMS code 100% of bots, 96% of bulk phishing, 76% of targeted attacks; on-device prompt 100%, 99% and 90%; plus the finding that 52% of real users whose suspicious sign-ins Google challenged failed at first

Those are Google's rates, on Google's users. Read them as a ceiling for your platform.

Why not challenge everyone?

Because the friction is real, and your users pay it on every login.

In Doerfler et al.'s study, Google challenged only sign-ins it already found suspicious, and 52% of the real users failed at first (97% got in soon after). A SOUPS 2019 usability study by Reese et al. timed sign-ins with each method: a median 11.8 seconds with a push prompt, 15.1 with an app code and 16.6 with SMS.

Targeted step-up avoids most of that. Wiefling et al. studied risk-based authentication on a live service with 3.3 million users and 31.3 million login attempts (ACM TOPS, 2022). It "rarely requests re-authentication in practice, even when blocking more than 99% of attacks" that used the user's own credentials.

There's a limit, and the same paper shows it. Tuned to block 99.5% of naive attackers, the system asked the average legitimate user to re-authenticate every second login.

That's where our exposure data earns its keep. It gives you one dated, factual reason to challenge one account, instead of a looser threshold for everybody.

Users seem to prefer it, for what it's worth. In a lab study at ACSAC 2020 , people rated risk-based checks as more usable than the 2FA variants tested, and about as secure.

A step-up policy you can ship

Here's the policy we'd start from. Tune the window and thresholds to your own risk appetite (think of it as a first draft).

Four-step staircase: step 0 normal sign-in for everyone else; step 1 newly exposed users on a known device get through with the flag kept; step 2 adds a strong factor when the device or country is new; step 3 adds a credential change and signs out other sessions when passwords leaked or the source is a stealer log
What you know about the account and the sign-inWhat you do
No new breach for this userNormal sign-in
Newly exposed, known device, usual countryLet it through, keep the flag for the window
Newly exposed, new device or countryStrong factor: authenticator app or passkey, and not SMS if the phone number leaked
Newly exposed, passwords among the breach's data, or a stealer-log sourceStrong factor, then a credential change and sign-out of every other session
Flagged user changes email, phone or payout detailsStrong factor first, whatever the device

The last row matters more than it looks. OWASP suggests step-up before "a high risk activity" (its examples are big payments and admin changes). A changed email or phone is how a takeover becomes permanent, so we'd treat it the same way.

A few details decide whether the policy helps or just annoys people.

How long should the flag last? Thirty days is a sensible default. A small honey-account study from UCL (ACM IMC 2016) found 80% of unique accesses to test accounts leaked on paste sites came within 25 days.

Clear on action. Drop the flag once the user passes a strong factor and has changed credentials after the breach's add date. If neither happens, let it lapse at the end of the window.

Weight what you know. A recent, verified breach with passwords among its data outranks a five-year-old dump of names and emails. Our breach records carry the breach date, the data types, the password storage label and a verified flag. Write the rule from those.

And say why. Your engine eats the facts and the user only sees a prompt, so give them one line (if you want them to see more, show them the breach itself, no score): "Your email appeared in a recently published data breach, so we're asking for an extra check."

Link that line to a page that explains what to do after a breach hit . A surprise prompt then reads like a favour.

Two ways to wire it

Where the "newly exposed" list comes from depends on whose email addresses your users sign in with.

Two integration paths side by side: for customers on work domains, onboard each domain, receive a signed webhook, pull what is new since the last watermark and flag users (xonThreatIntel+); for users with any email address, look up the email at sign-in, store the breach IDs, compare with last time and flag (xonAPI+)

If your customers use their own work domains

Think B2B SaaS, identity and access platforms, password and privileged-access vaults, MSP portals. You onboard each customer's domain once through the xonThreatIntel+ partner API and register one webhook for your account.

When a new breach touching any of those domains goes into our index, we send a signed webhook (HMAC-SHA256, with a timestamp). It carries per-domain counts and a watermark, "never email-level data", by design. You then pull the rows added since that watermark and flag the matching users.

Two properties make this fit the policy above. The partner docs call the since-filter "gap-free by design", so as long as you keep your last watermark and pull from it, a missed webhook doesn't mean a missed breach.

And it filters on when we acquired the data: "an old breach acquired yesterday is a new finding." That's exactly the trigger you want.

If your users bring any email address

Consumer apps, fintech, marketplaces. There's no domain to onboard for a webmail address, so this path is a lookup.

Call the xonAPI+ check-email endpoint at sign-in, or on a schedule. Store the breach IDs you saw for that user, and flag anything new the next time round.

It's one GET per check, and the answer is exposure facts (breach, date, data types, password storage label), never a password or a raw record.

The product page puts the privacy side plainly: "Stateless lookups. We never store or log submitted emails."

If re-checking every user daily sounds wasteful, it is. Watch the add dates on our free breaches endpoint and re-check only when the catalog moves.

xonAPI+ plans run from 50 requests a minute (from $9 a month) up to 25,000 a minute, with no monthly cap. Match the plan to your peak sign-ins per minute. Or check only the sign-ins that already look a little off.

How do you know it's working?

Ship it with numbers, or you won't know which way to tune it. Log these from the first day:

  • the step-up rate, overall and among flagged users
  • how many flagged users completed the check, and how many gave up
  • takeover reports and fraud losses in the flagged group against everyone else
  • support tickets that mention the new prompt
  • how long users stay flagged, and whether they clear by action or by expiry

Fewer takeovers among flagged accounts, with a flat step-up rate for everyone else? The policy's earning its place. If abandonment climbs, loosen step 1 before you touch steps 2 and 3.

Where xonThreatIntel+ and xonAPI+ fit

We supply the first two steps of the loop: the breach data, and the answer to "who's in it". Your auth stack keeps the rest, under your policy, and your customers keep their relationship with you.

That split is deliberate. As of 29 September 2026 our catalog holds 786 breaches and 11,626,309,365 records, every one with email addresses, 752 of them marked verified. We index data once it's public, and our data page says we "do not purchase stolen data, trade with threat actors, or commission breaches."

It already runs at this scale. Verosint, an identity threat detection platform, runs around 300,000 breach-history checks a day through our API. It passes that signal straight to its own clients, "flagging accounts that come back compromised at the point of access" (read the case study).

Selling to businesses on their own domains? That's xonThreatIntel+, with webhooks from the Growth plan ($243 a month for up to 25 domains, volume pricing past 50). Consumer platforms take the per-email route with xonAPI+, and the xonAPI+ quickstart gets you to a first call.

Not a platform? If you only care about your own organisation, free domain monitoring covers a domain you own. And anyone can check an email address on XposedOrNot in a few seconds.

Your first-sprint checklist

  • Pick the path: work domains (webhook, then pull) or any email (lookup at sign-in)
  • Add a "newly exposed until" date to the user record
  • Map data types to factors: no SMS if the phone leaked, no security questions if the address or birth date did
  • Set the window (30 days to start) and the rule that clears it
  • Put step-up on email, phone and payout changes for flagged users
  • Write the one-line explanation users see, and the help page behind it
  • Log the five numbers above from day one
  • Review after four weeks, and tune step 1 first

Quick answers

What is step-up authentication?

It's an extra check, like an authenticator app code or a passkey, that you only ask for when a sign-in or an action looks riskier than normal. Low-risk sign-ins go through with the usual flow. NIST SP 800-63B-4 allows fraud indicators to trigger these extra controls at every assurance level.

Should we force MFA on every user after a big breach?

Usually not. When Google challenged sign-ins it already found suspicious, 52% of the real users failed at first, so blanket prompts cost you real sign-ins. Step up only the accounts whose email appeared in the new breach, and only for a set window.

Is breach exposure enough to block a login on its own?

No. It's a reason to ask for more proof, not proof of an attack. Combine it with device, location and behaviour signals, and block only when several of them line up.

Do we need password data to do this?

No. The signal is that the user's email address appeared in a newly indexed breach, plus what else that breach exposed. Our APIs return exposure facts (breach, date, data types, password storage label) and never a password.

Where the numbers came from