What is MAPS?

Microsoft Active Protection Service — Windows Defender's Cloud Brain

Purpose
MAPS is the cloud-based reputation and dynamic signature delivery system behind Windows Defender. Every time Defender scans a file, it can query MAPS to get a real-time verdict from Microsoft's cloud, including dynamic "FASTPATH" signatures that bypass local signature updates.
Key Capabilities
  • File reputation (hash-based cloud lookup)
  • URL/domain reputation checking
  • Dynamic signature delivery (FASTPATH)
  • Block at First Sight (zero-day protection)
  • Sample upload for cloud detonation
  • Heartbeat/telemetry collection
  • AMSI script content analysis

How Defender Uses MAPS

Local Scan
Defender scans file locally
Low-Fi Detection
Local heuristic trigger (suspicious but not confirmed)
MAPS Query
Send file hashes + metadata to cloud
Clean
88 bytes response
No signatures
Malicious
~488 bytes response
FASTPATH + threat name
Unknown
SampleRequest
Upload file for detonation

MAPS in Windows Defender

How MAPS integrates with Microsoft Defender Antivirus — the cloud brain behind endpoint protection

What is MAPS in the Defender Pipeline?

MAPS (Microsoft Advanced Protection Service, formerly "SpyNet") is the cloud protection backend for Microsoft Defender Antivirus. It's not a separate product — it's the cloud component that every Defender installation communicates with to deliver real-time verdicts on suspicious files, URLs, and behaviors. When cloud protection is enabled (the default), Defender queries MAPS before allowing unknown executables to run.

Why MAPS Exists
Local signature databases can't keep up with the volume of new malware (400K+ new samples/day). MAPS allows Microsoft to:
• Deliver verdicts on never-before-seen files in seconds
• Push dynamic FASTPATH signatures without waiting for definition updates
• Aggregate telemetry from billions of endpoints for ML-based detection
• Trigger cloud detonation (sandbox analysis) for suspicious unknowns
Where MAPS Sits in the Stack
Layer 1: Local signatures (VDM database) — known threats
Layer 2: Local heuristics/ML — suspicious behavior detection
Layer 3: MAPS cloud query — real-time cloud verdict
Layer 4: FASTPATH delivery — dynamic signature push
Layer 5: Cloud detonation — sandbox analysis
Layer 6: Behavior monitoring + AMSI — runtime protection

Defender Features Powered by MAPS

FeatureMAPS RoleUser Impact
Cloud-Delivered ProtectionReal-time file reputation via hash lookupUnknown files blocked/allowed in <1 second
Block at First Sight (BAFS)Synchronous cloud query with execution holdZero-day files blocked before first execution
Emergency Dynamic IntelligenceFASTPATH signature blobs pushed per-clientNew threat protection in minutes vs hours
Automatic Sample SubmissionCloud requests file upload via SAS URIUnknown files sent to Azure sandbox for analysis
SmartScreen URL FilteringURL reputation queries via MAPS protocolPhishing/malware URLs blocked in browser
Network ProtectionNetwork connection telemetry to MAPSC2/malicious IP connections detected
AMSI Cloud AnalysisScript content submitted for cloud verdictObfuscated PowerShell/VBS malware caught
Tamper Protection TelemetryHeartbeat type 10 reports tamperingAlerts on attempts to disable Defender

MAPS Data Flow in Real-Time Protection

User Action
Opens file / visits URL / runs script
Local Scan
Signatures + heuristics + ML model
Low-Confidence?
Suspicious but not confirmed
MAPS Cloud Query
POST Bond payload to wdcp.microsoft.com — SHA256 + metadata + context
Clean (88B)
Allow file to run
Malicious (~488B)
Block + FASTPATH sig
+ quarantine
Need Sample
Upload to Azure
sandbox for analysis

Key stat: With cloud protection enabled (Windows 10 E5), emergency dynamic intelligence updates can deliver fixes for malware within minutes instead of waiting for the next scheduled definition update. Microsoft recommends keeping cloud protection always on.

Architecture Overview

End-to-end system architecture from client to cloud

