When a publicly traded healthcare company files an 8-K with the SEC over a social engineering incident, the rules of the game have changed. Astrana Health — a managed services organization supporting value-based care delivery for providers — recently notified the U.S. Securities and Exchange Commission about a social engineering incident, as reported by The HIPAA Journal. The disclosure itself is the story within the story: social engineering attacks against healthcare organizations are no longer just an IT problem handled quietly with a password reset. They are material events with regulatory, financial, and patient-privacy consequences.
For defenders, this incident is a forcing function. If a threat actor can socially engineer their way into a healthcare MSO's environment — an organization whose entire business model depends on trusted access to provider systems and patient data — they can do it to your organization. This post breaks down the attack pattern behind incidents like this, the detections that actually catch them, and the hardening steps that close the gaps before the next 8-K gets filed with your company's name on it.
Why This Incident Matters Beyond Astrana Health
Healthcare managed services organizations sit at a dangerous intersection. They hold administrative credentials, billing system access, and clinical workflow integrations across dozens or hundreds of downstream provider clients. A compromise at the MSO level isn't a single-tenant breach — it's a potential supply-chain event for every provider in the network. That's precisely why threat actors target them, and why the SEC's materiality disclosure rules (in effect since late 2023) now force these incidents into the open within four business days of a materiality determination.
Social engineering remains the most reliable initial access vector in healthcare for a simple reason: it bypasses the entire perimeter. No exploit chain, no zero-day, no EDR-evading loader — just a convincing pretext delivered to a human with legitimate credentials. The typical chain we see in IR engagements against healthcare services organizations looks like this:
- Reconnaissance — The actor harvests employee names, titles, and email formats from LinkedIn, data broker dumps, or prior breach corpora. Healthcare org charts are unusually public.
- Phishing or vishing pretext — Either a credential-harvesting page fronted by an adversary-in-the-middle (AiTM) proxy kit, or a voice call to the help desk impersonating a locked-out physician or traveling executive requesting an MFA reset.
- Credential capture and MFA bypass — AiTM kits capture the session token in real time, defeating SMS, push, and even TOTP-based MFA. In help-desk scenarios, the attacker convinces staff to enroll an attacker-controlled device as a new MFA factor.
- Mailbox persistence — Within minutes of access, the attacker creates inbox rules to auto-delete or archive security alerts, password reset notifications, and replies from victims of internal phishing sent from the compromised mailbox.
- Expansion — The compromised account is used for internal phishing (extremely high success rate), OAuth consent grants for persistent API access, or direct access to integrated clinical/billing SaaS platforms via SSO.
The critical defensive insight: steps 3 through 5 are all noisy in your logs if you're looking. The attack stops being invisible the moment the actor touches the mailbox, registers a device, or grants an OAuth consent.
Detection & Response
The detections below target the post-compromise behaviors common to social-engineering-driven email account takeover in Microsoft 365 — the environment most healthcare organizations operate in. These are tuned for signal, not volume.
Sigma Rules
---
title: Suspicious Inbox Rule Hiding Security or Phishing Indicators
id: 9f2c4a71-3b8e-4d1f-a6c2-7e5d8b9f0a12
status: experimental
description: Detects creation of mailbox inbox rules that delete, archive, or move messages containing security-relevant keywords — a hallmark of business email compromise persistence following social engineering.
references:
- https://attack.mitre.org/techniques/T1098/002/
- https://attack.mitre.org/techniques/T1566/
author: Security Arsenal
date: 2026/04/06
tags:
- attack.persistence
- attack.t1098.002
- attack.initial_access
- attack.t1566
logsource:
product: m365
service: exchange
detection:
selection_operation:
Operation:
- 'New-InboxRule'
- 'Set-InboxRule'
selection_action:
Parameters|contains:
- 'DeleteMessage'
- 'MoveToFolder'
selection_keywords:
Parameters|contains:
- 'phish'
- 'security alert'
- 'sign-in'
- 'signin'
- 'password'
- 'unusual activity'
- 'verify'
- 'invoice'
- 'payment'
condition: selection_operation and selection_action and selection_keywords
falsepositives:
- Legitimate user rules for newsletter filtering (rare with delete actions on security keywords)
- Help desk administrative mailbox management — validate rule creator vs. mailbox owner
level: high
---
title: OAuth Application Consent Grant by End User
id: 2d7b8e43-5f1a-4c9d-b3e6-8a2f1d4c7b90
status: experimental
description: Detects end users granting OAuth consent to applications, a common persistence and data-access technique following AiTM phishing and account takeover in M365 environments.
references:
- https://attack.mitre.org/techniques/T1528/
- https://attack.mitre.org/techniques/T1098/003/
author: Security Arsenal
date: 2026/04/06
tags:
- attack.persistence
- attack.t1098.003
- attack.credential_access
- attack.t1528
logsource:
product: azure
service: auditlogs
detection:
selection:
OperationName:
- 'Consent to application'
- 'Add service principal'
- 'Add delegated permission grant'
filter_known_admins:
InitiatedBy|contains:
- 'admin@'
- 'Global Administrator'
condition: selection and not filter_known_admins
falsepositives:
- Legitimate third-party SaaS onboarding — maintain an approved application allowlist
- Developer tenants and sandbox subscriptions
level: high
---
title: New MFA Device or Authentication Method Registered Post-Suspicious Sign-In
id: 6c1e9a35-7d42-4b8f-a3d9-1e6c5f8b2a47
status: experimental
description: Detects registration of new authentication methods (phone, FIDO key, authenticator app) on an account, a key indicator of help-desk social engineering and MFA factor hijacking.
references:
- https://attack.mitre.org/techniques/T1078/
- https://attack.mitre.org/techniques/T1656/
author: Security Arsenal
date: 2026/04/06
tags:
- attack.persistence
- attack.t1656
- attack.initial_access
- attack.t1078
logsource:
product: azure
service: auditlogs
detection:
selection:
OperationName:
- 'User registered security info'
- 'User changed default security info'
- 'Admin updated security info'
- 'Add strong authentication phone device'
condition: selection
falsepositives:
- New hire onboarding — correlate against HR provisioning timestamps
- Legitimate device replacement — validate via help desk ticket cross-reference
level: medium
The first rule is your highest-fidelity BEC tripwire. Attackers almost universally create mail-flow rules to suppress the noise their own access generates — password reset confirmations, Microsoft security alerts, and replies from internal phishing targets. A rule that deletes messages mentioning "security alert" or "sign-in" has essentially no legitimate business use.
KQL Hunt — Microsoft Sentinel
This hunt correlates the three strongest takeover signals in a time window: anomalous sign-in properties, followed by inbox rule creation, followed by outbound mail volume spikes — the classic post-AiTM compromise sequence. Run it over 14 days across your entire tenant, and treat any single user hitting all three stages as an incident, not an alert.
let lookback = 14d;
let suspiciousSignins = SigninLogs
| where TimeGenerated > ago(lookback)
| where ResultType == 0
| summarize FirstSignIn=min(TimeGenerated),
Locations=make_set(Location),
UserAgents=make_set(UserAgent),
AuthMethods=make_set(AuthenticationRequirement)
by UserPrincipalName, IPAddress
| where array_length(Locations) > 0;
let inboxRuleEvents = OfficeActivity
| where TimeGenerated > ago(lookback)
| where Operation in~ ("New-InboxRule", "Set-InboxRule")
| extend RuleParams = tostring(Parameters)
| where RuleParams has_any ("DeleteMessage", "MoveToFolder", "RSS Feeds", "Junk")
or RuleParams has_any ("security", "sign-in", "password", "invoice", "payment")
| project RuleTime=TimeGenerated, UserId, Operation, RuleParams, ClientIP;
let oauthGrants = AuditLogs
| where TimeGenerated > ago(lookback)
| where OperationName has_any ("Consent to application", "Add delegated permission grant")
| extend TargetUser = tostring(parse_json(tostring(InitiatedBy.user)).userPrincipalName)
| project ConsentTime=TimeGenerated, TargetUser, OperationName,
AppName=tostring(parse_json(tostring(TargetResources[0])).displayName),
ConsentIP=IPAddress;
let mfaChanges = AuditLogs
| where TimeGenerated > ago(lookback)
| where OperationName has_any ("User registered security info", "Admin updated security info")
| extend TargetUPN = tostring(parse_json(tostring(TargetResources[0])).userPrincipalName)
| project MfaTime=TimeGenerated, TargetUPN, OperationName;
// Correlate: same user, inbox rule AND (oauth grant OR MFA change) within 24h
inboxRuleEvents
| join kind=inner (oauthGrants) on $left.UserId == $right.TargetUser
| where abs(datetime_diff('minute', RuleTime, ConsentTime)) < 1440
| project UserId, RuleTime, RuleParams, ClientIP, ConsentTime, AppName, ConsentIP
| join kind=leftouter (mfaChanges) on $left.UserId == $right.TargetUPN
| project UserId, RuleTime, RuleParams, ClientIP, AppName, ConsentIP, MfaTime, OperationName1
| sort by RuleTime desc
For environments ingesting sign-in data into SecurityEvent via legacy paths, or hunting outbound mail volume after a suspected compromise:
// Outbound mail burst detection from a single mailbox — post-takeover internal phishing
OfficeActivity
| where TimeGenerated > ago(7d)
| where Operation =~ "Send"
| summarize SentCount=count(), DistinctRecipients=dcount(tostring(parse_json(ExchangeMetaData).To))
by UserId, bin(TimeGenerated, 1h)
| where SentCount > 50 or DistinctRecipients > 30
| join kind=inner (
OfficeActivity
| where TimeGenerated > ago(7d)
| where Operation in~ ("New-InboxRule", "Set-InboxRule")
| project RuleTime=TimeGenerated, UserId
) on UserId
| where TimeGenerated between (RuleTime .. RuleTime + 48h)
| sort by SentCount desc
The thresholds (50 sends/hour, 30 distinct recipients) are starting points — baseline your clinical communications teams first, because care-coordination platforms and referral desks at MSOs can legitimately send at volume. Tune against known-good senders before enabling as an analytic rule.
Velociraptor VQL — Endpoint Triage
When a user reports a suspected phishing click or credential entry, the endpoint question is: did anything execute, and is there AiTM kit artifact evidence in the browser? This artifact hunts for recently spawned Office/browser child processes consistent with phishing lure execution, plus credential-theft-adjacent artifacts on the triage host:
-- Triage hunt: suspicious browser/Office child processes and recent
-- credential-adjacent file access following a suspected phishing click.
-- Scope to the affected user host via a label or client hunt.
LET proc_hunt = SELECT Pid, Ppid, Name, CommandLine, Exe, Username, CreateTime
FROM pslist()
WHERE (Name =~ '(?i)(winword|excel|powerpnt|outlook|msedge|chrome|firefox|brave)'
AND CommandLine =~ '(?i)(powershell|cmd\.exe|wscript|cscript|mshta|rundll32|regsvr32|curl|bitsadmin)')
OR CommandLine =~ '(?i)(-enc|-encodedcommand|downloadstring|iex|invoke-expression)'
LET lnk_artifacts = SELECT FullPath, Size, Mtime, Atime
FROM glob(globs='C:/Users/*/AppData/Roaming/Microsoft/Windows/Recent/*.lnk')
WHERE Mtime > now() - (72 * 60 * 60)
ORDER BY Mtime DESC
SELECT * FROM proc_hunt
UNION ALL
SELECT NULL AS Pid, NULL AS Ppid, 'LNK_ARTIFACT' AS Name,
FullPath AS CommandLine, NULL AS Exe, NULL AS Username,
Mtime AS CreateTime
FROM lnk_artifacts
The process-hunt logic catches the most common post-click execution pattern — a document or browser spawning a script interpreter — while the LNK artifact pull gives you the 72-hour file-open timeline you need to reconstruct exactly what the user opened and when. Correlate Mtime against the phishing email delivery timestamp from your mail gateway to confirm the click.
Hardening and Verification Script
This PowerShell audits an M365 tenant for the exact persistence mechanisms used in these incidents: suspicious inbox rules across all mailboxes, recent OAuth consent grants, and accounts with newly registered MFA methods. Run it as part of IR triage for any suspected social engineering compromise — and monthly as proactive hygiene. Requires the ExchangeOnlineManagement and Microsoft.Graph modules.
# Astrana-pattern account takeover audit — IR triage and monthly hygiene
# Requires: ExchangeOnlineManagement, Microsoft.Graph (AuditLog.Read.All, Directory.Read.All)
Connect-ExchangeOnline
Connect-MgGraph -Scopes "AuditLog.Read.All","Directory.Read.All"
$startDate = (Get-Date).AddDays(-30)
$report = @()
# 1. Audit all mailboxes for inbox rules with delete/move actions on security keywords
Write-Host "[*] Auditing inbox rules across tenant..." -ForegroundColor Cyan
Get-Mailbox -ResultSize Unlimited | ForEach-Object {
$mbx = $_.UserPrincipalName
Get-InboxRule -Mailbox $mbx -ErrorAction SilentlyContinue | Where-Object {
($_.DeleteMessage -eq $true -or $_.MoveToFolder) -and
($_.SubjectOrBodyContainsWords -match 'security|sign-in|password|invoice|payment|alert' -or
$_.SubjectContainsWords -match 'security|sign-in|password|invoice|payment|alert')
} | ForEach-Object {
$report += [PSCustomObject]@{
Finding = 'SuspiciousInboxRule'; Mailbox = $mbx
Detail = "$($_.Name) | Delete=$($_.DeleteMessage) | Move=$($_.MoveToFolder)"
Severity = 'HIGH'
}
}
}
# 2. Recent OAuth consent grants (last 30 days)
Write-Host "[*] Auditing OAuth consent grants..." -ForegroundColor Cyan
Get-MgAuditLogDirectoryAudit -Filter "activityDisplayName eq 'Consent to application'" -Top 500 |
Where-Object { $_.ActivityDateTime -gt $startDate } | ForEach-Object {
$report += [PSCustomObject]@{
Finding = 'OAuthConsent'
Mailbox = $_.InitiatedBy.User.UserPrincipalName
Detail = "App: $($_.TargetResources[0].DisplayName) | $($_.ActivityDateTime)"
Severity = 'MEDIUM'
}
}
# 3. Recently registered MFA methods (help-desk social engineering indicator)
Write-Host "[*] Auditing recent MFA method registrations..." -ForegroundColor Cyan
Get-MgAuditLogDirectoryAudit -Filter "activityDisplayName eq 'User registered security info'" -Top 500 |
Where-Object { $_.ActivityDateTime -gt $startDate } | ForEach-Object {
$report += [PSCustomObject]@{
Finding = 'MFARegistration'
Mailbox = $_.TargetResources[0].UserPrincipalName
Detail = "Registered by: $($_.InitiatedBy.User.UserPrincipalName) | $($_.ActivityDateTime)"
Severity = 'MEDIUM'
}
}
$report | Sort-Object Severity, Finding | Format-Table -AutoSize
$report | Export-Csv -Path ".\M365_Takeover_Audit_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation
Write-Host "[+] Audit complete. Results exported to CSV. Investigate all HIGH findings immediately." -ForegroundColor Green
Any HIGH finding from the inbox rule audit where the rule creator doesn't match the mailbox owner's recent activity pattern should be treated as confirmed compromise until proven otherwise: revoke sessions, reset credentials, revoke OAuth grants, and pull the full audit trail for the account.
Remediation and Prevention Roadmap
There's no patch for social engineering — but there is a well-understood set of controls that collapses the attack surface. In priority order based on what we see fail in real engagements:
1. Kill phishable MFA. The single highest-impact control. Move all users — starting with executives, finance, IT help desk, and anyone with access to clinical or billing systems — to phishing-resistant authentication: FIDO2 security keys or Windows Hello for Business. Microsoft and CISA both explicitly recommend phishing-resistant MFA as the primary defense against AiTM token theft. SMS and push-notification MFA are defeated by every modern AiTM kit.
2. Lock down the help desk. Help-desk social engineering (MFA reset pretexting) is the fastest-growing variant. Require verified identity proofing for any MFA reset or credential change: manager callback on a known number, HR-record verification, or in-person/ID-verified video confirmation for privileged and clinical staff. Log and alert on every Admin updated security info event.
3. Enforce Conditional Access with token protection. Require compliant devices for access to Exchange Online, SharePoint, and any SSO-integrated clinical SaaS. Enable token protection (in public preview/general availability via Entra ID P2) for Office 365 apps to bind session tokens to the device — this directly defeats AiTM session replay. Block legacy authentication entirely.
4. Restrict OAuth consent. Disable user consent to applications tenant-wide, or scope it to verified publishers with low-risk permissions only. Route everything else through an admin consent workflow. This removes the persistence channel attackers use to survive password resets.
5. Monitor inbox rules as a first-class detection. Deploy the Sigma and KQL content above. Automated alerting on suspicious rule creation is one of the highest signal-to-noise detections available in M365 — most tenants have zero legitimate rules matching these patterns.
6. Prepare for the disclosure clock. The Astrana filing is a case study in the SEC's four-business-day materiality disclosure requirement. Healthcare organizations that are public — or that support public entities — need an IR retainer, a pre-approved materiality assessment framework, and legal/comms integrated into the IR plan before the incident, not during it. Add HIPAA breach notification obligations (60 days to HHS for 500+ record breaches, plus state AG timelines that can be as short as 30 days) and the response timeline gets unforgiving fast.
7. Test the human layer with realistic pretexts. Annual checkbox phishing simulations don't move the needle. Run quarterly simulations that mirror current tradecraft: AiTM-style credential pages, MFA fatigue prompts, and vishing calls to your help desk. Measure reporting rate and time-to-report, not just click rate.
The Bottom Line
Astrana Health's SEC notification is what mature incident handling looks like in 2026 — and it's also a warning. Social engineering against healthcare services organizations works because the trust relationships that make coordinated care possible are the same ones attackers exploit. The organizations that weather these incidents without material impact are the ones that made the compromise technically noisy: phishing-resistant MFA, consent lockdown, inbox rule alerting, and a help desk that treats every reset request as a potential intrusion.
The detections in this post are deployable today. If your SOC can't currently answer "show me every inbox rule created in the last 30 days that deletes security-related mail," that's your first gap to close.
Related Resources
Security Arsenal Healthcare Cybersecurity AlertMonitor Platform Book a SOC Assessment healthcare Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.