MFA denied then approved

Severity criticalCloud & SaaSOrdered sequencestablemulti.authentication.mfa_denied_then_approved · v1.0.0

Two multi-factor challenges refused, then one accepted, for the same account.

What it detects

Two multi-factor challenges refused, then one accepted, for the same account.

This is the quiet version of push bombing, and the one a volume threshold cannot see. An attacker who sends thirty prompts is loud; an attacker who sends three and waits looks like nothing at all. What gives both away is the SHAPE rather than the count — a person who denies a prompt has decided it was not them, and a decision like that does not usually reverse twice in ten minutes.

Deliberately vendor-neutral. It matches on the normalized category and outcome rather than a provider string, so it works on Okta, Entra and Google Workspace alike. That matters more than the technique: the pack's other MFA-fatigue rule is provider: AzureAD, which means a customer on Okta or Workspace has had no MFA-fatigue detection at all, whatever their volume.

MITRE ATT&CK mapping

  • T1621Multi-Factor Authentication Request Generation· Credential Access
  • T1078Valid Accounts· Defense Evasion

False positives and triage

Mistyped codes are the benign twin: a user fumbles a TOTP twice and gets it right on the third go, which is exactly this shape. Two denials is the threshold because one is routine; it is not proof.

Separate them on ADDRESS and INTERVAL. A fumbled code is three attempts from one place inside a minute; this technique is prompts arriving over minutes, often with the attempts originating somewhere the user is not. Compare the source of the failures with the source of the success — if they differ, the person who approved and the person who asked are not the same, which is the whole finding. Then ask the user. An approval they do not remember making means the attacker already had the password, so the response is the account, not the prompt.

The rule

Declarative YAML read by the detection engine — data, never executed. Confidence 70%. Source: rules/cloud/mfa_denied_then_approved.yaml, licensed under the Apache License 2.0.

id: multi.authentication.mfa_denied_then_approved
version: 1.0.0
status: stable
severity: critical
confidence: 0.7
platforms: [application]
mitre_techniques: [T1621, T1078]
description: |
  Two multi-factor challenges refused, then one accepted, for the same account.

  This is the quiet version of push bombing, and the one a volume threshold
  cannot see. An attacker who sends thirty prompts is loud; an attacker who sends
  three and waits looks like nothing at all. What gives both away is the SHAPE
  rather than the count — a person who denies a prompt has decided it was not
  them, and a decision like that does not usually reverse twice in ten minutes.

  Deliberately vendor-neutral. It matches on the normalized category and outcome
  rather than a provider string, so it works on Okta, Entra and Google Workspace
  alike. That matters more than the technique: the pack's other MFA-fatigue rule
  is `provider: AzureAD`, which means a customer on Okta or Workspace has had no
  MFA-fatigue detection at all, whatever their volume.
sequence:
  # Ten minutes: long enough to cover a real prompt-and-wait cadence, short enough
  # that a denial in the morning and a sign-in after lunch are not joined up.
  within_seconds: 600
  group_by: [user_name]
  order: strict
  steps:
    - id: challenge_refused
      match:
        event_category: authentication
        event_outcome: failure
        event_action_contains_any: [mfa, factor, strong_auth, verify]
    - id: challenge_refused_again
      match:
        event_category: authentication
        event_outcome: failure
        event_action_contains_any: [mfa, factor, strong_auth, verify]
    - id: challenge_accepted
      match:
        event_category: authentication
        event_outcome: success
correlation_keys: [user_name, source_ip]
false_positive_guidance: |
  Mistyped codes are the benign twin: a user fumbles a TOTP twice and gets it
  right on the third go, which is exactly this shape. Two denials is the threshold
  because one is routine; it is not proof.

  Separate them on ADDRESS and INTERVAL. A fumbled code is three attempts from one
  place inside a minute; this technique is prompts arriving over minutes, often
  with the attempts originating somewhere the user is not. Compare the source of
  the failures with the source of the success — if they differ, the person who
  approved and the person who asked are not the same, which is the whole finding.
  Then ask the user. An approval they do not remember making means the attacker
  already had the password, so the response is the account, not the prompt.

Related detections

Run this rule on your own logs — offline

KIROSEC runs this rule and the rest of the library over Windows, Linux, macOS and cloud audit logs on the analyst's own machine. Every alert links to the events that raised it, and nothing leaves the device.

Browse all detections