Windows Client
MpSvc.dll / MpClient.dll
Engine
mpengine.dll
Bond serialization
Communication
MpCommu.dll
HTTPS transport
HTTPS POST
wdcp.microsoft.com/wdcp.svc/bond/submitreport
MAPS Cloud
Reputation DB
Detonation
Azure Sandbox
FASTPATH
Dynamic Signatures

Key DLLs (Reverse-Engineered)

ComponentDLLRole
Enginempengine.dllBond schema definitions (372 fields), payload construction, FASTPATH parsing
CommunicationMpCommu.dllHTTP transport, version header encoding, TLS, endpoint selection
ServiceMpSvc.dllHeartbeat manager (12 subtypes), scan orchestration, scheduling
ClientMpClient.dllWMI/COM interface, configuration, trigger exports

Bond CompactBinaryV1 Wire Format

Microsoft's binary serialization protocol — the wire format of all MAPS traffic

Field Header Encoding

┌─────────┬──────────┐
│ 7  6  5 │ 4 3 2 1 0│    1 byte field header
├─────────┼──────────┤
│  delta  │ bond_type│
└─────────┴──────────┘

delta 1-5:  field_id = previous_id + delta        (inline)
delta 6:    field_id = next_byte                   (uint8 absolute)
delta 7:    field_id = next_two_bytes              (uint16 LE absolute)

19 Bond Data Types

Primitives
BT_BOOL=2 (1 byte)
BT_UINT8=3 (1 byte)
BT_UINT16=4 (varint)
BT_UINT32=5 (varint)
BT_UINT64=6 (varint)
BT_FLOAT=7 (4 bytes LE)
BT_DOUBLE=8 (8 bytes LE)
Signed (ZigZag)
BT_INT8=14 (zigzag byte)
BT_INT16=15 (zigzag varint)
BT_INT32=16 (zigzag varint)
BT_INT64=17 (zigzag varint)

zigzag(n) = (n << 1) ^ (n >> 63)
Maps signed → unsigned
Complex
BT_STRING=9 (varint len + UTF-8)
BT_WSTRING=18 (varint chars + UTF-16LE)
BT_STRUCT=10 (fields...BT_STOP)
BT_LIST=11 (type + count + values)
BT_SET=12 (same as list)
BT_MAP=13 (ktype+vtype+count)
BT_STOP=0 / BT_STOP_BASE=1

Varint Encoding

Value 300 (0x12C):
  Byte 1: 0xAC  = 0b_1_0101100  (continuation + low 7 bits: 44)
  Byte 2: 0x02  = 0b_0_0000010  (final + high bits: 2)
  Result: (2 << 7) | 44 = 256 + 44 = 300 ✓

Bonded<T> Envelope

The outer wrapper that encapsulates all MAPS payloads

Structure

