Home Framework Threat Intel APT Encyclopedia Blog
Back to Blog
Threat Research Nov 12, 2026 • By Raúl.R • 12 min read

Inside Cereal: Turla Reads Government Emails from the Exchange Server Itself

ESET disclosed Cereal on 10 November 2026: eight components that turn a Microsoft Exchange server into a silent email collection platform with no external C2. Two government victims confirmed so far : one had NATO and EU mail filtered out.

Turla Exchange Email Collection Russia / FSB .NET

Who and where

Turla (also tracked as Snake, Secret Blizzard and Waterbug) has been tied to Russia’s FSB since at least 2004. The group’s previous tooling for Exchange, LightNeuron, was documented by ESET in 2019. Cereal is the successor.

ESET attributes Cereal to Turla with high confidence, based on concurrent use of another component publicly linked to the group and conceptual similarities to LightNeuron. The researcher behind the analysis is Matías Porolli.

Two government victims are confirmed:

ESET’s report does not cover how the attackers reached these Exchange servers. No specific Exchange vulnerability is implicated.

Eight components, one Exchange server

Eight named components, each doing one job. The name comes from the heavy use of .NET serialization across the toolkit.

Component Role
CerealLoader Loads a .NET assembly from an encrypted file on disk. The only component stored as a recognisable .NET binary. Placed as ncobjapi.dll or wbemcomn.dll in C:\Windows\System32\wbem\, or in the .NET native image cache disguised as an Exchange library.
CerealRunner Carries encrypted .NET programs plus arguments, runs them in memory, and returns output through CerealNeuron.
CerealSprinter An orchestrator variant that only loads and runs other Cereal components.
CerealNeuron Passive backdoor. No built-in commands, no beaconing. Listens for HTTPS requests on Exchange-like paths, decrypts them, and runs CerealRunner assemblies in response.
CerealHermit A CerealNeuron variant with no network capability. Reads encrypted command files from disk, writes encrypted results back. A fallback channel when network access is restricted.
CerealIron Injector that enables .NET assembly execution inside non-.NET host processes.
CerealBox The email collection module. Injected into EdgeTransport.exe, wraps existing transport agent handlers to silently copy matching mail.
CerealMoth Takes an assembly and a method name, loads the assembly, and runs that specific method.

Near-identical command binaries across the two known deployments suggest Turla uses an internal automated build and packaging framework.

COMPROMISED EXCHANGE SERVER CerealLoader DLL hijack / NI cache Loads .NET assemblies from encrypted files. Persists as ncobjapi.dll or wbemcomn.dll in System32\wbem\, or in the .NET native image cache. CerealSprinter orchestrator Only loads and runs other Cereal components. Does not execute commands itself. CerealRunner assembly executor Carries encrypted .NET programs, runs them in memory, and returns output through CerealNeuron. CerealMoth Loads an assembly and runs a specific method by name. CerealNeuron HTTPS listener · port 443 Passive backdoor. No beaconing. Listens on /owa/sdds/, /AUTODISCOVER/PROXYSERVICE/, and /MICROSOFT-SERVER-ACTIVESYNC/INTEGRATED/API/. CerealHermit disk-only fallback No network capability. Reads encrypted commands from disk and writes results back. Used when firewalling blocks the HTTPS listener. CerealBox email collector EDGETRANSPORT.EXE Wraps existing transport agent handlers inside EdgeTransport.exe. Silently copies emails matching sender/recipient/attachment filters. Nothing appears in Get-TransportAgent. CerealIron .NET injector Enables .NET assembly execution inside non-.NET host processes. dispatches assemblies
Component map. CerealLoader bootstraps the chain from a hijacked DLL or native image cache entry. CerealSprinter orchestrates the operational modules. CerealNeuron receives operator commands over HTTPS and dispatches CerealRunner assemblies. CerealBox lives inside EdgeTransport.exe, silently intercepting matching emails. CerealHermit is a disk-only fallback for environments where the HTTPS listener is blocked.

CerealBox: invisible email interception

Exchange transport agents are .NET classes that plug into the mail transport pipeline. They see every message as it passes through. LightNeuron, the predecessor, registered a new transport agent to intercept mail. That agent showed up in Exchange’s configuration, and that is where defenders found it.

CerealBox does not register anything.

Instead, it locates the transport agents already loaded in memory, finds their event handlers, and wraps them. When a message arrives, CerealBox’s logic runs first. If the message matches the collection criteria, it is copied. Then control passes to the original handler, and mail flow continues normally. No new agent appears in Get-TransportAgent. Exchange configuration is unchanged.

