1. Executive summary
Kaspersky has published analysis of a new .NET Native AOT communication module (AzureCommunication.dll) within the Project CAV3RN cyberespionage framework, targeting entities in Israel. The module replaces prior HTTP/WebSocket C2 channels with Microsoft Graph API calls that exchange commands and results through Outlook calendar events scheduled in 2050, rendering them invisible in standard calendar views. If Microsoft Graph authentication fails, the module falls back to a novel DNS AAAA-record protocol to retrieve replacement Entra ID credentials from actor-controlled nameservers. Attribution to OilRig (APT34) remains unconfirmed — the actor "Project CAV3RN" has no MITRE ATT&CK profile, and Kaspersky assesses the OilRig link at low confidence with no direct code reuse or infrastructure overlap. EMEA financial services with Israeli operations or Microsoft 365 tenants should audit Graph API activity and DNS egress for the described indicators.
2. Regulatory framing
| Article | Trigger (the fact in this item) | Practical impact |
|---|---|---|
| DORA Art. 17: ICT-related incident management process | The module compromises a Microsoft 365 mailbox belonging to an Israeli law firm and abuses it as a C2 dead-drop, meaning a third-party cloud service is actively weaponised within the incident lifecycle. | Financial entities must ensure their ICT incident management process accounts for cloud-service abuse as an incident vector and can detect/respond to malicious Graph API use within their own tenants. |
| DORA Art. 28: ICT third-party risk — general principles | The C2 channel operates entirely through Microsoft Graph / Microsoft 365, a critical ICT third-party service provider, using legitimate API endpoints and OAuth tokens to evade network controls. | Entities must review whether their ICT third-party risk controls extend to monitoring for abuse of legitimate cloud API channels, not just outages or provider-side breaches. |
3. Technical analysis & attack chain
Attribution caveat: Actor "Project CAV3RN" has no MITRE ATT&CK profile; attribution is unconfirmed. Kaspersky assesses a low-confidence link to OilRig/APT34 based on behavioural parallels (Microsoft-hosted C2, attachment-based command exchange, secondary recovery mechanisms, use of compromised regional infrastructure) but identified no direct code reuse or infrastructure overlap. The following analysis is single-sourced to Kaspersky's reporting; verify before enforcement.
Attack chain (confirmed steps from source)
- Controller loading: An updated controller (not yet recovered) loads
AzureCommunication.dll, resolves its single exportQueryInterface, and passes a null-terminated UTF-16 string in the formatget_;;_<agent-id>,_<legacy-url>orsend_;;_<agent-id>,_<legacy-url>,_<result>. The_;;_delimiter separates operation from arguments;_,separates arguments. The legacy URL is ignored for compatibility. - Configuration initialisation: The module checks for a relative file
logAzure.txtin the host process's current working directory. If present, it deserialises the file. If absent, it builds configuration from hardcoded values and writes them to disk. The configuration contains: Microsoft Entra tenant ID, client ID, client secret, compromised target mailbox (***@*********.co.il), DNS bootstrap domain (cloudlanecdn[.]com), an RSA public key (outbound encryption), and an RSA private key (inbound decryption). - Graph authentication: The module creates a Microsoft Graph client and validates access via
GET https://graph.microsoft.com/v1.0/organization. The Azure Identity library obtains an OAuth application token viaPOST https://login.microsoftonline.com/<TenantId>/oauth2/v2.0/tokenwithclient_id,client_secret,scope=https://graph.microsoft.com/.default,grant_type=client_credentials. The token is included in subsequent requests asAuthorization: Bearer <access-token>. - Command retrieval (
get): The module queries the default calendar of the compromised mailbox for events in a fixed one-hour window:2050-05-13T22:00:00to2050-05-13T23:00:00UTC. It filters by subject usingGET /v1.0/users/<mailbox>/calendarView?startDateTime=2050-05-13T22:00:00&endDateTime=2050-05-13T23:00:00&$filter=contains(subject,'Event ID: <agent-id>'). The 2050 date ensures events do not appear in ordinary calendar views. - Attachment download and event deletion: If a matching event is found, the module downloads attachments via
GET /v1.0/users/<mailbox>/events/<EventId>/attachments, then deletes the event viaDELETE /v1.0/users/<mailbox>/calendar/events/<EventId>. Inbound command attachments are namedfile0.txt(lowercase 'f'). - Command decryption: Inbound commands use hybrid RSA + AES-256-GCM encryption. The reconstructed buffer begins with a 256-byte RSA-encrypted block containing the 32-byte AES key, decrypted using RSA-OAEP with SHA-256 and the configured private key. The next 12 bytes are the AES-GCM nonce; the final 16 bytes are the authentication tag; the intervening bytes are ciphertext. A decrypted 63-byte example produces:
{"cid": "alXBCzcDl8hBuNE", "type": "self", "cmd": "003_;;__,_"}. Thecidfield is a command-correlation identifier. Whentypeisself, the controller routes to its internal handler;cmd003toggles debug logging. - Result exfiltration (
send): The module encrypts command output with a freshly generated AES-256-GCM key, protects that key with the configured RSA public key, and divides the payload into chunks of up to 10 MiB. It creates a calendar event with temporary subjectd, uploads chunks as sequentially named attachments (File0.txt,File1.txt— uppercase 'F'), then changes the subject toBoss Report ID: <agent-id>1500. The sequence is:POST /v1.0/users/<mailbox>/calendar/events,POST /v1.0/users/<mailbox>/calendar/events/<EventId>/attachments,PATCH /v1.0/users/<mailbox>/events/<EventId>. - Heartbeat maintenance: The module searches the fixed calendar window for a previous event with subject
Boss update ID: <agent-id>1500. If found, it deletes it and creates a replacement with temporary subjectd, then patches the subject toBoss update ID: <agent-id>1500. Heartbeat events contain no attachments. The suffix1500is fixed and not part of the Agent ID. - DNS AAAA fallback (if Graph auth fails): When OAuth token acquisition or the
/organizationvalidation request fails, the module queriescloudlanecdn[.]com(delegated tons1–ns4.cloudlanecdn[.]com) for replacementTenantId,ClientId,ClientSecret, andUserEmail. The seven-character Agent ID is converted to uppercase hexadecimal (e.g.,SFmLgQZ→53466D4C67515A). For each field, a length query is sent:d.<hex-agent-id>.<field-index>.p.cloudlanecdn[.]com(indices: 0=TenantId, 1=ClientId, 2=ClientSecret, 3=UserEmail). The AAAA response's first two bytes are discarded; the next two bytes are interpreted as a big-endian field length. Data queries follow:d.<hex-agent-id>.<field-index>.<offset>.q.cloudlanecdn[.]com. Each.q.response provides up to 14 bytes (first two bytes discarded). The sentinel address2001:4998:44:3507::8000(Yahoo's allocation) signals failure; the module raises an exception and does not process the response. Recovered values are decoded as UTF-8, written tologAzure.txt, and a new Graph client is created.
Subject format summary
| Subject format | Purpose | Behaviour |
|---|---|---|
Event ID: <agent-id> |
Operator-to-agent command | Downloads attachments, deletes event after consumption |
Boss update ID: <agent-id>1500 |
Agent heartbeat | Deletes previous heartbeat, creates replacement |
Boss Report ID: <agent-id>1500 |
Agent-to-operator output | Creates event, uploads encrypted attachments, assigns final subject |
4. Mitigation & containment
P1 — within 24 hours
- Block DNS infrastructure: Block queries to
cloudlanecdn[.]comand all four nameserver hostnames (ns1[.]cloudlanecdn[.]comthroughns4[.]cloudlanecdn[.]com) at recursive resolvers. Block IPs216[.]126[.]237[.]197and144[.]172[.]108[.]205(AS14956, RouterHosting LLC). - Hunt for module files: Search endpoints for
AzureCommunication.dll,NewProject.dll,uxtheme.dll(in non-standard locations),n-HTCommp.dll, andlogAzure.txt. Hashes to match: CAF021DDA726B8BA049C2AA395E505A1(AzureCommunication.dll)29B2B8C5D99F05BFCDD0D8D976EB5678(AzureCommunication.dll, second sample)C092B02FBC0FDF7EE9608DD016673806(NewProject.dll)- Graph API audit: Query Microsoft 365 audit logs for application-level access to
/v1.0/users/<mailbox>/calendarViewand/v1.0/users/<mailbox>/calendar/eventswithclient_credentialsgrant type. Look for calendar events with subjects matchingEvent ID:,Boss update ID:, orBoss Report ID:and events scheduled in 2050. - Block related domains:
clipeditskill[.]com,accesslinkssl[.]com,google.com[.]ayalon-print.co[.]il.
P2 — within 72 hours
- Entra ID application review: Audit all registered applications in Entra ID for those with
Mail.ReadWrite,Calendars.ReadWrite, orFiles.ReadWrite.Allapplication permissions using client_credentials flow. Disable and investigate any unrecognised applications. - Conditional access hardening: Restrict Graph API access from unmanaged or non-compliant devices. Implement location-based conditional access policies for application-level Graph API calls where feasible.
- DNS egress monitoring: Deploy DNS query logging for AAAA requests matching the pattern
d.*.[0-3].*.cloudlanecdn[.]comor similar subdomain patterns with hex-encoded agent IDs. Monitor for AAAA responses where the first hextet is2001and the response is not a legitimate IPv6 address. - EDR rules: Create detection rules for processes loading DLLs via
QueryInterfaceexport with command strings containing_;;_delimiters.
P3 — within 7 days
- Calendar event hunting: Run Microsoft Graph queries across all mailboxes for calendar events with start dates in 2050, particularly within the 22:00–23:00 UTC window. Export and review subjects matching the known patterns.
- Review OAuth application governance: Implement a periodic review process for all Entra ID applications with mail/calendar application permissions. Remove unused or unrecognised app registrations.
- Threat hunt for
logAzure.txt: Search file shares, endpoint workstations, and servers forlogAzure.txtfiles containing JSON withTenantId,ClientId,ClientSecret,UserEmail,Host,PublicKey, andPrivateKeyfields.
5. Indicators of compromise
| Type | Value | Confidence | Source |
|---|---|---|---|
| md5 | CAF021DDA726B8BA049C2AA395E505A1 | High | Kaspersky |
| md5 | C092B02FBC0FDF7EE9608DD016673806 | High | Kaspersky |
| md5 | 29B2B8C5D99F05BFCDD0D8D976EB5678 | High | Kaspersky |
| domain | cloudlanecdn[.]com | High | Kaspersky |
| domain | ns1[.]cloudlanecdn[.]com | High | Kaspersky |
| domain | ns2[.]cloudlanecdn[.]com | High | Kaspersky |
| domain | ns3[.]cloudlanecdn[.]com | High | Kaspersky |
| domain | ns4[.]cloudlanecdn[.]com | High | Kaspersky |
| domain | google.com[.]ayalon-print.co[.]il | Medium | Kaspersky |
| domain | clipeditskill[.]com | Medium | Kaspersky |
| domain | accesslinkssl[.]com | Medium | Kaspersky |
| ipv4 | 216[.]126[.]237[.]197 | High | Kaspersky |
| ipv4 | 144[.]172[.]108[.]205 | High | Kaspersky |
| filename | AzureCommunication.dll | High | Kaspersky |
| filename | NewProject.dll | High | Kaspersky |
| filename | logAzure.txt | High | Kaspersky |
| filename | uxtheme.dll | High | Kaspersky |
| filename | n-HTCommp.dll | High | Kaspersky |
md5 CAF021DDA726B8BA049C2AA395E505A1
md5 C092B02FBC0FDF7EE9608DD016673806
md5 29B2B8C5D99F05BFCDD0D8D976EB5678
domain cloudlanecdn[.]com
domain ns1[.]cloudlanecdn[.]com
domain ns2[.]cloudlanecdn[.]com
domain ns3[.]cloudlanecdn[.]com
domain ns4[.]cloudlanecdn[.]com
domain google.com[.]ayalon-print.co[.]il
domain clipeditskill[.]com
domain accesslinkssl[.]com
ipv4 216[.]126[.]237[.]197
ipv4 144[.]172[.]108[.]205
filename AzureCommunication.dll
filename NewProject.dll
filename logAzure.txt
filename uxtheme.dll
filename n-HTCommp.dll
Behavioural indicators
| Behaviour | Where to observe | Confidence |
|---|---|---|
OAuth client_credentials flow to login.microsoftonline.com followed by Graph API GET /v1.0/organization |
Entra ID sign-in logs; proxy/IDS | High |
Graph API calendarView queries with startDateTime=2050-05-13T22:00:00 and endDateTime=2050-05-13T23:00:00 |
Microsoft 365 audit logs; Graph API logs | High |
Calendar events created with subjects containing Event ID:, Boss update ID:, or Boss Report ID: |
Microsoft 365 audit logs; mailbox audit logging | High |
Calendar events with temporary subject d subsequently patched to Boss update ID: or Boss Report ID: |
Microsoft 365 audit logs | High |
DNS AAAA queries matching pattern d.<hex-string>.<0-3>.p.<domain> or d.<hex-string>.<0-3>.<number>.q.<domain> |
DNS resolver logs; network monitoring | High |
Calendar event attachments named file0.txt (inbound) or File0.txt (outbound) |
Microsoft 365 audit logs | Medium |
File logAzure.txt written to working directory containing JSON with TenantId, ClientId, ClientSecret, UserEmail, Host, PublicKey, PrivateKey fields |
EDR file creation monitoring; file integrity monitoring | High |
6. Detection
rule CAV3RN_AzureCommunication_Module {
meta:
author = "Adverse Trace"
date = "2026-07-21"
reference = "https://securelist.com/project-cav3rn-cyberespionage-framework-using-outlook-and-dns/120757/"
description = "Detects CAV3RN AzureCommunication.dll communication module"
strings:
$export = "QueryInterface" ascii
$dll_name = "AzureCommunication.dll" ascii
$log_file = "logAzure.txt" ascii
$tenant = "TenantId" ascii
$client_id = "ClientId" ascii
$client_secret = "ClientSecret" ascii
$user_email = "UserEmail" ascii
$graph_org = "graph.microsoft.com/v1.0/organization" ascii
$oauth = "oauth2/v2.0/token" ascii
$grant = "client_credentials" ascii
$calendar = "calendarView" ascii
$event_subject = "Event ID:" ascii
$heartbeat = "Boss update ID:" ascii
$report = "Boss Report ID:" ascii
$temp_subj = "Boss Report ID: " ascii
$delimiter = "_;;_" ascii
$file0 = "file0.txt" ascii
$File0 = "File0.txt" ascii
$sentinel = "2001:4998:44:3507::8000" ascii
$recovery_p = ".p." ascii
$recovery_q = ".q." ascii
$attach_path = "/attachments" ascii
$events_path = "/events" ascii
$calendar_events = "/calendar/events" ascii
condition:
$export and ($dll_name or $log_file) and 4 of ($tenant, $client_id, $client_secret, $user_email) and 2 of ($graph_org, $oauth, $grant, $calendar) and 2 of ($event_subject, $heartbeat, $report, $temp_subj) and $delimiter
}
rule CAV3RN_LogAzure_Config {
meta:
author = "Adverse Trace"
date = "2026-07-21"
reference = "https://securelist.com/project-cav3rn-cyberespionage-framework-using-outlook-and-dns/120757/"
description = "Detects CAV3RN logAzure.txt configuration file"
strings:
$tenant = "TenantId" ascii
$client_id = "ClientId" ascii
$client_secret = "ClientSecret" ascii
$user_email = "UserEmail" ascii
$host = "Host" ascii
$pubkey = "PublicKey" ascii
$privkey = "PrivateKey" ascii
$rsa_pub = "BEGIN RSA PUBLIC KEY" ascii
$rsa_priv = "BEGIN RSA PRIVATE KEY" ascii
condition:
4 of ($tenant, $client_id, $client_secret, $user_email, $host) and 2 of ($pubkey, $privkey, $rsa_pub, $rsa_priv)
}
title: CAV3RN Outlook Calendar C2 via Microsoft Graph API
id: 7a3c1f2e-4b5d-4a8e-9c1f-2d3e4f5a6b7c
status: experimental
description: Detects CAV3RN communication module using Microsoft Graph to access Outlook calendar events for C2, identified by calendar queries targeting 2050 dates and known subject patterns.
author: Adverse Trace
date: 2026/07/21
references:
- https://securelist.com/project-cav3rn-cyberespionage-framework-using-outlook-and-dns/120757/
logsource:
product: microsoft365
service: audit
detection:
selection_calendar_query:
eventSource: "MicrosoftGraph"
operationName|contains:
- "calendarView"
startDateTime|contains:
- "2050-05-13T22:00:00"
selection_event_subject:
eventSource: "MicrosoftGraph"
operationName|contains:
- "calendar"
Subject|contains:
- "Event ID:"
- "Boss update ID:"
- "Boss Report ID:"
selection_temp_subject:
eventSource: "MicrosoftGraph"
Subject: "d"
operationName|contains:
- "PATCH"
condition: selection_calendar_query or selection_event_subject or selection_temp_subject
falsepositives:
- Legitimate calendar events scheduled far in the future (unlikely with these subject patterns)
level: high
title: CAV3RN DNS AAAA Configuration Recovery Queries
id: 8b4d2g3f-5c6e-4b9f-0d2g-3e4f5a6b7c8d
status: experimental
description: Detects CAV3RN DNS AAAA queries used for configuration recovery, matching the d.<hex>.<index>.p|q.<host> pattern.
author: Adverse Trace
date: 2026/07/21
references:
- https://securelist.com/project-cav3rn-cyberespionage-framework-using-outlook-and-dns/120757/
logsource:
product: dns
detection:
selection_recovery:
query_type: "AAAA"
query|re: "d\.[0-9A-Fa-f]+\.[0-3]\.(p|q)\.cloudlanecdn\.com"
condition: selection_recovery
falsepositives:
- Unlikely; the query structure is highly specific to the CAV3RN recovery protocol
level: high
title: CAV3RN logAzure.txt Configuration File Creation
id: 9c5e3h4g-6d7f-4c0f-1e3h-4f5a6b7c8d9e
status: experimental
description: Detects creation of logAzure.txt, the CAV3RN communication module's configuration persistence file.
author: Adverse Trace
date: 2026/07/21
references:
- https://securelist.com/project-cav3rn-cyberespionage-framework-using-outlook-and-dns/120757/
logsource:
product: windows
category: file_event
detection:
selection_file:
TargetFilename|endswith: "logAzure.txt"
condition: selection_file
falsepositives:
- Unlikely; filename is specific to CAV3RN module
level: high
7. Sources
- Kaspersky Securelist, "New Project CAV3RN module abuses Outlook calendar events for C2 and DNS AAAA records for configuration recovery," https://securelist.com/project-cav3rn-cyberespionage-framework-using-outlook-and-dns/120757/, published 2026-07-21.
8. Adverse Trace position
This advisory describes a sophisticated, actively developed C2 transport that abuses legitimate Microsoft Graph API endpoints and Outlook calendar events to evade network-based detection — a technique pattern that directly challenges financial services' reliance on perimeter egress controls. The DNS AAAA fallback protocol is novel and specifically designed to recover Entra ID credentials when primary authentication fails, making blocking of cloudlanecdn[.]com and its nameserver IPs a priority. Attribution to OilRig/APT34 remains unconfirmed (low confidence, single-sourced, no MITRE profile for "Project CAV3RN," no code reuse or infrastructure overlap); we treat the actor as unconfirmed and recommend clients do the same. The targeting scope (Israel) means EMEA financial services with Israeli operations, joint ventures, or shared Microsoft 365 tenants are at elevated risk. We will continue tracking CAV3RN development cycles and update clients if the unrecovered updated controller or additional plugins are identified. This advisory is single-sourced to Kaspersky's reporting; clients should verify indicators before enforcement actions.
Published via PulseTrace — Adverse Trace threat intelligence.