How to Fix ManageEngine AD360 SSO Exploit and Block Calendar C2
July 20, 2026· 9 min read
TL;DR: Patch ManageEngine AD360 to 7.2.2+, enforce MFA on every SSO ticket request, and deploy a calendar‑based IOC detection pipeline that quarantines or deletes events dated after 2030. These steps neutralize the CVE‑2026‑11374 ticket‑predictability flaw, stop the HOLLOWGRAPH 2050‑date C2 channel, and prepare your ransomware response plan for the imminent global bans on ransom payments.
1. Introduction – Why These Three Issues Matter Together
1. Introduction – Why These Three Issues Matter Together
In Q4 2025, three seemingly unrelated developments converged on a common attack surface:
Issue
Vector
Primary Trust Assumption
-------
--------
--------------------------
CVE‑2026‑11374
Predictable SSO ticket generation in ManageEngine AD360
Ticket entropy is sufficient to guarantee authenticity.
HOLLOWGRAPH
Calendar‑based C2 using Microsoft 365 events dated 2050
Future‑dated calendar entries are never queried by legitimate services.
Ransomware‑payment bans
Legislative prohibitions on paying extortionists
Payment is a purely business decision without legal penalty.
When an organization runs ManageEngine AD360 for identity synchronization and relies on Microsoft 365 for collaboration, the two first vectors become a single “golden‑ticket” pathway: an attacker can first compromise AD360, then use the compromised service account to create the 2050 calendar event, and finally exfiltrate data or trigger ransomware that can no longer be paid out of fear of regulatory fines.
Hardening one component in isolation is insufficient. A comprehensive mitigation plan must address:
Identity token integrity – eliminate deterministic ticket generation and add a second factor.
Telemetry and IOC hygiene – surface abnormal calendar artifacts before they become a silent C2 channel.
Business continuity – assume ransom payment is illegal and design backup/recovery processes that make paying unnecessary.
2. Deep Dive: AD360 SSO Ticket Predictability (CVE‑2026‑11374)
2.1 Architecture of the Vulnerable Ticket Flow
Below is a simplified sequence diagram of the AD360 SSO flow in a vulnerable 7.1.x deployment:
User → AD360 SSO Portal (GET /login) → AD360 Auth Service
↳ Auth Service creates ticket:
ticket = PREFIX + UNIX_EPOCH_SECONDS + COUNTER(0‑9999)
↳ Ticket returned as URL param:
https://app.example.com?ticket=AD360-1623456789-0423
App → AD360 API (Authorization: Bearer <ticket>)
↳ API validates ticket by:
1. Splitting prefix, timestamp, counter
2. Checking timestamp is within ±30 s of server clock
3. Accepting any counter value
↳ No cryptographic signature, no HMAC
Key weaknesses:
✔️Deterministic space – only 10 000 possible tickets per second.
✔️No binding to client identity – the ticket can be replayed from any IP.
✔️No integrity protection – the server trusts the raw string.
Because the same ticket‑generation library is shared across AD360, ADSync, ADSelfService, and ADSecurity, an attacker who cracks one ticket can pivot to all four services.
2.2 Real‑World Exploitation Timeline
Date
Event
------
-------
2026‑06‑15
Vulnerability disclosed publicly via ManageEngine advisory.
2026‑06‑20
First open‑source PoC released on GitHub (≈ 300 stars).
2026‑07‑02
Ransomware group “HOLLOWGRAPH” integrates ticket‑brute‑force into their initial‑access chain.
2026‑07‑10
Three medium‑size enterprises report lateral movement from AD360 to domain‑controller compromise.
Vulners survey shows 38 % of enterprises still on < 7.2.2.
The PoC demonstrates a 500 k attempts/s brute‑force on a modest 2‑core VM, meaning a full ticket space can be exhausted in ~0.02 seconds. In practice, network latency and rate‑limiting raise that to 1‑2 seconds, which is still fast enough to automate within a single attack playbook.
2.3 Risk Quantification
Metric
Value (Typical Enterprise)
--------
----------------------------
Potential impact
Full AD object write, password reset, group policy change – equivalent to a Golden Ticket.
Mean Time to Detect (MTTD)
4–7 days (no native alerts for ticket misuse).
Mean Time to Contain (MTTC)
12–18 days (requires manual AD audit).
Annualized Loss Expectancy (ALE)
$3.2 M (based on Ponemon 2025 data for credential‑theft incidents).
Exploitability Score (CVSS v3.1)
9.8 (Critical).
The high CVSS score, combined with the low detection probability, makes this a must‑fix vulnerability.
sha256sum AD3607.2.2linux.tar.gz → compare with vendor‑published hash.
6. Apply Patch
tar -xzf AD3607.2.2linux.tar.gz -C /opt/ad360 && /opt/ad360/bin/upgrade.sh
7. Validate
Re‑run version endpoint; should return 7.2.2.
8. Post‑Patch Smoke Test
Log in via SSO portal; verify API calls succeed; confirm HMAC‑signed tickets (/api/v1/ticket returns signature field).
9. Automate Compliance
Ansible task to fail if AD360 version is outdated.
Tip: Embed the above steps into a centralized playbook that iterates over a host inventory file if you manage multiple AD360 instances.
3.2 MFA Hardening Guide
Even after patching, MFA adds a second independent factor that is not vulnerable to ticket‑prediction. Below is a practical rollout plan that works for both TOTP (Google Authenticator, Authy) and FIDO2 (YubiKey, Windows Hello).
✔️TOTP – upload a shared secret per user (auto‑generated via ad360-cli user create --mfa=totp).
✔️FIDO2 – register device IDs via the portal; AD360 stores the public key in its vault.
Enforce: Set “MFA required for all users” and “MFA required for service accounts”.
#### 3.2.2 Service‑Account Hardening
Create a dedicated TicketIssuer service account:
Attribute
Value
-----------
-------
Username
svcticketissuer
Roles
TicketIssuer (custom, read‑only on user objects, write on ticket endpoint)
MFA
Mandatory – TOTP only (allows automation via a secure vault).
IP Allowlist
10.0.0.0/16 (internal network)
Password
Random 32‑character string stored in HashiCorp Vault.
Rotate the password every 90 days and push the new secret to your CI/CD secret store.
3.3 Least‑Privilege Service‑Account Design
A role‑based access control (RBAC) matrix for AD360 after hardening:
Role
API Endpoints Allowed
Description
------
-----------------------
-------------
TicketIssuer
POST /api/v1/ticket
Issue tickets only; cannot read/write AD objects.
UserAdmin
GET/POST/PUT /api/v1/users
Manage user objects, no ticket issuance.
ReadOnly
GET /api/v1/*
Audit only.
SuperAdmin
Never used in production – keep disabled.
Implement the matrix via the AD360 policy engine (/api/v1/policy) and audit changes weekly.
3.4 Runtime Detection Sensor
A lightweight Go sensor can be compiled to a single binary (< 2 MB) and run as a sidecar or systemd service. It monitors the ticket endpoint and raises alerts when abnormal patterns are observed.
go
package main
import (
"log"
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
reqCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "ad360_ticket_requests_total",
Help: "Number of ticket requests per source IP",
},
[]string{"src_ip"},
)
anomalyGauge = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "ad360_ticket_anomaly",
Help: "1 if anomaly detected, else 0",
})
)
func init() {
prometheus.MustRegister(reqCounter, anomalyGauge)
}
func ticketHandler(w http.ResponseWriter, r *http.Request) {
src := r.RemoteAddr
reqCounter.WithLabelValues(src).Inc()
// Simple heuristic: >100 req/min from same IP
// In production, replace with sliding‑window algorithm.
if reqCounter.WithLabelValues(src).GetMetricWithLabelValues().(prometheus.Counter).Value() > 100 {
anomalyGauge.Set(1)
log.Printf("Anomaly detected from %s", src)
// Optional: push to firewall blocklist via API
} else {
anomalyGauge.Set(0)
// Forward request to real AD360 service
// (omitted for brevity)
}
}
func main() {
http.Handle("/metrics", promhttp.Handler())
http.HandleFunc("/api/v1/ticket", ticketHandler)
log.Println("Starting AD360 ticket sensor on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
Deployment steps:
Build: GOOS=linux GOARCH=amd64 go build -o ad360-ticket-sensor .
Containerize (optional):
dockerfile
FROM alpine:3.18
COPY ad360-ticket-sensor /usr/local/bin/
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/ad360-ticket-sensor"]
Deploy via Kubernetes as a DaemonSet so every AD360 node runs the sensor locally, minimizing latency.
Configure Prometheus to scrape http://:8080/metrics.
When the alert fires, a webhook can automatically add the offending IP to a firewall blocklist (e.g., Palo Alto PAN‑OS API).
3.5 Trade‑offs & Performance Considerations
Aspect
Before Patch
After Patch + MFA
After Sensor
--------
--------------
-------------------
--------------
Ticket Generation Latency
~5 ms (simple concat)
~12 ms (random 128‑bit + HMAC)
Negligible (sensor runs in parallel)
CPU Overhead
< 1 % on 2‑core VM
~2 % (crypto)
~0.5 % (Go runtime)
User Experience
No extra step
+1 s for TOTP entry (or FIDO2 tap)
Transparent
Security Posture
Critical
High (cryptographically signed tickets)
Very High (real‑time detection)
If legacy applications cannot handle a 1‑second MFA prompt, consider device‑based push (e.g., Duo Push) that users can approve with a single tap. The trade‑off is a dependency on an external MFA provider; ensure an out‑of‑band fallback (SMS) for disaster recovery.
Retrieval – compromised host runs a scheduled task that calls GET /me/events?$filter=start/dateTime gt '{{now}}' and decrypts the body. Because the start date is far in the future, normal calendar‑sync clients never download the event, keeping it hidden.
The attacker can update the same event repeatedly, turning the calendar into a persistent, low‑bandwidth C2 mailbox that survives user deletion.
4.2 IOC Taxonomy
IOC Type
Example
Detection Rationale
----------
---------
---------------------
Future‑Date Event
start.dateTime > 2030-01-01T00:00:00Z
Legitimate meetings rarely exceed 5‑year horizon.
Large Body Size
body.content length > 1 KB
Calendar invites normally contain < 200 B of text.
Binary‑Like Encoding
Base64 string with high entropy (entropy > 4.5)
Encrypted payloads produce high‑entropy strings.
Rare Graph Queries
GET /me/events?$filter=start/dateTime gt {{now+10y}}
Normal clients never request > 10 years ahead.
Service‑Account Owner
Event owner = svcticketissuer (or any non‑human account)
Human users seldom create 2050 events.
4.3 Detection Rules for Popular SIEMs
#### 4.3.1 Splunk Search
spl
index=azure_audit
| where operationName="Create calendar event" OR operationName="Update calendar event"
| eval startYear=strptime(start.dateTime, "%Y-%m-%dT%H:%M:%S")
| where startYear > 2030
| eval bodySize=len(body.content)
| where bodySize > 1024
| eval entropy=entropy(body.content)
| where entropy > 4.5
| table _time, userPrincipalName, operationName, start.dateTime, bodySize, entropy
| sort -_time
All three queries should feed alerts into the incident response queue with a severity of High.
4.4 Automated Remediation Scripts
#### 4.4.1 PowerShell – Nightly Quarantine
powershell
# Requires ExchangeOnlineManagement module
Connect-ExchangeOnline -UserPrincipalName admin@contoso.com
$threshold = (Get-Date).AddYears(20) # 2043 is safe; we choose 2030 for stricter policy
$events = Get-CalendarDiagnosticObjects -Identity "svc_ticket_issuer" -StartDate $threshold
foreach ($ev in $events) {
Write-Host "Quarantining event $($ev.Id) with start $($ev.Start)"
# Move to a hidden “Quarantine” calendar
New-CalendarEvent -Mailbox "admin@contoso.com" -Subject "[Quarantine] $($ev.Subject)" `
-Start $ev.Start -End $ev.End -Body $ev.Body -IsReminderSet $false
# Delete original
Remove-CalendarDiagnosticObject -Identity $ev.Id -Confirm:$false
}
Schedule via Task Scheduler or Azure Automation to run 02:00 UTC daily. Log deletions to an Azure Log Analytics workspace for audit.
#### 4.4.2 Azure Function (Node.js) – Real‑Time Block
javascript
module.exports = async function (context, req) {
const graph = require('@microsoft/microsoft-graph-client');
const client = graph.Client.init({
authProvider: (done) => {
// Acquire token with Managed Identity
const token = process.env['MSI_ACCESS_TOKEN'];
done(null, token);
},
});
const now = new Date();
const future = new Date(now);
future.setFullYear(now.getFullYear() + 10); // >10 years
const events = await client.api('/me/events')
.filter(`start/dateTime gt '${future.toISOString()}'`)
.get();
for (const ev of events.value) {
if (ev.body.content.length > 1024 && /[A-Za-z0-9+/=]{100,}/.test(ev.body.content)) {
// Delete event
await client.api(`/me/events/${ev.id}`).delete();
context.log(`Deleted suspicious event ${ev.id}`);
}
}
context.res = { status: 200 };
};
Deploy this function with a Timer trigger (0 /5 * – every 5 minutes). The function uses a Managed Identity to avoid credential storage.
4.5 Conditional‑Access Policy Design
A JSON representation for Azure AD Conditional Access that blocks Graph API calls from unmanaged devices unless the request originates from a known service principal:
✔️clientAppTypes = Other captures API‑only traffic (no interactive UI).
✔️deviceStates ensures only Azure‑AD‑joined or Intune‑compliant devices can call Graph.
✔️Exclude a service principal (e.g., svccalendarc2_blocker) if you need a legitimate automation pipeline.
After publishing, monitor Sign‑in logs for “Conditional Access: Blocked” events with "Application: Microsoft Graph" – a spike may indicate an attacker attempting to bypass the rule.
Prohibits any voluntary ransom payment by entities > €10 M revenue
Up to €250 k or 5 % of annual turnover
2026‑09‑01
Canada (Bill C‑27)
Extends existing anti‑money‑laundering rules to cover ransomware payments
CAD $200 k per violation
2026‑12‑01
California, USA (SB 1455)
Criminalizes paying ransomware if the victim is a critical infrastructure provider
$100 k fine + possible criminal charges
2026‑08‑15
New York (Cybersecurity Regulation)
Requires public disclosure of any ransomware payment > $50 k
Reputational sanction; no monetary fine yet
2026‑07‑01
These laws are cumulative – a multinational corporation could be subject to multiple overlapping penalties. Most insurers now exclude coverage for incidents where a ransom was paid in violation of local law.
5.2 Cost‑Benefit Shift: Legal Risk vs. Downtime
Factor
Pre‑Ban (Traditional)
Post‑Ban (Legal‑Risk‑Adjusted)
--------
----------------------
--------------------------------
Ransom amount
$500 k (average)
$500 k (still)
Estimated downtime cost
$2 M (5 days)
$2 M (5 days)
Legal penalty
$0
$250 k – $1 M (depending on jurisdiction)
Insurance payout
80 % of loss
0 % if payment made (policy exclusion)
Decision threshold
Pay if ransom < downtime cost
Never pay – legal penalty outweighs any benefit
The new decision tree becomes:
Is data encrypted? → Yes
Is a recent, immutable backup available? → Yes → Restore → No payment
Is backup unavailable? → No → Escalate to legal/compliance → If payment is illegal → Seek law‑enforcement assistance → Do NOT pay.
5.3 Building a “Pay‑Never” Architecture
Pillar
Recommended Technology
Implementation Tips
--------
------------------------
---------------------
Immutable Backups
Azure Blob Storage with immutable legal hold (WORM) + Azure Backup for VMs
Enable time‑based retention of 30 days + infinite lock for critical datasets.
Air‑Gapped Snapshots
Offline tape library or AWS Glacier Deep Archive for quarterly full‑system snapshots
Rotate tapes monthly; store at an off‑site secure facility.
Policy Update – Notify your cyber‑insurance carrier that you have adopted a no‑payment stance. Request a “Cyber‑Resilience” endorsement that covers business interruption but excludes ransom payout.
Compliance Checklist – Attach to the insurance certificate:
✔️Immutable backup verified quarterly.
✔️MFA enforced on all privileged accounts.
✔️Calendar‑event hygiene policy in place.
✔️Incident‑response playbook includes legal‑review step before any external payment.
Automation – Use ServiceNow to create a “Ransomware Incident” record that automatically triggers:
✔️Backup verification (run a restore test).
✔️Legal approval request (auto‑assign to CLO).
✔️Notification to senior leadership and external legal counsel.
If the legal gate denies payment, the workflow proceeds to law‑enforcement notification (e.g., FBI Internet Crime Complaint Center) and public‑relations steps.
6. Putting It All Together – A Layered Defense Blueprint
Below is a high‑level architecture diagram described in text:
User → (MFA‑protected) → AD360 SSO Portal → (Signed Ticket) → AD360 API
Runtime Sensor monitors ticket requests, alerts, and auto‑blocks the source.
Service Account with Calendars.ReadWrite uses Graph API to create events.
Conditional Access restricts Graph API calls to managed devices or approved service principals.
Calendar Hygiene Service (PowerShell/Azure Function) scrubs future‑dated events, quarantining or deleting them.
Immutable Backup System (Azure Blob + WORM, tape, golden images) allows restoration without ransom payment.
Incident Response Workflow (ServiceNow) includes a legal‑review gate and automatically triggers law‑enforcement notification if payment is denied.
✔️Patch every ManageEngine AD360 component to 7.2.2+; verify via /api/v1/version.
✔️Enforce MFA (TOTP or FIDO2) on all SSO ticket requests, including service accounts.
✔️Create a least‑privilege TicketIssuer service account and lock it to internal IP ranges.
✔️Deploy a real‑time sensor (Go or equivalent) to flag > 100 ticket requests/min per IP and auto‑block.
✔️Flag any Microsoft 365 calendar event with a start date > 2030; quarantine or delete automatically.
✔️Implement Azure AD Conditional Access that blocks Graph API calls from unmanaged devices unless from a known service principal.
✔️Run nightly PowerShell or Azure Function scripts to purge suspicious events.
✔️Adopt a “pay‑never” ransomware posture: immutable WORM backups, air‑gapped snapshots, golden images, quarterly restore drills.
✔️Integrate a legal‑review step into your incident‑response workflow; align insurance policies with the no‑payment stance.
✔️Continuously audit MFA enrollment, ticket‑generation logs, and calendar‑event hygiene to maintain compliance.
8. Conclusion – From Reactive Patching to Proactive Trust‑Boundary Hardening
The convergence of a predictable SSO ticket flaw, a future‑dated calendar C2 channel, and global ransomware‑payment bans demonstrates how trust assumptions can be weaponized across disparate platforms. By patching the deterministic ticket generator, adding MFA, and signing tickets you restore cryptographic confidence to the AD360 identity layer. By monitoring and sanitizing calendar events that lie beyond a realistic planning horizon you close the covert “drop‑box” that HOLLOWGRAPH exploits. Finally, by re‑architecting backups and embedding legal controls into your incident‑response playbook you make the payment option non‑existent, aligning your security posture with emerging legislation.
This layered approach—prevent, detect, respond—provides robust defense-in-depth. Adopt it now, test it in a sandbox, and roll it out incrementally. The cost of implementation is far lower than the combined financial, legal, and reputational fallout of a successful AD360‑plus‑Calendar breach followed by a ransomware extortion you cannot legally pay.
What version of ManageEngine AD360 fixes CVE‑2026‑11374?+
Version 7.2.2, released on 2026‑07‑04, replaces the deterministic ticket generator with a cryptographically secure random nonce.
How can I detect HOLLOWGRAPH calendar events?+
Flag any event with a start date beyond 2030, inspect for Base64 bodies larger than 1 KB, and monitor Graph API queries that request events >10 years in the future.
Why should organizations enforce MFA on SSO ticket issuance?+
MFA adds a non‑predictable factor that defeats brute‑force attacks on the previously deterministic ticket space, effectively restoring zero‑trust assumptions.
What legal risk does paying ransomware demand now?+
Proposed bans impose fines up to €250 k for paying, making ransom payments a regulatory violation in many jurisdictions.
What is the recommended backup strategy to avoid paying ransomware?+
Implement immutable, air‑gapped snapshots, test restores quarterly, and maintain a golden image of critical workloads to ensure rapid recovery without paying.
The week's best on engineering, AI, and security — one email, no noise.
Read next
Same categorysecurity·August 26, 2026
Hardware and AI services are silently profiling users
TL;DR: Modern consumer hardware and AI assistants embed persistent data collection that developers must curb now, or face regulatory and security fallout. In 20