The Voicemail Backdoor Into Your MFA
A real account takeover used nothing but a default voicemail PIN and phone-based MFA -- here's how to audit and close the gap in Entra ID.
The Voicemail Backdoor Into Your MFA
A real account takeover, no zero-day required: an attacker triggered a sign-in at 3 AM, let the voice-call OTP go to voicemail, then dialed into that voicemail box using a PIN the victim never bothered to change. This guide breaks down exactly how that works, why phone-based MFA is structurally exposed to it, and the specific Entra ID configuration that closes the gap.
⚡ Why This Matters
In late July 2026, security researcher Ron Kagansky published a firsthand account of an account takeover that used nothing more exotic than a phone call. No malware, no phishing kit, no zero-day. The attacker needed exactly two things: the victim's phone number, and the fact that almost nobody changes their voicemail PIN.
Phone-based MFA was a reasonable default a decade ago. It no longer is. Voicemail-based OTP interception, SIM swapping, and SS7 network attacks have moved phone/SMS authentication from "acceptable" to "the method most likely to be the reason your next incident report starts with 'the attacker had valid MFA.'" Microsoft's own guidance has quietly shifted the same direction: phone authentication methods are explicitly called out as the weakest tier in the Authentication Methods policy, and Conditional Access authentication strengths treat them accordingly.
This guide gives you the full picture — how the attack actually works, why it works, and the exact Entra ID configuration (Authentication Methods policy, Conditional Access authentication strengths, and a Graph-based audit script) to close it without breaking sign-in for a few hundred users on a Tuesday morning.
🕵️ The Attack, Step by Step
Here's what Kagansky described, reconstructed as a timeline. Nothing here requires privileged access, insider knowledge, or custom tooling.
Attacker triggers a sign-in at 3 AM
The attacker already has the victim's password — from a breach dump, a phishing page, or credential stuffing. It doesn't matter which; password compromise is the baseline assumption behind why MFA exists in the first place. They initiate a sign-in during the victim's sleeping hours specifically, because the next step depends on the victim not answering the phone.
The system places an automated voice call for the OTP
Because the account has "Call me" (phone/voice) configured as an MFA method, the identity provider dials the victim's registered number and reads out a one-time passcode via a robotic voice, expecting the victim to answer and either speak/enter a confirmation or simply pick up to approve.
No answer → voicemail → the OTP gets recorded
This is the step almost nobody thinks about. When a call isn't answered, most carriers and voice-MFA systems fall through to voicemail — and the automated system leaves the OTP as a recorded voicemail message. The code that was supposed to reach only the account owner is now sitting in a voicemail box, waiting.
Attacker dials into the voicemail box remotely
Most mobile carriers let you check voicemail from any phone by dialing your own number and entering a PIN. The attacker does exactly that — using the victim's own number, or the carrier's generic remote-access dial-in, then entering the PIN.
Default PIN, never changed, gets them in
Voicemail PINs ship with a manufacturer/carrier default (often a fixed 4-digit code, sometimes derived from the last digits of the phone number). Kagansky's core point: most people never change it. These defaults are documented, searchable, and in many cases identical across an entire carrier's customer base for accounts that haven't been touched.
Attacker retrieves the OTP, completes the takeover
The attacker listens to the voicemail, gets the OTP, enters it on the original sign-in prompt, and the account is theirs — with a fully valid MFA-satisfied session. From the identity provider's point of view, this looks like a completely normal, successful MFA sign-in. There is no failed attempt, no anomaly to flag, nothing that a standard sign-in log review would catch.
📞 Why Phone-Based MFA Fails Structurally
The voicemail path is one specific exploit. But it's a symptom of a broader problem: phone-based MFA (both voice call and SMS) authenticates possession of a phone number, not possession of a device or a cryptographic key. That distinction is the entire vulnerability.
Voice Call MFA
Vulnerable to voicemail interception (this incident), call forwarding abuse, and — for VoIP or poorly-secured carrier accounts — direct call redirection. The OTP is spoken audio; anything that can intercept or replay that audio defeats it.
SMS MFA
Vulnerable to SIM swapping (social-engineering the carrier into porting the number), SS7 protocol interception, and malware that reads SMS on a compromised or shared device. SMS also has no cryptographic binding to the original request — any code delivered can be replayed by whoever holds it.
Compare that to phishing-resistant methods, which authenticate a private key that never leaves a specific device:
| Method | What's actually verified | Resistant to voicemail/SIM/SS7 attacks? | Resistant to phishing? |
|---|---|---|---|
| Voice call OTP | Possession of phone number | ❌ No | ❌ No |
| SMS OTP | Possession of phone number | ❌ No | ❌ No |
| Authenticator app (push, no number match) | Possession of a registered app instance | ✅ Yes | ⚠️ Partial (MFA fatigue risk) |
| Authenticator app (number matching) | Possession + explicit user match action | ✅ Yes | ✅ Mostly |
| FIDO2 security key | Possession of a hardware key bound to the origin | ✅ Yes | ✅ Yes |
| Windows Hello for Business | Device-bound key + biometric/PIN | ✅ Yes | ✅ Yes |
| Certificate-based auth | Private key on a managed device/smart card | ✅ Yes | ✅ Yes |
This is exactly why Microsoft's Authentication Methods policy groups phone-based methods separately, and why Conditional Access authentication strengths let you require phishing-resistant MFA specifically — the platform already assumes phone auth is the weak tier. The gap is that most tenants inherited phone/SMS as an enabled legacy default and never revisited it.
🔍 Audit Your Exposure
Before disabling anything, find out how many users are actually relying on phone-based methods as their only strong authentication method — disabling it blind is how you generate a helpdesk queue, not a security improvement.
Microsoft Graph PowerShell — find every user still enrolled in phone auth
Connect-MgGraph -Scopes "UserAuthenticationMethod.Read.All","User.Read.All","AuditLog.Read.All"
$users = Get-MgUser -All -Property Id,UserPrincipalName,DisplayName,AccountEnabled |
Where-Object { $_.AccountEnabled -eq $true }
$results = foreach ($u in $users) {
$methods = Get-MgUserAuthenticationMethod -UserId $u.Id -ErrorAction SilentlyContinue
$phoneMethods = $methods | Where-Object {
$_.AdditionalProperties['@odata.type'] -eq '#microsoft.graph.phoneAuthenticationMethod'
}
$strongMethods = $methods | Where-Object {
$_.AdditionalProperties['@odata.type'] -in @(
'#microsoft.graph.fido2AuthenticationMethod',
'#microsoft.graph.windowsHelloForBusinessAuthenticationMethod',
'#microsoft.graph.microsoftAuthenticatorAuthenticationMethod'
)
}
if ($phoneMethods) {
foreach ($pm in $phoneMethods) {
[PSCustomObject]@{
UserPrincipalName = $u.UserPrincipalName
DisplayName = $u.DisplayName
PhoneType = $pm.AdditionalProperties['phoneType'] # mobile | alternateMobile | office
PhoneNumber = $pm.AdditionalProperties['phoneNumber']
HasStrongMethodToo = [bool]$strongMethods
RiskLevel = if ($strongMethods) { "Low — has a phishing-resistant fallback" }
else { "HIGH — phone is the only strong factor" }
}
}
}
}
$results | Sort-Object RiskLevel -Descending |
Export-Csv -Path "PhoneAuthMethodAudit_$(Get-Date -Format yyyyMMdd).csv" -NoTypeInformation
$highRisk = ($results | Where-Object { $_.RiskLevel -like "HIGH*" }).Count
Write-Host "Users with ONLY phone-based auth as their strong factor: $highRisk" -ForegroundColor Yellow
KQL — check sign-in logs for phone/voice MFA usage in the last 30 days
SigninLogs
| where TimeGenerated > ago(30d)
| where AuthenticationDetails has "Phone" or AuthenticationDetails has "SMS" or AuthenticationDetails has "Voice call"
| extend AuthMethod = tostring(parse_json(AuthenticationDetails)[0].authenticationMethod)
| where AuthMethod in ("Phone call", "Text message", "SMS")
| summarize SignInCount = count(), LastUsed = max(TimeGenerated) by UserPrincipalName, AuthMethod
| order by SignInCount desc
Cross-reference this with the PowerShell audit above — users who show up in both are actively using phone auth today, not just enrolled in it as a stale fallback.
🔒 Lock It Down in Entra ID
Entra ID's Authentication Methods policy is where you control which methods can be used at all, tenant-wide or scoped to a group. This is the primary control — disable it here and the method simply can't be used, regardless of what's registered on an account.
Step 1 — Review current state
| Path | What to check |
|---|---|
| Entra admin center → Protection → Authentication methods → Policies | Which methods are enabled: Voice calls, SMS, Authenticator, FIDO2, Windows Hello, Certificate-based |
| Each method → Target | "All users" vs. a specific group — legacy tenants often have phone auth enabled for "All users" by default |
Step 2 — Scope phone/SMS to a shrinking exception group, not "All users"
# Create a group to hold temporary exceptions while you migrate users off phone auth
New-MgGroup -DisplayName "MFA-Phone-Auth-Exception" `
-MailEnabled:$false -SecurityEnabled:$true -MailNickname "mfa-phone-exception"
# Set the Voice/SMS methods to target ONLY that group instead of All users
# (Authentication Methods policy is managed via Graph — no direct PowerShell cmdlet
# for authenticationMethodConfigurations targets, so this uses Invoke-MgGraphRequest)
$body = @{
"@odata.type" = "#microsoft.graph.smsAuthenticationMethodConfiguration"
state = "enabled"
includeTargets = @(
@{ targetType = "group"; id = "" }
)
} | ConvertTo-Json -Depth 5
Invoke-MgGraphRequest -Method PATCH `
-Uri "https://graph.microsoft.com/v1.0/policies/authenticationMethodsPolicy/authenticationMethodConfigurations/Sms" `
-Body $body
# Repeat with "#microsoft.graph.voiceAuthenticationMethodConfiguration" for the Voice endpoint
Step 3 — Once the exception group is empty, disable entirely
$disableBody = @{ state = "disabled" } | ConvertTo-Json
Invoke-MgGraphRequest -Method PATCH `
-Uri "https://graph.microsoft.com/v1.0/policies/authenticationMethodsPolicy/authenticationMethodConfigurations/Voice" `
-Body $disableBody
Invoke-MgGraphRequest -Method PATCH `
-Uri "https://graph.microsoft.com/v1.0/policies/authenticationMethodsPolicy/authenticationMethodConfigurations/Sms" `
-Body $disableBody
Step 4 — Enable and push phishing-resistant methods
Microsoft Authenticator — number matching
Enable number matching in the Authenticator method configuration (it's mandatory by default for cloud auth as of recent tenant baselines, but verify). This turns a tap-to-approve push into a "type the number you see" action, killing MFA-fatigue push-bombing.
FIDO2 security keys
Enable the FIDO2 method and require it for privileged roles (Global Admin, Privileged Role Admin) at minimum. This is the actual answer to "how do we stop this class of attack entirely" — a hardware key can't be voicemail-intercepted, SIM-swapped, or phished.
🛡️ Conditional Access — Enforce, Don't Just Enable
Enabling strong methods isn't enough on its own — users will keep using whatever's fastest unless you require the stronger method for the sessions that matter. Authentication strengths in Conditional Access are the enforcement layer.
Create a Conditional Access policy using the built-in "Phishing-resistant MFA" authentication strength
Entra admin center → Protection → Conditional Access → Policies → New. Grant control: "Require authentication strength" → Phishing-resistant MFA (this built-in strength includes FIDO2, Windows Hello for Business, and certificate-based auth — explicitly excludes phone and SMS).
Scope it first to admin roles, then expand
Target: Directory roles = Global Administrator, Privileged Role Administrator, Security Administrator (start here — highest blast radius if compromised, smallest population to migrate). Expand to "All users" once the exception group from the Authentication Methods policy step is empty.
Add a second policy blocking legacy/weak auth explicitly
A separate policy targeting "All users," condition: authentication strength does NOT satisfy "Multifactor authentication" strength (or use a custom strength that excludes phone/SMS) → Block. This is your explicit backstop once the primary migration is done.
🗺️ Rollout Plan — Without Locking Anyone Out
| Phase | Action | Duration |
|---|---|---|
| 1. Audit | Run the PowerShell + KQL audit above. Identify HIGH-risk users (phone-only) and privileged accounts specifically. | 1 day |
| 2. Communicate | Notify affected users: what's changing, why (reference this exact incident — it's a compelling, concrete reason), and how to enroll in Authenticator/FIDO2. | 1 week |
| 3. Migrate privileged accounts first | Enforce phishing-resistant MFA via Conditional Access for admin roles. Smallest group, highest risk reduction. | 2-3 days |
| 4. Shrink the exception group | Move phone/SMS from "All users" to the exception group. Follow up individually with anyone still in it. | 2 weeks |
| 5. Enforce broadly | Expand Conditional Access authentication strength requirement to all users. Disable phone/SMS methods entirely once the exception group is empty. | 1 week |
| 6. Verify | Re-run the audit script. Confirm zero users with phone as their only strong method. | 1 day |
👤 Individual-Level Fix (For Anyone Reading This Without an Entra Tenant)
Not everyone reading this manages an Entra tenant — some of you are just trying to protect your own phone number. Two actions, five minutes total:
Change your voicemail PIN now
Every carrier lets you do this from the phone's voicemail settings or by dialing into voicemail and choosing the PIN-change option. Use a PIN that isn't your birth year, your last 4 digits, or the carrier default (usually printed in onboarding material — assume attackers already know it).
Or disable remote voicemail access entirely
Most carriers offer a setting to disable dial-in access to voicemail from other phone numbers, restricting playback to the device itself. If you don't rely on checking voicemail from a different phone, this closes the path completely — no PIN to guess at all.
If any of your accounts still offer "call me" or SMS as an MFA option, switch to an authenticator app (Microsoft Authenticator, or any TOTP app) wherever the service supports it. It's not phishing-resistant on its own, but it removes the voicemail path entirely.
✅ Pre-Rollout Checklist
- Ran the Graph PowerShell audit — have a list of users relying solely on phone/SMS auth
- Cross-checked sign-in logs (KQL) to confirm which accounts are actively using phone auth today
- Identified all privileged role holders (Global Admin, Privileged Role Admin, Security Admin) still on phone-only auth
- Created the temporary exception group for phased migration
- Enabled FIDO2 and enforced number matching on Microsoft Authenticator
- Notified affected users with a concrete, specific reason (this incident) — not a generic security email
- Built the Conditional Access "Phishing-resistant MFA" policy in Report-only mode first
- Reviewed Conditional Access insights workbook before enforcing
- Enforced phishing-resistant MFA for privileged roles first, then expanded to all users
- Disabled Voice and SMS authentication methods in the Authentication Methods policy once the exception group was empty
- Re-ran the audit script to confirm zero remaining phone-only accounts