ESET says this handler-wrapping technique has not been previously documented in any malware family targeting Exchange.

LIGHTNEURON (2019) Exchange transport pipeline The standard mail processing pipeline inside Exchange. Transport agents hook into it to inspect, modify or route messages. Original agent + New agent LightNeuron registered a new transport agent. It appeared in Exchange configuration and was discoverable via Get-TransportAgent. Get-TransportAgent → visible Running Get-TransportAgent on the Exchange server reveals the malicious agent in the list. This is how defenders detected LightNeuron. DETECTABLE CEREALBOX (2025) Exchange transport pipeline Same pipeline, but CerealBox does not add a new agent. It wraps the existing handler's delegate in memory instead. CerealBox wrapper Original handler CerealBox locates the already-loaded transport agent handlers in memory and wraps their event delegates. Mail hits CerealBox first, then the original handler. No registration needed. Get-TransportAgent → clean The output of Get-TransportAgent is identical to a clean server. No new agent, no configuration change. Invisible to standard Exchange audits. INVISIBLE
Registration vs wrapping. LightNeuron added a new transport agent, which appeared in Exchange’s configuration. Defenders found it by querying Get-TransportAgent. CerealBox wraps the existing handler’s delegate in memory. No new agent is registered, and the configuration output is indistinguishable from a clean server.

Filtering criteria

A message is collected when it meets all three conditions:

  1. Attachment type. The message carries a .doc, .docx or .pdf attachment.
  2. Address or keyword match. At least one field (sender address, recipient address, subject line substring, or attachment filename) appears on a hardcoded inclusion list.
  3. Not on the ignore list. The message is not excluded by a separate ignore list.

Collected messages are compressed, encrypted, and staged as files on disk. The operators exfiltrate them through CerealNeuron commands, then delete the staging files.

In the Romanian government deployment, the inclusion list targeted NATO and EU institutional addresses.

The server is the C2

No external command-and-control infrastructure. The compromised Exchange server is the C2.

CerealNeuron listens passively on port 443, accepting HTTPS requests at three paths designed to blend with legitimate Exchange traffic:

Incoming requests must pass encryption and integrity checks. Anything that fails is redirected to a legitimate Exchange error page, so a scanner just sees a normal web server.

ESET could not identify the operators’ IP addresses. They likely route through anonymisation services or other compromised hosts. No domains, IPs or hosting patterns to blocklist.

TURLA Operator Turla operator. ESET could not identify the source IPs. They likely route through anonymisation services or other compromised hosts. VPN / proxy Anonymisation layer. No domains or IPs to blocklist. The operator likely chains VPNs, proxies, or other compromised hosts. HTTPS EXCHANGE SERVER (C2) /owa/sdds/ /AUTODISCOVER/PROXYSERVICE/ /…ACTIVESYNC/INTEGRATED/API/ Three HTTPS paths designed to blend with legitimate Exchange traffic. Requests that fail encryption/integrity checks are redirected to a real Exchange error page. CerealNeuron Passive backdoor. Listens on port 443, decrypts incoming requests, runs CerealRunner assemblies, and returns output. No beaconing. CerealBox Email collector. Wraps transport agent handlers. Copies messages matching sender/recipient/attachment criteria. Collected mail is exfiltrated through CerealNeuron. emails EXT C2 none No external C2 infrastructure exists. No domains, IPs, or hosting patterns to blocklist. The Exchange server IS the C2.
No infrastructure to burn. The compromised Exchange server is both the collection point and the C2 channel. CerealNeuron listens passively on port 443 at three Exchange-like paths. There are no external domains, IPs or hosting patterns to blocklist. The operator communicates with a server the victim already trusts.

.NET tricks: VTable Fixups and native image cache

CerealLoader uses two techniques to get code running early.

VTable Fixups

The .NET spec defines VTable Fixups for exposing managed methods to native callers through COM interop. Almost nobody uses it. Cereal does.

CerealLoader declares VTable Fixup entries that bridge from native code into a .NET method before the CLR’s normal entry point runs. When a process loads the DLL, the native stub fires first. A decompiler looking at the .NET entry point sees nothing interesting. Breakpoints on the malicious managed method never trigger through normal debugging workflows because the call path skips the standard entry sequence.

DLL search order hijacking

CerealLoader places itself as ncobjapi.dll or wbemcomn.dll in C:\Windows\System32\wbem\. The WMI service loads these automatically at boot. The malicious DLLs forward all legitimate function calls to the real libraries, so the host process keeps working. The attacker’s code has already executed by the time the service finishes initialising.

