Business Email Compromise Prevention in Microsoft 365: The Seven-Layer Stack
BEC drained $2.9 billion from U.S. businesses in 2024. Most victim tenants ran Microsoft 365 on close-to-default settings. Here's the prevention stack that actually closes the door.
By Jonathan Fykes, CTO · Published · Last updated
TL;DR
- The FBI's IC3 logged $2.9 billion in U.S. business email compromise losses in 2024 across roughly 21,000 reported incidents. The unreported number is larger.
- BEC isn't one attack. It's a family of five (executive impersonation, vendor email compromise, payroll diversion, attorney impersonation, M&A acquisition fraud) that share a common kill chain inside your tenant.
- Microsoft 365 is the BEC battleground because it owns the SMB email market and ships with the highest-ROI controls turned off or set too loose.
- Seven layers stop it: identity hardening, email authentication, Defender impersonation protection, forwarding restrictions, OAuth governance, payment-process controls, and role-based training.
- If you can only do five things this quarter, the priority list is at the bottom of this post. Two PowerShell snippets find the highest-signal indicators that an attacker is already inside.
What "BEC" actually means (and what it isn't)
The FBI defines business email compromise as a sophisticated scam targeting businesses and individuals performing wire transfers, where attackers compromise legitimate business email accounts through social engineering or computer-intrusion techniques to conduct unauthorized transfers. That's a mouthful. The shorter version: BEC is the attack where someone trusts an email enough to move money or data, and the trust was earned by an attacker.
BEC is not generic phishing. Generic phishing casts a wide net and hopes someone clicks. BEC is targeted, patient, and bilateral. Attackers research the target for days or weeks. They study tone, timing, and relationships. By the time the message arrives, it reads exactly like the legitimate emails it's hiding among.
The family has five recognizable subtypes:
- CEO or executive impersonation. An attacker spoofs the display name of a senior leader and emails finance, HR, or AP with an urgent request. No mailbox compromise required. The attack lives entirely in the From line and the body.
- Vendor email compromise (VEC). The attacker phishes a real person at one of your vendors, signs into their mailbox, and quietly hijacks an in-progress invoice thread. This is the most expensive subtype because the email genuinely comes from a trusted sender.
- Payroll diversion. Attacker emails HR or payroll from a compromised or spoofed employee account: "Please update my direct deposit to this new bank, effective next pay period."
- Attorney impersonation. Inbound email claims to be from outside counsel handling a confidential matter (acquisition, settlement, regulatory). Urgency and confidentiality are the levers. The "attorney" requests an emergency wire.
- M&A or acquisition fraud. A targeted variant where the attacker has done enough homework to reference a real or rumored deal. The wire request is framed as escrow, deposit, or due-diligence payment.
The deep dive on the invoice-fraud subtype, with six specific email controls, lives in the sibling guide on how to stop invoice fraud in Microsoft 365. That post pairs with this one. This is the wider lens. The invoice-fraud post is one branch of the tree.
Why Microsoft 365 is the BEC battleground
Two things make M365 the dominant terrain for BEC. The first is market share. Microsoft 365 powers the email of most small and mid-sized businesses in North America, which means most attacker tooling, playbooks, and phishing kits are built against it. Adversary-in-the-middle frameworks like Evilginx and EvilNoVNC ship with M365 templates. The OAuth-consent-phishing pages clone Microsoft's own login UI. Attackers iterate against M365 because that's where the money is.
The second reason is harder for tenants to accept: default settings are not a security baseline. M365 ships with admin consent for new apps allowed by default, automatic external forwarding allowed by default on tenants created before 2020, DKIM signing not enabled on custom domains by default, and impersonation protection in Defender unconfigured out of the box. Every one of those defaults is a door an attacker walks through. Microsoft has good reasons for each setting (compatibility, customer choice, support volume), but the practical effect is that a tenant nobody has tightened is a tenant an attacker can run a BEC playbook against on a Tuesday afternoon.
The control most often missing entirely is also the cheapest one to fix. Blocking legacy authentication kills the credential-stuffing path that delivers many of the mailbox compromises BEC depends on. The full deployment lives in the SecureYourTenant guide on blocking legacy authentication in Microsoft 365. Without that one in place, every layer below works harder than it should.
The BEC kill chain inside your tenant
Every successful BEC follows a recognizable sequence. Understanding the chain matters because each prevention layer interrupts a specific link.
- Initial access. Phishing (most common), password spray against a tenant where MFA isn't universal, OAuth consent phishing, or AitM session-cookie theft. The goal is one valid mailbox.
- Mailbox surveillance. The attacker doesn't act for days, often weeks. The median dwell time on BEC cases we see is 28 to 35 days. They read, they learn, they identify the highest-value thread.
- Persistence. Inbox rules that quietly route specific messages to RSS Feeds or Archive, an OAuth app granted Mail.ReadWrite, a forwarding rule pointed at an external Gmail. The attacker assumes the password will get changed and engineers around it.
- Identity theft. The compromised mailbox is now used to impersonate the user. Sometimes the attacker sends from the real mailbox. Other times they spin up a look-alike domain and reply from there once they understand the relationship.
- Payment manipulation. The actual fraud event. A wire instruction changes, a payroll deposit redirects, an invoice gets a new bank account number. This is the moment money moves.
- Cleanup. The attacker deletes the outbound message from Sent Items, deletes audit-relevant inbox rules, sometimes signs out cleanly. By the time anyone investigates, the trail is faded.
Layers 1 through 3 of the prevention stack below interrupt the first link. Layers 4 and 5 break links 2 and 3. Layer 6 stops link 5 even if the first five layers all fail. Layer 7 trains the humans who are the last line.
The seven-layer BEC prevention stack
No single control stops every BEC. The stack works because layers backstop each other. A failure at one layer triggers a catch at the next.
Layer 1: Identity hardening
Phishing-resistant MFA on every account, no exceptions. Microsoft Authenticator with number-matching is the practical floor. FIDO2 hardware keys for executives and finance roles are the ceiling. SMS-based MFA is no longer adequate against modern AitM kits because the attacker captures the post-MFA session cookie regardless of the second-factor type, but the second factor still raises the cost of the attack and slows it.
Conditional Access does the heavy lifting around MFA. Three policies pay for themselves: require MFA for all users on all cloud apps, block legacy authentication clients (the credential-stuffing path), and require compliant or hybrid-joined devices for admin role activation. A fourth optional policy blocks sign-ins from countries where you have no operations. That policy alone has stopped about a third of the password-spray attempts we've watched in tenant logs.
Layer 2: Email authentication (SPF, DKIM, DMARC)
SPF lists which servers are allowed to send as your domain. DKIM cryptographically signs every outbound message. DMARC tells receivers what to do when a message claiming to be from you fails both checks, and asks them to send you reports about who's spoofing you.
Most tenants we audit have SPF configured (often badly, with stale include: entries pointing at services they stopped using in 2019), DKIM enabled on the onmicrosoft.com tenant domain but never enabled on the actual sending domain, and DMARC stuck at p=none because nobody owned moving it forward. The target state is p=reject with strict alignment for both SPF and DKIM. Plan thirty days of p=none first to find legitimate senders you forgot about, then escalate.
Layer 3: Defender for Office 365 anti-impersonation
This is the layer with the highest BEC-specific yield in Defender, and the one most tenants never configure. In Microsoft 365 Defender, edit the Anti-phishing policy to add protected users (your CEO, CFO, controller, AP lead, HR lead, IT admin) and protected domains (your own primary domain, your top vendor domains, your bank's domain). Set the action for both user and domain impersonation hits to Quarantine, not Junk. Set the threshold to Aggressive. Standard misses too much. Most aggressive will quarantine your sister company's marketing newsletter on a Monday and you will hear about it.
Named protection for executives is the difference-maker here. Generic anti-phishing scoring catches obvious tricks. The protected-user list catches the precise display-name games that drive CEO fraud: From: Jane Smith <[email protected]> when Jane Smith is your real CEO. The system can't infer the protection list. You configure it manually, and you keep it current.
Layer 4: Forwarding restrictions
External auto-forwarding is how attackers maintain access after you reset the password. Defender's outbound spam policy now blocks automatic external forwarding by default for tenants created after 2020, but every older tenant we audit still has it on. Verify your setting at Defender → Email & collaboration → Policies & rules → Anti-spam → Outbound spam policy → Forwarding rules. It should read "Off, Forwarding is disabled."
Disabling new forwarding doesn't tell you what's already in place. The audit script and recovery path are in the dedicated guide on email forwarding attacks in Microsoft 365. Run that audit before you assume your tenant is clean.
Layer 5: OAuth consent governance
The newer attack pattern, and the one most tenants haven't caught up to. Instead of phishing a password, the attacker phishes consent. They send a link that looks like a Microsoft prompt asking the user to grant a third-party app permission to read mail and send on their behalf. The user accepts. The attacker now has a long-lived OAuth token that survives password resets and MFA changes because it isn't a password.
Two settings close this door. In Entra admin center → Identity → Applications → Enterprise applications → Consent and permissions → User consent settings, set "User consent for applications" to "Do not allow user consent" (strict) or "Allow user consent for apps from verified publishers, for selected permissions" (balanced). Then enable the admin consent workflow on the same screen so consent requests for unapproved apps route to a designated reviewer.
Layer 6: Payment process controls
Every technical control above can fail. Layer 6 is the one that doesn't, because it lives outside email entirely. The rule: any change to vendor banking information, any new payee, and any wire over a defined dollar threshold requires a verbal callback to a number on file from before the change request. Not a number in the email. Not a number on the new invoice. The number from the master service agreement, the previous successful invoice, or the vendor's main website.
Three operational details make the rule actually work: the vendor phone number gets recorded once at onboarding and stored in the accounting system rather than trusted from a future invoice, the threshold above which two-person approval kicks in is documented and enforced, and skipping the callback is a finding in the next audit. Most BEC losses we've reviewed would have been stopped by one phone call.
Layer 7: Role-based security awareness training
Generic phishing training is checkbox compliance. Role-based training is prevention. Finance and AP staff need different content from the rest of the company. They need it more often (quarterly, not annually). And they need it to include the specific BEC patterns aimed at them. Show finance team members a real CEO-impersonation message side-by-side with the legitimate CEO's writing. Show AP staff what a vendor-compromise follow-up looks like. Run phishing simulations with BEC-style messages, not just obvious malware lures.
The metric that matters is reporting rate, not click rate. A team that reports suspicious messages to IT inside an hour is more valuable than a team with a 0% click rate that never says anything when a real message gets through.
Three BEC failure scenarios at SMB scale
The patterns repeat. Names and numbers vary. The structure doesn't.
Scenario 1: Compromised CFO mailbox manipulating outgoing wires
A 70-person professional services firm. The CFO clicks a "DocuSign" link in what looks like a contract review. The page is an Evilginx proxy, captures the session cookie post-MFA, and the attacker now has the CFO's mailbox. For three weeks the attacker reads quietly. They identify a recurring monthly payment to a major contractor. The day before the next scheduled wire, the attacker sends a message from the CFO's real mailbox to the controller: "Quick heads-up, the contractor switched banks, please use the new ACH details on the attached invoice for tomorrow's payment." The controller wires $164,000 to a money-mule account. The real contractor calls four days later asking when payment is coming. Layer 5 OAuth governance and Layer 4 forwarding-rule auditing would have raised flags during the dwell period. Layer 6 callback would have stopped the wire even with the mailbox compromised.
Scenario 2: Vendor mailbox compromise inserting fake invoices
A 40-person construction firm has worked with the same fabrication shop for six years. An estimator at the fabrication shop falls to a phishing email and the attacker sits in his mailbox for nineteen days. When a real $84,000 invoice goes out, the attacker pulls it from Sent Items, then sends a follow-up an hour later from the same legitimate mailbox: "Hi, our bank changed last month, please use the routing/account on the attached updated invoice." AP wires the money. Layers 1 through 5 don't help because the message comes from a genuinely compromised real mailbox. Layer 6 is the only thing that stops this one. The deep walk-through of the same pattern, end to end, lives in the sibling case study on a real BEC prevention case study.
Scenario 3: Payroll diversion against HR
A 150-person services company gets a routine-sounding email from "an employee" to the HR coordinator: bank changed, please update direct deposit before Friday's pay run. The display name matches a real employee. The sender address is a free-mail look-alike. HR updates the record from the email without verifying. Friday's deposit lands in the attacker's account. The real employee calls Monday asking why pay didn't hit. Layer 3 protected-domain settings catch the look-alike domain. Layer 7 training makes HR call the employee at the cell number on file before changing any banking detail. Both controls cost essentially nothing.
Detection: the five signals that a BEC is in progress
Prevention is half the job. Catching an attack mid-flight is the other half. Five signals worth monitoring continuously:
- New external-forwarding inbox rules. Any inbox rule that forwards or redirects to a non-tenant address is a finding until proven otherwise. Run the audit script monthly at minimum, weekly for finance and executive mailboxes.
- OAuth grants to apps with mail scopes. A new consent grant for
Mail.ReadWrite,Mail.Send, orMailboxSettings.ReadWriteis the OAuth-phishing signature. - Risky sign-ins on finance accounts. Entra ID Protection scores every sign-in. A "high" risk score on a CFO, controller, or AP user is a stop-everything event. Conditional Access should already block these. Check that the policy is on, scoped right, and not silently failing.
- Unfamiliar mailbox-folder permission grants. Attackers sometimes share inbox folders to a secondary attacker-controlled mailbox rather than forwarding. Audit
Get-MailboxFolderPermissionon executive mailboxes monthly. - Defender impersonation-protection alerts. Once Layer 3 is configured, alerts start firing on matched messages. Most are signal, especially in the first month after deployment. Triage them weekly. Don't let them fade into noise.
For the broader set of indicators that something has already gone wrong in a single mailbox, the deep dive on how to tell if your M365 email is compromised walks through unified audit log queries and the full diagnostic flow.
Hunt: two PowerShell queries worth running tonight
1. Find executive-impersonation inbox rules and recent suspicious rule edits. This pulls inbox rules across the tenant and flags ones with subject filters that look like impersonation staging (keywords like "wire," "invoice," "bank," "urgent") plus any rule modified in the last 30 days on a protected user's mailbox.
Connect-ExchangeOnline
$keywords = "wire|invoice|bank|urgent|payment|remit|ACH|routing"
$protectedUsers = @(
"[email protected]","[email protected]",
"[email protected]","[email protected]",
"[email protected]"
)
$findings = foreach ($mbx in (Get-Mailbox -ResultSize Unlimited)) {
Get-InboxRule -Mailbox $mbx.UserPrincipalName |
Where-Object {
($_.SubjectContainsWords -match $keywords) -or
($_.BodyContainsWords -match $keywords) -or
($_.ForwardTo) -or
($_.RedirectTo) -or
($_.MoveToFolder -match "RSS|Archive|Deleted")
} |
Select-Object @{n='Mailbox';e={$mbx.UserPrincipalName}},
Name, Enabled, SubjectContainsWords,
BodyContainsWords, ForwardTo, RedirectTo,
MoveToFolder, MarkAsRead, DeleteMessage
}
$findings | Export-Csv bec-inbox-rules-audit.csv -NoTypeInformation
# Cross-check: protected-user mailboxes with rules modified recently
Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-30) -EndDate (Get-Date) `
-Operations "New-InboxRule","Set-InboxRule","Enable-InboxRule" `
-UserIds $protectedUsers |
Select-Object CreationDate, UserIds, Operations, AuditData |
Export-Csv bec-rule-audit-protected.csv -NoTypeInformation
2. Find OAuth applications with mail-send or mail-read-write scopes consented in your tenant. Anything you don't recognize, anything from an unverified publisher, anything granted in the last 30 days that you didn't approve.
Connect-MgGraph -Scopes "Directory.Read.All","Application.Read.All","DelegatedPermissionGrant.Read.All"
$riskyScopes = @(
"Mail.Read","Mail.ReadWrite","Mail.Send",
"Mail.ReadWrite.All","Mail.Send.All",
"MailboxSettings.ReadWrite","full_access_as_user"
)
$grants = Get-MgOauth2PermissionGrant -All |
Where-Object {
$scopes = $_.Scope -split ' '
($scopes | Where-Object { $riskyScopes -contains $_ }).Count -gt 0
}
$report = foreach ($grant in $grants) {
$sp = Get-MgServicePrincipal -ServicePrincipalId $grant.ClientId -ErrorAction SilentlyContinue
[pscustomobject]@{
AppDisplayName = $sp.DisplayName
Publisher = $sp.PublisherName
VerifiedPublisher = $sp.VerifiedPublisher.DisplayName
AppId = $sp.AppId
ConsentType = $grant.ConsentType
PrincipalId = $grant.PrincipalId
Scope = $grant.Scope
CreatedDateTime = $sp.CreatedDateTime
}
}
$report | Sort-Object CreatedDateTime -Descending |
Export-Csv bec-oauth-mail-grants.csv -NoTypeInformation
Open both CSVs. Anything that doesn't match a known app, a known integration, or a known business reason gets investigated the same day. Common malicious patterns: app names like "PDF Viewer," "eFax," "Mail Manager," published by single-name developers with no verified publisher field, requesting Mail.ReadWrite and Mail.Send together. Those three signals together are diagnostic in our experience. Revoke first and ask questions second.
If you find an active BEC incident
Two paths fork here. If money has already left the account, your first three calls in order are: your bank's wire-recall desk, your cyber insurance carrier's incident hotline, and the FBI's IC3 portal at ic3.gov. The 72-hour wire-recall window is real and it's tighter than people expect.
If you've caught it before money moved, or you're working through a confirmed mailbox compromise during routine auditing, the response sequence matters. The full 25-step structure on BreachShield365 covers password resets, session revocation, audit-log preservation, customer notification, and the legal and insurance touchpoints in the right order. Doing step seven before step four can compromise the evidence you need for the insurance claim. The full sequence and what it covers are in the BreachShield365 walk-through on the signs your M365 tenant is hacked, which links to the response checklist in turn.
If you can only do five things this quarter
Most teams don't get to deploy seven layers in a single quarter. The priority list, ranked by ROI for a 30-to-200-seat tenant:
- Phishing-resistant MFA on every account, plus block legacy authentication. One Conditional Access policy and one Exchange Online authentication policy. Cuts the credential-stuffing path entirely.
- Disable external auto-forwarding tenant-wide and audit existing forwarding rules. Two Defender clicks plus one PowerShell script. Caps blast radius post-compromise.
- Lock down OAuth consent and turn on the admin consent workflow. Closes the consent-phishing door before it opens.
- Configure Defender impersonation protection with named protected users and protected domains. The single highest BEC-specific yield in the email security stack.
- Document and enforce a callback rule for vendor banking changes and wires above a defined threshold. The control that doesn't depend on email working correctly.
DMARC enforcement and role-based training round out the seven. Both matter. Both can wait two months if the five above aren't done yet.
Common questions
We have MFA on every account. Aren't we already protected against BEC?
MFA prevents the password-stuffing version of mailbox compromise. It does little against modern adversary-in-the-middle phishing kits that capture both the password and the post-MFA session cookie in a single user click, and it does nothing against the OAuth-consent attack pattern in Layer 5. MFA is necessary, not sufficient. The seven-layer stack is the actual defense. MFA is the precondition that lets the rest work.
What's the difference between BEC and phishing?
Phishing is the delivery vehicle. BEC is one outcome. A phishing message that harvests a password is phishing. The attacker who uses that password to sit in the mailbox for three weeks, learn the relationships, and then send a wire-redirect message is running a BEC attack. BEC almost always starts with a phishing event of some kind, but BEC is defined by the financial fraud that follows, not the first message.
Do we need a third-party email security tool, or is Microsoft 365 enough?
Microsoft 365 Business Premium plus Defender for Office 365 covers the seven layers above when configured correctly. Below 200 seats, the highest-ROI move is configuring what Microsoft already gave you, not buying another product. Where third-party tools (Mimecast, Proofpoint, Abnormal Security) earn their keep is in regulated industries, at higher seat counts, or for tenants that need behavioral-AI detection of socially-engineered attacks that pass authentication. The decision should follow control gaps, not vendor demos.
How long does it take to deploy all seven layers?
For a tenant of 25 to 100 seats, plan on 12 to 18 hours of admin time spread across four to six weeks. The order: identity hardening and legacy-auth block first (two weeks of staged rollout because user-impacting), forwarding restrictions and OAuth governance second (low risk, immediate value), Defender impersonation protection third, DMARC monitoring throughout with enforcement at week six, payment-process control documented and announced in parallel, training rolling out by month two. Total elapsed calendar time around 45 days end to end, depending on how aggressive you can be with user-facing changes.
If we're already a BEC victim, where do we start?
Start with the response calls in the section above (bank wire-recall, insurance carrier, IC3) before you start with technical remediation. Once those are in motion, the diagnostic flow on how to tell if your email is compromised walks through the unified audit log queries that scope the incident, and the breach-response checklist on BreachShield365 sequences the recovery so the insurance claim and any legal notifications stay clean. Don't reset passwords before you preserve audit logs. The order matters.
Is Your Microsoft 365 Tenant Protected Against BEC?
Run the free M365 risk check. We'll show you which of the seven layers are configured and which are still on default settings.