43 42 01 00                    ← CB marshal header ("CB" + version 1)
Outer Struct {
  F5: STRING = schema_name     ← "Microsoft.ProtectionServices.Entities.Raw.SpynetReportEntity"
  BT_STOP_BASE                ← Base class terminator #1
  BT_STOP_BASE                ← Base class terminator #2 (resets field counter)
  F10: LIST<LIST<INT8>> = [[]] ← Runtime type info (empty)
  F20: STRUCT {                  ← Inner payload wrapper
    F5: STRING = schema_name   ← Schema name repeated
    BT_STOP_BASE              ← Base class terminator #1
    BT_STOP_BASE              ← Base class terminator #2
    [SpynetReport fields...]   ← Actual payload data
  BT_STOP                       ← End inner struct
}
BT_STOP                         ← End outer struct

Key Schema Name

Microsoft.ProtectionServices.Entities.Raw.SpynetReportEntity

This schema name is mandatory. The server validates it and returns HTTP 500 for unrecognized schemas.

Binary Example (Heartbeat)

43 42 01 00                     ← "CB\x01\x00" marshal header
A9 3D 4D 69 63 72 6F ...       ← F5 STRING: schema name (61 bytes)
01                              ← BT_STOP_BASE
01                              ← BT_STOP_BASE
CB 0B 0E 01 00                  ← F10: LIST<LIST<INT8>> = [[]]
EA 3D 4D 69 63 72 6F ...       ← F20.F5 STRING: schema name again
01 01                           ← Two more BT_STOP_BASE
[payload fields...]             ← SpynetReport Bond fields
00                              ← BT_STOP (inner)
00                              ← BT_STOP (outer)

HTTP Transport Layer

HTTPS request/response format matching real Defender traffic

Request Headers

POST /wdcp.svc/bond/submitreport HTTP/1.1
Host: wdcp.microsoft.com
Content-Type: application/bond
Accept: application/bond
Accept-Charset: utf-8
User-Agent: MpCommunication
Connection: Keep-Alive
X-MS-MAPS-CUSTOMERTYPE: Consumer
X-MS-MAPS-OSVERSION: a0000000065f4
X-MS-MAPS-PLATFORMVERSION: 40012659a0005
X-MS-MAPS-ENGINEVERSION: 10001659a0001
Content-Length: <size>

Version Header Encoding

Versions are packed as 64-bit hex: (major<<48) | (minor<<32) | (build<<16) | revision

Version StringHex EncodingType
10.0.26100a0000000065f4OS Version (3-part)
4.18.26010.540012659a0005Platform Version
1.1.26010.110001659a0001Engine Version

Authentication Modes

Consumer
No auth header needed.
X-MS-MAPS-CUSTOMERTYPE: Consumer
Enterprise
Authorization: Bearer <AAD_TOKEN>
Client ID: cab96880-db5b-...
Legacy (Dead)
WS-Security UsernameToken
Path: /WdCpSrvc.asmx → 404

File Scan Flow

Complete request/response cycle for cloud file reputation

Step 1
Compute file hashes
SHA256 + SHA1 + MD5 + CRC32
Step 2
Build SpynetReport payload
Bond CB1 serialization
Step 3
Wrap in Bonded<T> envelope
Step 4
POST to /wdcp.svc/bond/submitreport
Step 5
Parse Bond response → MAPSVerdict

SpynetReport Payload Structure

SpynetReport {
  F20:  Revision = LIST<INT16>[3]       ← Schema version
  F30:  MachineGuid = STRING              ← Client identity (UUID4)
  F40:  AvSigVersion = STRING             ← "1.445.126.0"
  F60:  EngineVersion = STRING            ← "1.1.26010.1"
  F150: OsVer = STRING                    ← "10.0.0.0"
  F170: OsBuild = LIST<UINT32>[26100]
  F200: GeoId = LIST<INT32>[244]         ← US
  F300: AppVersion = STRING               ← "4.18.26010.5"
  F390: FileReportElements = LIST<LIST<STRUCT>> [
    FileReport {
      F10: Revision = LIST<INT16>[1]
      F20: Index = LIST<INT16>[1]
      F30: CoreReport = LIST<STRUCT> [{
        F20: FileName = "malware.exe"
        F30: FileSystem = "NTFS"
        F40: Size = LIST<INT64>[file_size]
        F80: MD5 = "44d88612fea..."
        F90: SHA1 = "3395856ce81..."
        F100: SHA256 = "275a021bbf..."
        F330: ReportType = "2"  ← SYNC_LOWFI
      }]
    }
  ]
  F1050: EngineReportGuid = STRING (UUID)
}

URL Reputation Flow

How Defender queries cloud for URL/domain safety ratings

Input
URL string (e.g. https://example.com)
Report Type
CoreReport.ReportType = 5 (URL_REPUTATION)
UrlReport (F1542)
UrlReportGuid + UrlList + SigSeq + SigSha
Response
UrlResponse with Determination + Confidence + TTL

UrlReport Structure (F1542)

UrlReport = LIST<STRUCT>[1] {   ← Must be LIST, not STRUCT (HTTP 500 otherwise!)
  F3:  UrlReportGuid = STRING (UUID)
  F6:  UrlList = STRUCT {
    F3: Urls = LIST<STRUCT> [
      UrlElement {
        F20: Url = "https://example.com"   ← Only field set by engine
        // F10: Order — NOT set by engine
        // F21: Url_Scrubbed — NOT set by engine
      }
    ]
  }
  F9:  UrlContext = STRUCT { ... }     ← Optional
  F12: SigSeq = "0"                    ← Mandatory
  F15: SigSha = ""                     ← Mandatory
  // F18: ReportOnly — omitted when querying
}

URL Response Fields

FieldTypeDescription
UrlSTRINGThe queried URL
DeterminationUINT80=Unknown, 1=Clean, 2=Malicious, 3=Phishing
ConfidenceUINT80-100 confidence score
TTLUINT8Cache time-to-live (short)
TTLlongUINT64Extended TTL value

Heartbeat System

12 heartbeat subtypes for connectivity, telemetry, and lifecycle events

Report Type = 4 (HEARTBEAT)

Heartbeat is indicated by F90: IsHeartBeat = 1 in SpynetReport, plus F920/F930 subtype fields.

ValueNameTrigger
0STILL_ALIVEPeriodic timer (default)
1SETUPFirst run / initial setup
2UNINSTALLMpTriggerHeartbeatOnUninstall
3ERRORMpTriggerErrorHeartbeatReport
4POLICY_CHANGEConfiguration/Group Policy update
5BROWSERMpSendBrowserHeartbeat
6EXCLUSIONExclusion list change
7CLEANUPPost-remediation cleanup
8SIGNATURE_UPDATEAfter signature update
9PLATFORM_UPDATEAfter platform/engine update
10TAMPER_PROTECTTamper protection event
11REBOOTPost-reboot heartbeat

Heartbeat Bond Fields

F90:  IsHeartBeat = UINT8(1)           ← Flags this as heartbeat
F920: StillAliveHB = LIST<UINT8>[type] ← Heartbeat subtype (0-11)
F930: HBControlGroup = LIST<UINT8>[0]  ← A/B test group
F940: HBSubtype = UINT8                ← Additional subtype info
F290: Membership = "2"                 ← Report type string

Block at First Sight (BAFS)

Zero-tolerance cloud blocking for unknown files

Trigger
Unknown file + CloudBlockLevel = 6 (ZERO_TOLERANCE)
Report Type
SYNC_LOWFI (2) — synchronous blocking query
Cloud Verdict
Server blocks file execution until verdict arrives
Allow
No FASTPATH → file runs
Block
FASTPATH delivered → quarantine

Cloud Block Levels

LevelValueBehavior
OFF/DEFAULT0No cloud checking
MODERATE1Normal blocking threshold
HIGH2Aggressive blocking (default for MAPS)
HIGH_PLUS4Very aggressive blocking
ZERO_TOLERANCE6Maximum sensitivity — BAFS mode

Note: Values 3, 5, 7+ are not documented. The fuzzer probes these gaps for hidden behavior.

Sample Upload Flow

Cloud-triggered file upload to Azure Blob Storage for detonation

Step 1
Send file scan report
Step 2
Server responds with SampleRequest
SampleRequest Fields
F3: RequestGuid (STRING)
F6: SHA1 (STRING)
F12: BlobSasUri — Azure upload URL with SAS token
F15: TTL (UINT64)
F18: Compression ("gzip")
F21: UseQuarantine (BOOL)
Step 3
HTTP PUT file bytes to BlobSasUri
Step 4
Azure sandbox detonates file → verdicts published

Upload Headers

PUT <blob_sas_uri> HTTP/1.1
Content-Type: application/octet-stream
x-ms-blob-type: BlockBlob
Content-Encoding: gzip              ← If compression requested
x-ms-meta-compression: gzip
Content-Length: <size>

Response Parsing

Decoding the Bond response from MAPS cloud

Response Schema

SubmitSpynetReportResult {
  F5: Schema = "Microsoft.ProtectionServices.Entities.Raw.SubmitSpynetReportResult"
  F6: SpynetReportResponse = LIST<STRUCT>[1] {
    F3:  Revision = UINT8(5)              ← Protocol version
    F6:  SampleRate = INT32(1)            ← Telemetry sampling
    F9:  SampleRequests = LIST<STRUCT>   ← Upload requests (if any)
    F12: SignaturePatches = LIST<STRUCT>  ← FASTPATH signatures!
    F15: UrlResponse = STRUCT             ← URL reputation result
    F18: ThreatDetailElements = LIST<STRUCT>
    F21: CertificateResponse = STRUCT
    F24: OnboardingResponse = STRUCT
  }
  F10: RuntimeType = STRUCT             ← Runtime type info
}

Verdict Logic

CLEAN
Response has Revision + SampleRate
but NO SignaturePatches or ThreatDetails.

Typical size: 88 bytes
MALICIOUS
SignaturePatches present (FASTPATH blob)
OR ThreatDetails with threat ID/name.

Typical size: ~488 bytes
SAMPLE REQUESTED
SampleRequests list present with
BlobSasUri for Azure upload.

Cloud wants the file!

Response Sizes

ScenarioSizeContents
Clean / unknown file88 bytesRevision=5, SampleRate=1
Known threat + FASTPATH~488 bytes88 base + 385B FASTPATH blob
Known threat (cached)88 bytesFASTPATH already delivered to this GUID

FASTPATH Dynamic Signatures

VDM TLV format — real-time threat definitions delivered from cloud

TLV Entry Format

┌──────────┬──────────┬───────────┬──────────────────┐
│ type (1) │ size_lo  │ size_hi   │ payload (size)   │
│  1 byte  │  1 byte  │  2 bytes  │  variable        │
└──────────┴──────────┴───────────┴──────────────────┘
size = size_lo | (size_hi << 8)   ← 24-bit little-endian

Known Entry Types

TypeNameDescription
0x5CTHREAT_BEGINStart of threat group: ThreatID (4B) + Flags (4B) + DetectionName
0x5DTHREAT_ENDEnd of threat group: ThreatID (4B)
0x67STATICHash-based detection: CRC32 + MD5 + SHA1
0x80KCRCECRC-based detection entry
0xAAFASTPATH_DATAMetadata: compilation timestamp + config flags
0xABFASTPATH_SDNStatic Detection Name
0xD8FASTPATH_TDNThreat Detection Name
0xDAFASTPATH_SDN_EXExtended SDN
0xECENVELOPEEncrypted detection logic (AES, 256B typical)
0xEEOUTER_WRAPPERV3 FASTPATH outer type with stream headers

EICAR Response Example (385 bytes)

[0xEC ENVELOPE]     256 bytes — Encrypted detection logic (RSA-2048 + AES)
[0xAA FASTPATH_DATA]  20 bytes — Compilation timestamp, config flags
[0x5C THREAT_BEGIN]   47 bytes — ThreatID=2147519003
                                    "Virus:DOS/EICAR_Test_File"
[0x67 STATIC]         38 bytes — SHA1 + MD5 + CRC32 of EICAR
[0x5D THREAT_END]      4 bytes — ThreatID=2147519003 (closing)

SpynetReport Schema

372 Bond fields reverse-engineered from mpengine.dll RTTI vtable analysis

Top-Level Fields (Key Selection)

OrdinalNameTypePurpose
F10ReportTimeINT64.NET DateTime ticks
F20RevisionLIST<INT16>Schema version (3)
F30MachineGuidSTRINGClient UUID identity
F40-F80Version stringsSTRINGAV sig, engine, NRI versions
F90IsHeartBeatUINT8Heartbeat flag
F150-F220System infomixedOS, geo, locale, CPU
F280ProductGuidSTRINGSession GUID
F390FileReportElementsLIST<LIST<STRUCT>>File scan reports
F580IsMsftInternalUINT8Microsoft internal flag
F590TestHookSTRINGTest/debug hook
F920-F940Heartbeat fieldsmixedHB type, control group
F1190NetworkConnElementsLIST<STRUCT>Network telemetry V1
F1275AmsiUacInfosLIST<STRUCT>UAC elevation telemetry
F1373CloudBlockLevelUINT32Block sensitivity
F1542UrlReportLIST<STRUCT>URL reputation query

Nested Schema Classes

FileReport (12 fields)
Revision, Index, CoreReport, PrevalentFileRpt, ParentIndices, ChildIndices, CollectReason
CoreReport (239 fields)
FileName, Hashes (MD5/SHA1/SHA256/CRC), ReportType, ThreatID, AMSI fields, Signer, ImpHash
UrlReport (6 fields)
UrlReportGuid, UrlList, UrlContext, SigSeq, SigSha, ReportOnly
ThreatDetails (11 fields)
ThreatID, Category, Name, Severity, Advice, SigInfoElements, DropType, TTL
AmsiUacInfo (30 fields)
Type, Identifier, Blocked, TrustedState, ExeAppName, CmdLine, COM/MSI/ActiveX/PkApp
NetworkConnV2 (21 fields)
IPv4/IPv6, Ports, Protocol, Direction, Bytes in/out, URI

All Endpoints & Authentication

Complete endpoint map with geo-affinity and failover

Primary Endpoints

EndpointURLPurpose
Productionwdcp.microsoft.comMain MAPS cloud
Failoverwdcpalt.microsoft.comBackup if primary fails
Pre-Productionfastpath.wdcpppe.microsoft.comTesting/PPE environment
FASTPATH Prodfastpath.wdcp.microsoft.comDynamic signature delivery
FASTPATH PPEfastpath.wdcpppe.microsoft.comTesting signatures

Geo-Affinity Endpoints (Data Residency)

US
unitedstates.cp.wd.microsoft.com
EU
europe.cp.wd.microsoft.com
UK
unitedkingdom.cp.wd.microsoft.com
AU
australia.cp.wd.microsoft.com

API Paths

PathProtocolStatus
/wdcp.svc/bond/submitreportBond CompactBinaryV1Active
/wdcp.svc/submitReportLegacy RESTUnknown
/wdcp.svc/entraReportEntra ID/EnterpriseEnterprise
/WdCpSrvc.asmxWS-Security SOAPDead (404)

Attack Surface & Fuzzing Targets

Where to look for hidden features, undocumented behavior, and security gaps

Fuzzer Modules (fuzz_maps.py)

ModuleWhat It ProbesLooking For
hiddenIsMsftInternal, TestHook, IsBeta, QueryOnly, MapsOrigin, VdiType, IsPassiveMode, AsimovDeviceTicket, PartnerGuid, multi-file, compressionHidden features unlocked by flags
paths70+ URL pathsUndiscovered WCF/REST endpoints
report-typesReportType 0-65535Undocumented report types beyond 1-7
headers50+ HTTP header variationsDebug/preview/insider header gates
fields200+ SpynetReport field ordinalsServer reaction to unknown fields
schemas20+ Bond schema namesAlternative schema acceptance
endpoints25+ hostname variationsUndiscovered regional endpoints
versionsOS, engine, platform, sig versionsVersion-gated features
customer-types30+ customer type valuesRole-gated functionality
block-levelsCloudBlockLevel 0-255Undocumented sensitivity levels
heartbeat-typesHeartbeatType 0-255Undocumented heartbeat subtypes
bond-typesWire type mismatchesParser edge cases and crashes
response-fieldsDiverse requests → response analysisNovel response field ordinals

High-Value Targets for Hidden Features

F580: IsMsftInternal
UINT8 flag — does setting this to 1 unlock extended diagnostics, verbose responses, or internal-only features?
F590: TestHook
STRING field — what values does the server recognize? Could enable debug/trace modes, bypass checks, or return extended data.
F340: QueryOnly
STRING field — may toggle a read-only mode that returns reputation without telemetry side effects.
F690: MapsOrigin
STRING — "mdatp", "intune", "sccm" etc. May route to different backends or unlock enterprise-specific features.
CloudBlockLevel 3,5,7-15
Known: 0,1,2,4,6. The gaps (3,5,7+) may map to undocumented sensitivity levels or special modes.
ReportType 8+
Known: 1-7. Higher values may map to behavior reports, certificate queries, or preview features.

Running the Fuzzer

# Quick test — hidden feature probes
python fuzz_maps.py hidden

# Full sweep with proxy inspection
python fuzz_maps.py --proxy http://127.0.0.1:8080 --no-verify --verbose all

# Specific module with slow rate
python fuzz_maps.py --delay 2.0 fields

# Pre-production endpoint (more permissive)
python fuzz_maps.py --ppe report-types
to navigate · T toggle TOC