Native image cache abuse

In a second persistence path, Cereal places a malicious file in the .NET native image cache under a name like Microsoft.Exchange.Search.Mdb.ni.dll. When an Exchange process requests that library, the runtime loads the attacker’s version. The file contains no replacement code for the library itself, so .NET falls back to the genuine DLL. But the native entry point embedded in the cached file has already run.

In one sample, the code checked whether the parent process was Exchange’s search service before activating. If not, it did nothing.

What operators can do once inside

CerealRunner assemblies go well beyond email collection:

CerealHermit covers the case where network-level access to the backdoor is blocked. Operators drop encrypted command files, CerealHermit reads and executes them, writes encrypted results to a different file on disk. Slower, but it works behind a firewall that kills the HTTPS listener.

From LightNeuron to Cereal

ESET documented LightNeuron in 2019. Comparing the two toolsets shows where Turla adapted after defenders caught on.

Aspect LightNeuron (2019) Cereal (2025–2026)
Transport agent Registers a new agent — visible in Exchange config Wraps existing agent handlers — nothing in config
C2 Steganography in PDF/JPG email attachments No external C2; Exchange’s own HTTPS listener
Persistence Transport agent registration DLL hijacking + native image cache
Email filtering XML rules per victim Hardcoded sender/recipient/subject/attachment lists
Detection surface Agent visible in Exchange config; steganographic traffic Nothing in Exchange config; no external indicators
.NET execution Standard .NET loading VTable Fixups, unmanaged entry points, NI cache abuse

The transport agent registration was what gave LightNeuron away. Cereal wraps instead of registering. The steganographic C2 traffic was analysable, so Cereal eliminated external C2 entirely. And where LightNeuron loaded .NET the standard way, Cereal buries execution behind VTable Fixups and native image cache entries.

Detection and hunting

ESET’s IoCs (18 SHA-1 hashes) are on GitHub. A technical white paper is available at ESET’s white paper repository.

For organisations running on-premises Exchange:

That last point matters. If your Exchange monitoring relies on checking transport agent registrations, Cereal walks past it.

Indicators of compromise

All file-based. ESET published no network indicators for Cereal (no domains, IPs, or C2 URLs).

CerealLoader (MSIL/Agent.YCC)

SHA-1Filename
4A3C263977417FB6977B0E598C9E3BC5924F390CMicrosoft.Exchange.Data.Transport.ni.dll
7742C6B0AAF114335CEF7EBAB11290CB18A0B8B3version.dll
AFE448DD95494CD14438F04F0C5F6B384664A3B7version.dll
5D80118B1EE974936322475F740AB3AEFF70B8F3EdgeTransport.ni.exe
1408A8F62B09A5AD0DFF279B2878D8F59F70A330Microsoft.Exchange.Search.Mdb.ni.dll
3D1A534CE0D0C293F62ECE556CBC6D0728213104Microsoft.Exchange.EdgeSyncSvc.ni.exe

CerealLoader (MSIL/Agent.YCA)

SHA-1Filename
4A65040646E354303F067D47AA1C953D467F65CBMicrosoft.Search.Platform.dll
D1E17520A2435EDCDCC47F582381416FBDF75F94Microsoft.Ceres.dll
7AB784D0049890D9844AEE7F214BA173E3CC23BEwbemcomn.dll
D51C58C2E95D4561848E0A5A8B9FB33C847C50A4iph.dat
5B94FE76EC4FEB0B5CB6EA3BCA4C48D2FE22597Bncobjapi.dll

Cereal components (MSIL/Agent.YBZ)

SHA-1Component
AD85FBF2CC879D4325BCE1E6FB5F12AB59E3D387CerealRunner
3EA03188DBA8898D97E965732C1D6A68C5437EDCCerealSprinter
3FBA18AF966DEACF7AE09E4D4238952DD90A6D6FCerealHermit
EB9BA1DA5363F5D04E2F98673595FCE93F39A78ECerealIron
0B4E4A1CE7FEE91BFC62B2A2EC572C325642BB60CerealMoth

Bootstrapper DLLs (Win32/Agent.AIOQ)

SHA-1Architecture
A4E477CE257F2C635401EF554E05506C080967C0x86
A5BE8706032A0798FD63214A9F22EFA6309355F5x64

Source: ESET malware-ioc repository. No CerealBox or CerealNeuron hashes are published.

Sources