The democratization of cloud services has fundamentally shifted the threat landscape. We no longer face just malware that exfiltrates data via raw TCP sockets; we now deal with adversaries who "live off the land" by weaponizing the very APIs we trust. Security Arsenal is tracking a concerning trend involving HollowGraph, a malicious component that leverages Microsoft 365 mailbox calendars as a covert Command-and-Control (C2) channel.
Unlike traditional C2 traffic that stands out in network flows, HollowGraph abuses the legitimate Microsoft Graph API. By embedding commands and exfiltrated data within calendar event descriptions and bodies, attackers blend perfectly into normal enterprise traffic. This technique bypasses many traditional network perimeter defenses, making detection nearly impossible without deep visibility into OAuth and API-layer activity. Defenders must pivot their monitoring strategies to focus on behavioral anomalies within cloud workloads rather than relying solely on network signatures.
Technical Analysis
Affected Products and Platforms
- Platform: Microsoft 365 (Exchange Online)
- API: Microsoft Graph API (
https://graph.microsoft.com/v1.0/me/events) - Authentication: Valid user credentials or compromised OAuth tokens (typically obtained via initial access brokers or phishing).
The Attack Chain
- Initial Access: The attacker compromises a user account (e.g., via credential stuffing or token theft).
- C2 Establishment: The HollowGraph component authenticates to the Microsoft Graph API using the stolen token.
- Communication:
- Beaconing: The malware reads specific calendar events (often looking for specific keywords or base64-encoded strings in the event description/body).
- Exfiltration: Stolen data is posted back to the attacker by creating or updating calendar events with hidden data payloads.
- Stealth: Because the traffic is HTTPS destined to
graph.microsoft.com, it appears indistinguishable from legitimate user activity to firewalls and proxies.
Exploitation Status
- Status: Confirmed Active Exploitation (ITW).
- Severity: High. This technique provides a high-fidelity channel that is difficult to block without impacting business productivity.
Detection & Response
Detecting HollowGraph requires identifying anomalies in how the Microsoft Graph API is utilized. Specifically, we look for high-frequency updates to calendar events, usage of the API from unusual user agents, or API calls originating from impossible travel locations.
SIGMA Rules
---
title: HollowGraph Suspicious M365 Calendar Update Frequency
id: 85d9a23-0f72-4e3a-a8c5-1d2f3b4c5d6e
status: experimental
description: Detects potential HollowGraph activity by identifying high-frequency updates to M365 calendar events via Graph API, indicative of C2 check-ins.
references:
- https://attack.mitre.org/techniques/T1071/
author: Security Arsenal
date: 2026/05/12
tags:
- attack.command_and_control
- attack.t1071.004
logsource:
product: o365
service: audit_general
detection:
selection:
Operation|contains:
- 'UpdateCalendarEvents'
- 'CalendarEvents Update'
filter_legitimate:
UserId|contains:
- 'service.account' # Exclude known automation accounts
condition: selection | count() by UserId > 10 # Threshold: 10 updates in 15 mins
timeframe: 15m
falsepositives:
- Power users managing calendar busy schedules
- Synchronization tools acting on behalf of users
level: high
---
title: HollowGraph Graph API Access from Non-Standard User-Agent
id: 92e1c82-9e4b-4d67-bc12-3e5a8f901234
status: experimental
description: Detects Microsoft Graph API access to Calendar resources using user agents not associated with standard Office clients, often indicative of custom malware.
references:
- https://attack.mitre.org/techniques/T1071/
author: Security Arsenal
date: 2026/05/12
tags:
- attack.command_and_control
- attack.t1071.001
logsource:
product: o365
service: audit_general
detection:
selection:
Operation|contains:
- 'CalendarEvents'
ClientAppId|startswith: '00000003-0000-0000-c000-000000000000' # Microsoft Office 365 Exchange Online
filter_office_clients:
ClientUA|contains:
- 'Microsoft Office'
- 'Outlook'
- 'MacOutlook'
- 'iOS'
- 'Android'
condition: selection and not filter_office_clients
falsepositives:
- Custom internal scripts using Graph SDKs
- Third-party calendar integrations (e.g., Zoom, Salesforce)
level: medium
KQL (Microsoft Sentinel / Defender)
This query targets the OfficeActivity table to identify users performing a high volume of calendar updates, a hallmark of HollowGraph's polling mechanism.
OfficeActivity
| where TimeGenerated > ago(1h)
| where Operation has_any ("CalendarEvents", "UpdateCalendarEvents")
| extend UserPrincipalName = tostring(UserId)
| extend ClientIP = parse_(ClientIP)[0] // Handle complex IP objects if present
| summarize Count = count(), DistinctIPs = dcount(ClientIP), Operations = makeset(Operation) by UserPrincipalName, bin(TimeGenerated, 10m)
| where Count > 5 // Threshold tuning required based on environment baseline
| project TimeGenerated, UserPrincipalName, Count, DistinctIPs, Operations
| order by Count desc
Velociraptor VQL
This artifact hunts for endpoint processes establishing network connections to the Microsoft Graph API endpoint, excluding known browser and office executables to isolate potential malware like HollowGraph.
-- Hunt for non-standard processes connecting to Microsoft Graph API
SELECT Pid, Name, CommandLine, Exe, Username
FROM pslist()
WHERE Pid IN (
SELECT Pid
FROM netstat()
WHERE RemoteAddress =~ 'graph.microsoft.com'
AND RemotePort == 443
)
AND NOT Name =~ '(Outlook.exe|chrome.exe|msedge.exe|firefox.exe|teams.exe|excel.exe|winword.exe|powershell.exe|pwsh.exe)'
AND NOT Exe =~ '(C:\Program Files\.*|C:\Program Files (x86)\.*)'
Remediation Script (PowerShell)
This PowerShell script assists Incident Responders in isolating a compromised host by identifying active connections to Microsoft Graph from suspicious processes and collecting process ancestry for forensic analysis.
<#
.SYNOPSIS
Investigator Script: Identify suspicious Graph API connections on endpoint.
.DESCRIPTION
Identifies processes connecting to graph.microsoft.com and exports process details for IR triage.
#>
Write-Host "[+] Initiating HollowGraph Endpoint Hunt..." -ForegroundColor Cyan
$suspiciousConnections = Get-NetTCPConnection -RemoteAddress (Resolve-DnsName -Name "graph.microsoft.com" -Type A | Select-Object -First 1 -ExpandProperty IPAddress) -ErrorAction SilentlyContinue
if ($suspiciousConnections) {
Write-Host "[!] Found active connections to graph.microsoft.com:" -ForegroundColor Yellow
foreach ($conn in $suspiciousConnections) {
try {
$process = Get-Process -Id $conn.OwningProcess -ErrorAction Stop
# Filter out common legitimate paths (heuristic)
$legitPaths = @("Program Files", "Program Files (x86)", "Windows", "WindowsApps")
$isLegit = $false
foreach ($path in $legitPaths) {
if ($process.Path -like "*$path*") { $isLegit = $true; break }
}
if (-not $isLegit) {
Write-Host " SUSPICIOUS PROCESS DETECTED:" -ForegroundColor Red
Write-Host " PID: $($process.Id)"
Write-Host " Name: $($process.ProcessName)"
Write-Host " Path: $($process.Path)"
Write-Host " Command Line: $($process.StartInfo.Arguments)"
# Collect parent process info
$parent = Get-Process -Id $process.ParentId -ErrorAction SilentlyContinue
Write-Host " Parent PID: $($parent.Id) ($($parent.ProcessName))"
}
}
catch {
Write-Host " Could not resolve details for PID $($conn.OwningProcess) (Process may have terminated)."
}
}
} else {
Write-Host "[-] No active connections to graph.microsoft.com found." -ForegroundColor Green
}
Write-Host "[+] Hunt complete. Review findings for HollowGraph artifacts."
Remediation
To neutralize the HollowGraph threat and secure the M365 tenant:
-
Identity Containment:
- Immediately reset passwords for affected users.
- Revoke all sessions: Use the Microsoft Entra admin center (formerly Azure AD) to sign the user out of all sessions immediately.
- Invalidate Refresh Tokens.
-
Conditional Access Hardening:
- Implement "Impossible Travel" policies to detect credentials being used from geographically distant locations simultaneously.
- Require Compliant Device or Hybrid Azure AD Join status for access to the Microsoft Graph API. This effectively blocks HollowGraph running on unmanaged or personal endpoints.
- Enforce Client Apps controls to block access from legacy authentication protocols.
-
Microsoft Defender for Cloud Apps (MDCA):
- Create a session policy to detect and block "Mass download" or "Unusual frequency of file read/write" activities.
- Investigate connected apps via OAuth and revoke permissions for any non-corporate applications that have read/write access to Calendars.
-
Mailbox Hygiene:
- Conduct a thorough review of Inbox Rules and delegated access within the compromised mailbox. Attackers often leave backdoors via rules to maintain persistence.
Related Resources
Security Arsenal Incident Response Services AlertMonitor Platform Book a SOC Assessment incident-response Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.