Twill Typhoon — Updated FDMTP Backdoor
Executive Summary
Twill Typhoon (Mustang Panda / Earth Preta / Stately Taurus) is running an espionage campaign against APAC and Japanese entities — including finance-sector organizations — from late September 2025 through April 2026, deploying an updated build of the FDMTP modular .NET RAT (observed v3.2.5.1). The actor's objective is durable, low-noise remote access and intelligence collection from trusted-process context.
The core, durable behavior is DLL side-loading: the actor retrieves a legitimate, signed Windows executable, a matching .config file, and a malicious DLL from infrastructure masquerading as Yahoo- and Apple-affiliated CDNs, then lets the trusted binary load the rogue DLL. Confirmed abused binaries: biz_render.exe (Sogou Pinyin IME), vshost.exe (Visual Studio Hosting Process), and dfsvc.exe (.NET ClickOnce engine). The DLL pulls a .NET runtime in-process and stages the FDMTP framework, which communicates over a custom Duplex Message Transport Protocol (DMTP) with a /GetCluster registration URI and a Verify_Token: Dmtp header.
The highest-value defensive angle is behavioral, not indicator-based: the ordered sequence — signed EXE + .config + unsigned/unusual DLL written to the same directory, followed by that signed EXE making outbound HTTP to a young look-alike-CDN domain — survives infrastructure rotation and payload swaps. IOC hunts (the published hashes, the three domains, one IP) are included for immediate coverage but treated as perishable.
Defender priority: Hunt for signed Microsoft/Sogou binaries loading an unsigned or co-located DLL and then beaconing to look-alike CDN domains (*-cdn.it.com, icloud-cdn.net). A trusted process side-loading a freshly written DLL and immediately calling out is the single most reliable Twill Typhoon signal — anchor detection there, not on the rotating hashes.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Fwd |
|---|---|---|---|
| 1 | Darktrace — "Chinese APT Campaign … Updated FDMTP Backdoor" (15 May 2026) | Primary report. Full IOC set: hashes, 3 domains, 1 IP, 5-step attack chain, DMTP C2 mechanics, abused binaries, persistence keys. | yes |
| 2 | Industrial Cyber — Twill Typhoon DLL side-loading FDMTP (APAC) | Corroborates chain, binaries, yahoo-cdn.it.com, /GetCluster pattern, plugin modules, finance targeting. | yes |
| 2 | Infosecurity Magazine — Mustang Panda FDMTP APJ | Confirms icloud-cdn.net 5-min poll, FDMTP v3.2.5.1, IME registry persistence, alias mapping. | yes |
| 2 | SecurityWeek — Chinese APTs expand targets / update backdoors | Confirms ClickOnce + VS Hosting abuse, modular .NET capability set, APAC/Japan + finance scope. | partial |
| 3 | IBM X-Force Exchange (OSINT collection) | Auth-gated; no atomic IOCs extractable from public fragment. Listed for provenance only. | no |
Provenance note: Every atomic IOC in §4/§10 traces to Darktrace (hashes, IP, all three domains) corroborated by Industrial Cyber and Infosecurity Magazine. No IOCs were synthesized. Where an atomic value could not be sourced, the pack relies on behavioral detection instead.
Hunt Brief & Attack Chain
Hunt hypotheses (ordered by fidelity)
- H1 (high): A signed, legitimate binary (
biz_render.exe,vshost.exe,dfsvc.exe) loads a DLL that was written to disk minutes earlier and/or resides in a non-standard path — classic side-load. T1574.002 - H2 (high): One of the abused binaries (or any process) makes outbound HTTP to a look-alike CDN domain (
*yahoo-cdn*,icloud-cdn[.]net,*-cdn.it.com). T1071.001 / T1036.005 - H3 (high): Outbound request whose URI contains
/GetClusterwithprotocol=DotNet-TcpDmtpor aVerify_Token: Dmtpheader — FDMTP C2 registration. T1071.001 - H4 (medium): Named malicious DLLs written to disk (
dnscfg.dll,browser_host.dll,Client.TcpDmtp.dll,Client.DmtpFrame.dll, the VS sync DLL). T1105 / T1574.002 - H5 (medium): Registry persistence under
HKCU\Software\Microsoft\IME\{id}or the TypeLib COM CLSID, or scheduled-task creation by a side-loaded process. T1547.001 / T1053.005 / T1546 - H6 (medium): Atomic IOC matches — published hashes, the three domains, IP
154.223.58[.]142. Perishable. - H7 (low): A non-browser, signed binary beaconing on a fixed ~5-minute interval (update-channel polling). T1071.001 / beacon cadence
Attack chain
| Step | Behavior | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 · Initial access | Spear-phish leads host to retrieve staged files | DnsRequest, NetworkConnectIP4 | First contact with look-alike CDN domain |
| 2 · Retrieve legit EXE | Download signed biz_render/vshost/dfsvc.exe | PeFileWritten, FileCreateInfo | Trusted EXE landing in user-writable / odd path |
| 3 · Retrieve .config | Matching dfsvc.exe.config / .config file | FileCreateInfo | EXE + .config + DLL co-written within minutes |
| 4 · Retrieve malicious DLL | Side-load DLL (dnscfg.dll, browser_host.dll …); repeated pulls over days | PeFileWritten, ImageHash | Unsigned DLL beside signed EXE; module-load |
| 5 · Execute / side-load | Signed EXE loads rogue DLL → .NET runtime in-process → FDMTP | ProcessRollup2, ImageFileName, module load | Signed parent, anomalous child DLL + clr.dll load |
| 6 · C2 (DMTP) | /GetCluster?protocol=DotNet-TcpDmtp, header Verify_Token: Dmtp; ~5-min poll | NetworkConnectIP4, DnsRequest | URI/header signature + look-alike CDN + cadence |
| 7 · Persist | HKCU\…\IME\{id}, TypeLib COM CLSID, scheduled task | RegGenericValueUpdate, ScheduledTaskRegistered | Persistence written by side-loaded process |
Consolidated IOC Table
All values below are reproduced verbatim from cited primary sources (Darktrace / Industrial Cyber / Infosecurity Magazine). Network IOCs are defanged. Infrastructure rotates — treat hashes/domains as perishable and lead with the behavioral hunts in §8.
| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| domain | www.icloud-cdn[.]net | high | detect | Apple-impersonating CDN; ~5-min update poll (Infosecurity / Darktrace) |
| domain | www.yahoo-cdn.it[.]com | high | detect | Yahoo-impersonating CDN payload host (Darktrace / Industrial Cyber) |
| domain | yahoo-cdn.it[.]com | high | detect | Apex of Yahoo look-alike CDN (Darktrace) |
| ipv4 | 154.223.58[.]142 | medium | hunt | Associated C2/staging infrastructure (Darktrace) |
| md5 (Test.zip) | fc3959ebd35286a82c662dc81ca658cb | high | detect | Staging archive (Darktrace) |
| md5 (dnscfg.dll) | b2c8f1402d336963478f4c5bc36c961a | high | detect | Malicious side-load DLL paired w/ dfsvc.exe (Darktrace) |
| md5 (browser_host.dll) | c17f39d25def01d5c87615388925f45a | high | detect | Side-load DLL via biz_render.exe / Sogou Pinyin (Darktrace) |
| md5 (Client.TcpDmtp.dll) | c52b4a16d93a44376f0407f1c06e0b | medium | hunt | FDMTP DMTP transport module (Darktrace; hash as printed) |
| md5 (Client.DmtpFrame.dll) | 482cc72e01dfa54f30efe4fefde5422d | high | detect | FDMTP framing module (Darktrace) |
| md5 (VisualStudio Sync DLL) | c650a624455c5222906b60aac7e57d48 | high | detect | Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll side-load via vshost.exe (Darktrace) |
| md5 (Persist.Extra) | 162F69FE29EB7DE12B684E979A446131 | high | detect | FDMTP persistence plugin (Darktrace) |
| md5 (Persist.Registry) | 067FBAD4D6905D6E13FDC19964C1EA52 | high | detect | FDMTP registry-persistence plugin (Darktrace) |
| md5 (Persist.WpTask) | DF3437C88866C060B00468055E6FA146 | high | detect | FDMTP scheduled-task persistence plugin (Darktrace) |
| md5 (Assist) | 2CD781AB63A00CE5302ED844CFBECC27 | high | detect | FDMTP assist/loader module (Darktrace) |
| filename (legit, abused) | biz_render.exe | high | hunt | Sogou Pinyin IME binary abused for side-load |
| filename (legit, abused) | vshost.exe / vhost.exe | high | hunt | Visual Studio hosting process abused for side-load |
| filename (legit, abused) | dfsvc.exe | high | hunt | .NET ClickOnce engine abused for side-load |
| uri pattern | /GetCluster?protocol=DotNet-TcpDmtp&tag={0}&uid={1} | high | detect | FDMTP C2 registration URI (Darktrace / Industrial Cyber) |
| http header | Verify_Token: Dmtp | high | detect | Custom FDMTP C2 header (Darktrace) |
| registry | HKCU\Software\Microsoft\IME\{id} | medium | hunt | FDMTP persistence key (Darktrace / Infosecurity) |
| registry | HKCU\Software\Classes\TypeLib\{9E175B61-F52A-11D8-B9A5-505054503030}\1.0\1\Win64 | medium | hunt | COM TypeLib persistence (Darktrace) |
Affected Surface & Telemetry Matrix
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Windows endpoints (user workstations) | ProcessRollup2, PeFileWritten, FileCreateInfo, module-load | Critical | Low — core EDR |
| DLL module-load visibility | ImageHash / loaded-module events | High | Medium — not all tenants log module loads |
| Egress / DNS | DnsRequest, NetworkConnectIP4 | High | Low |
| HTTP URI / header inspection | Proxy / TLS-inspect / web-gateway logs | High | High — URI/header hidden without proxy or TLS inspect |
| Registry & scheduled tasks | RegGenericValueUpdate, ScheduledTaskRegistered | Medium | Low |
Gap: The strongest C2 signatures (/GetCluster URI, Verify_Token: Dmtp header) live in HTTP request content. Without a proxy or TLS inspection, fall back to domain/IP + the side-load behavioral hunt (Q1/Q2).
ATT&CK Mapping
| Tactic | Technique | Observed Behavior | Query / Control |
|---|---|---|---|
| Initial Access | T1566 Phishing | Spear-phish leading to staged retrieval | Native §7 / Q2 |
| Command & Control | T1105 Ingress Tool Transfer | Repeated EXE/config/DLL pulls from CDN look-alikes | Q2, Q4 |
| Defense Evasion | T1574.002 DLL Side-Loading | Signed EXE loads rogue co-located DLL | Q1 |
| Defense Evasion | T1036.005 Match Legit Name/Location | Infra + binaries impersonate Yahoo/Apple/MS/Sogou | Q2, IOA |
| Execution | T1106 Native API | .NET runtime loaded in-process by side-load DLL | Q1, Q5 |
| Defense Evasion | T1620 Reflective Code Loading | Next-stage .NET pulled directly into memory | Q5 |
| Defense Evasion | T1140 / T1027 Deobf / Obfuscation | Runtime string decryption; obfuscated .NET | Native §7 |
| Persistence | T1547.001 Registry Run/IME key | HKCU\…\IME\{id} | Q6 |
| Persistence | T1053.005 Scheduled Task | FDMTP WpTask plugin creates task | Q6, Native §7 |
| Persistence | T1546 Event-Triggered (COM TypeLib) | TypeLib CLSID persistence | Q6 |
| Discovery | T1082 / T1007 / T1622 System/Service/Debugger | System fingerprinting, AV/domain/hardware enum | Native §7 |
| Command & Control | T1071.001 App-Layer (Web) | /GetCluster + Verify_Token: Dmtp | Q3 |
| Command & Control | T1571 / T1095 Non-Standard Port / Non-App-Layer | Custom DMTP over TCP | Q3, Q7 |
Native Audit-Log Hunts
Checks runnable without CQL, for tenants lacking full module-load or proxy telemetry:
- Sysmon Event ID 7 (Image Loaded): alert when
biz_render.exe,vshost.exe, ordfsvc.exeload a DLL withSigned=falseor a publisher other than the host binary's. - Sysmon Event ID 11 (File Create): a
.exe, a matching.config, and a.dllwritten to the same user-writable directory within a short window. - Sysmon Event ID 13 (Registry Set): writes to
HKCU\Software\Microsoft\IME\sub-keys or the TypeLib CLSID{9E175B61-F52A-11D8-B9A5-505054503030}by a non-IME process. - Windows Security 4698 (Scheduled Task Created): task registered with an action pointing at a user-profile path or one of the abused binaries.
- Web-gateway / proxy logs: any request to
*yahoo-cdn*,icloud-cdn[.]net,*-cdn.it.com, or a URI containing/GetCluster/ headerVerify_Token: Dmtp. - DNS resolver logs: resolutions of the three published domains or newly-registered
*-cdn*look-alikes of Yahoo/Apple.
CrowdStrike LogScale CQL Hunt Queries
Looks for: a PE DLL written to disk by, or beside, one of the three abused legitimate binaries — the file-staging stage of the side-load. FP: legitimate VS / Sogou / ClickOnce updates write DLLs too; scope to user-writable paths and pair with Q2 egress.
// HUNT: Abused legit binary co-writing a DLL (side-load staging) // MITRE: T1574.002, T1105 // CONF: high FP: med COST: low | REQUIRES: PeFileWritten // FALSE POSITIVES: legitimate Visual Studio / Sogou / ClickOnce updates // TUNING: restrict to \Users\ \AppData\ \Temp\ \ProgramData\ ; exclude signed publisher update dirs #event_simpleName=PeFileWritten | TargetFileName=/\.dll$/i | ContextBaseFileName=/^(biz_render|vshost|vhost|dfsvc)\.exe$/i | FilePath=/\\(Users|AppData|Temp|ProgramData|Public)\\/i | table([@timestamp, ComputerName, UserName, ContextBaseFileName, TargetFileName, FilePath, SHA256HashData], limit=200)
Looks for: DNS resolution of the published Yahoo/Apple look-alike CDN domains plus the generic *-cdn.it.com pattern. FP: low — these strings are actor-specific; the broad -cdn.it.com arm may need review.
// HUNT: DNS to Twill Typhoon CDN-impersonating infrastructure // MITRE: T1071.001, T1036.005 // CONF: high FP: low COST: low | REQUIRES: DnsRequest // FALSE POSITIVES: rare; review the generic -cdn.it.com arm before alerting #event_simpleName=DnsRequest | DomainName=/(^|\.)(yahoo-cdn\.it\.com|icloud-cdn\.net)$|(-cdn\.it\.com)$/i | table([@timestamp, ComputerName, UserName, DomainName, ContextBaseFileName], limit=200)
Looks for: network connections from the abused binaries (FDMTP host process) or to the published C2 IP — the DMTP beacon. FP: medium; the abused binaries legitimately exist, so confirm against domain (Q2) and the URI signature where proxy logs allow.
// HUNT: FDMTP C2 — side-load host process beacon / published staging IP // MITRE: T1071.001, T1571, T1095 // CONF: high FP: med COST: low | REQUIRES: NetworkConnectIP4 // FALSE POSITIVES: legit dfsvc/vshost net activity; confirm against Q2 domains // TUNING: drop the IP arm once it ages out; keep the process arm #event_simpleName=NetworkConnectIP4 | (RemoteAddressIP4="154.223.58.142" OR ContextBaseFileName=/^(biz_render|vshost|vhost|dfsvc)\.exe$/i) | RemotePort!=0 | table([@timestamp, ComputerName, UserName, ContextBaseFileName, RemoteAddressIP4, RemotePort], limit=200)
Looks for: the named malicious DLLs and staging archive by filename or published hash. FP: low; filenames like WindowsBase.dll are also legitimate, so the hash arm and path context disambiguate.
// HUNT: FDMTP named DLLs / staging archive by name or hash // MITRE: T1105, T1574.002 // CONF: med FP: low COST: low | REQUIRES: PeFileWritten // FALSE POSITIVES: legit WindowsBase.dll/Client.dll — rely on hash + path #event_simpleName=/PeFileWritten|NewExecutableWritten/ | (TargetFileName=/(dnscfg|browser_host|Client\.TcpDmtp|Client\.DmtpFrame|client\.core|Persist\.(WpTask|registry|extra)|Assist)\.dll$/i OR TargetFileName=/Microsoft\.VisualStudio\.HostingProcess\.Utilities\.Sync\.dll$/i OR MD5HashData=/^(b2c8f1402d336963478f4c5bc36c961a|c17f39d25def01d5c87615388925f45a|482cc72e01dfa54f30efe4fefde5422d|c650a624455c5222906b60aac7e57d48|fc3959ebd35286a82c662dc81ca658cb)$/i) | table([@timestamp, ComputerName, UserName, TargetFileName, FilePath, MD5HashData, SHA256HashData], limit=max)
Looks for: the side-load host process spawning from / running in a user-writable directory — the EXE staged outside its normal install location. FP: medium; ClickOnce/VS legitimately run from profile paths, so pair with Q1/Q2 within the same host+window.
// HUNT: Abused binary executing from user-writable path (staged side-load) // MITRE: T1574.002, T1106, T1620 // CONF: high FP: med COST: med | REQUIRES: ProcessRollup2 // FALSE POSITIVES: ClickOnce dfsvc.exe legitimately runs from profile; correlate w/ Q1+Q2 // TUNING: join on aid to Q2 domain hits within a 24h window before alerting #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ImageFileName=/\\(biz_render|vshost|vhost)\.exe$/i | ImageFileName=/\\(Users|AppData|Temp|ProgramData|Public)\\/i | table([@timestamp, ComputerName, UserName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData], limit=200)
Looks for: registry persistence under the IME path or the published TypeLib CLSID. FP: medium — the IME tree is also touched by legitimate IME software; the specific TypeLib GUID is high-fidelity.
// HUNT: FDMTP registry persistence (IME key / TypeLib CLSID) // MITRE: T1547.001, T1546 // CONF: med FP: med COST: low | REQUIRES: RegGenericValueUpdate / AsepValueUpdate // FALSE POSITIVES: genuine IME installs touch HKCU\...\IME — TypeLib GUID arm is high-fidelity // TUNING: alert on the TypeLib GUID arm; treat the IME arm as hunt-only #event_simpleName=/RegGenericValueUpdate|AsepValueUpdate|RegKeyCreate/ | RegObjectName=/(Software\\Microsoft\\IME\\|TypeLib\\\{9E175B61-F52A-11D8-B9A5-505054503030\})/i | table([@timestamp, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue], limit=200)
Looks for: repetitive outbound connections from the abused binaries consistent with the ~5-minute update-channel poll. FP: medium — many apps poll on a cadence; use as a triage aid, not a standalone alert.
// HUNT: Periodic beacon cadence from FDMTP side-load host process // MITRE: T1071.001, T1095 // CONF: low FP: med COST: high | REQUIRES: NetworkConnectIP4 // FALSE POSITIVES: legit update/telemetry pollers — triage aid only, not standalone // TUNING: review hosts with conn_count >= 10 to few remotes over the window #event_simpleName=NetworkConnectIP4 | ContextBaseFileName=/^(biz_render|vshost|vhost|dfsvc)\.exe$/i | groupBy([ComputerName, ContextBaseFileName, RemoteAddressIP4], function=[count(as=conn_count), min(@timestamp, as=first), max(@timestamp, as=last)]) | conn_count>=10 | table([ComputerName, ContextBaseFileName, RemoteAddressIP4, conn_count, first, last], limit=200)
CrowdStrike Custom IOA Recommendations
IOA-1 · Trusted binary side-loading from user-writable path
Rule type: Process Creation. Pattern: Image Filename matches (biz_render|vshost|vhost|dfsvc)\.exe AND Image Path under \Users\ / \AppData\ / \Temp\ / \ProgramData\. Action: Detect (escalate to Block after baseline). Exclusions: signed publisher update/installer directories.
IOA-2 · Network connection to FDMTP C2 URI signature
Rule type: Network Connection / DNS. Pattern: Domain matches yahoo-cdn\.it\.com / icloud-cdn\.net / -cdn\.it\.com. Action: Detect & alert. Exclusions: none expected; review the generic -cdn.it.com arm against your environment first.
IOA-3 · Named FDMTP DLL written to disk
Rule type: File Write. Pattern: Target filename matches the FDMTP DLL set in Q4. Action: Detect. Exclusions: exclude legitimate WindowsBase.dll in system paths.
Promotion path: Q1, Q2, Q4 are the strongest IOA candidates (high CONF, low/med FP). Q3/Q5/Q6 stay Investigate-only until baselined. Q7 is triage-aid only.
Machine-Readable IOC Appendix
Grouped quick-copy blocks. All atomic values are sourced from the cited reports; defang is removed in the import-ready CSV.
type,value,action,severity,expiration,description,tags domain,icloud-cdn.net,detect,high,2026-12-21,Twill Typhoon Apple-impersonating CDN,campaign:TwillTyphoon domain,yahoo-cdn.it.com,detect,high,2026-12-21,Twill Typhoon Yahoo-impersonating CDN,campaign:TwillTyphoon ipv4,154.223.58.142,detect,high,2026-09-21,Twill Typhoon C2/staging IP,campaign:TwillTyphoon md5,fc3959ebd35286a82c662dc81ca658cb,detect,critical,2027-06-21,FDMTP staging archive Test.zip,campaign:TwillTyphoon md5,b2c8f1402d336963478f4c5bc36c961a,detect,critical,2027-06-21,FDMTP dnscfg.dll sideload,campaign:TwillTyphoon md5,c17f39d25def01d5c87615388925f45a,detect,critical,2027-06-21,FDMTP browser_host.dll sideload,campaign:TwillTyphoon md5,482cc72e01dfa54f30efe4fefde5422d,detect,critical,2027-06-21,FDMTP Client.DmtpFrame.dll,campaign:TwillTyphoon md5,c650a624455c5222906b60aac7e57d48,detect,critical,2027-06-21,FDMTP VisualStudio Sync DLL sideload,campaign:TwillTyphoon md5,162F69FE29EB7DE12B684E979A446131,detect,critical,2027-06-21,FDMTP Persist.Extra,campaign:TwillTyphoon md5,067FBAD4D6905D6E13FDC19964C1EA52,detect,critical,2027-06-21,FDMTP Persist.Registry,campaign:TwillTyphoon md5,DF3437C88866C060B00468055E6FA146,detect,critical,2027-06-21,FDMTP Persist.WpTask,campaign:TwillTyphoon md5,2CD781AB63A00CE5302ED844CFBECC27,detect,critical,2027-06-21,FDMTP Assist module,campaign:TwillTyphoon
Signed EXE (biz_render.exe / vshost.exe / dfsvc.exe) loads an unsigned or co-located DLL from a user-writable path -> side-load EXE + matching .config + DLL written to same dir within minutes -> staging HTTP URI contains: /GetCluster?protocol=DotNet-TcpDmtp&tag=...&uid=... HTTP request header: Verify_Token: Dmtp Look-alike CDN domains: *yahoo-cdn*, icloud-cdn[.]net, *-cdn.it.com ~5-minute fixed-interval beacon from a non-browser signed binary .NET CLR loaded in-process by a side-load host then memory-only stage
Backdoor: FDMTP (modular .NET RAT, observed v3.2.5.1)
Abused legit: biz_render.exe (Sogou Pinyin IME)
vshost.exe / vhost.exe (Visual Studio Hosting)
dfsvc.exe (.NET ClickOnce engine)
Malicious DLLs: dnscfg.dll, browser_host.dll, Client.TcpDmtp.dll,
Client.DmtpFrame.dll, client.core.dll,
Persist.WpTask.dll, Persist.registry.dll,
Persist.extra.dll, Assist.dll, WindowsBase.dll,
Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll
Config/stage: dfsvc.exe.config, config.etl, checksum.bin/.etl,
version.txt, Test.zip
Persistence: HKCU\Software\Microsoft\IME\{id}
HKCU\Software\Classes\TypeLib\{9E175B61-F52A-11D8-B9A5-505054503030}\1.0\1\Win64
# ASR rules relevant to this campaign (Defender) # 56a863a9-875e-4185-98a7-b882c64b5ce5 Block untrusted/unsigned from USB # 01443614-cd74-433a-b99e-2ecdc07bfc25 Block executables unless prevalence/age/trusted # d1e49aac-8f56-4280-b9ba-993a6d77406c Block process creations from PSExec/WMI Get-MpPreference | Select -Expand AttackSurfaceReductionRules_Ids Get-MpPreference | Select -Expand AttackSurfaceReductionRules_Actions # Confirm SmartScreen + signature enforcement Get-MpComputerStatus | Select AMRunningMode, RealTimeProtectionEnabled
Detection Validation Gates
| Gate | Check | Pass Criteria |
|---|---|---|
| Telemetry ready | PeFileWritten, ProcessRollup2, DnsRequest, NetworkConnectIP4, registry events flowing | All five event types present in last 24h |
| Module-load coverage | Image/module-load events available (for Q1/Q5 fidelity) | Confirmed or documented gap; fall back to file-write hunts |
| Proxy / HTTP content | URI + header visibility for /GetCluster / Verify_Token | Available, or documented gap → rely on Q2/Q3 |
| Benign baseline | Run Q1/Q5 over 7d; catalog legit VS/Sogou/ClickOnce noise | Exclusions written before promotion |
| Positive test | Benign signed EXE side-loading a test DLL from %TEMP% | Q1 fires; openFalcon link resolves |
| Promotion | Q1/Q2/Q4 → Custom IOA after baseline; Q3/Q5/Q6 stay hunt | FP rate acceptable in pilot ring |
Hardening — Tiered
- Block the published infrastructure at proxy/DNS/firewall: the three domains and the C2 IP. (M1037 Filter Network Traffic)
- Enable Defender ASR "Block executable files from running unless they meet a prevalence/age/trusted-list criterion" (
01443614-…) and the unsigned-from-USB rule (56a863a9-…) in Block mode. (M1038 Execution Prevention; CIS Win11 §18 / MS Security Baseline) - SmartScreen + signature enforcement on, so freshly-downloaded unsigned DLLs/EXEs are flagged. (M1042 Disable/Remove Feature)
- WDAC / AppLocker DLL rules: enforce DLL-load policy so signed binaries cannot load unsigned DLLs from user-writable paths — directly defeats the side-load. (M1038; MS WDAC guidance) pilot — app-compat risk
- Remove/uninstall unused IME and Visual Studio hosting components from non-developer fleets so
biz_render.exe/vshost.exearen't present to abuse. (M1042) - Newly-Registered-Domain & look-alike blocking at the proxy for
*-cdn*typo-squats of major brands. (M1037)
- Full WDAC in enforced mode with a managed publisher allow-list across the fleet. (M1038)
- Egress TLS inspection on a proxy to expose the
/GetClusterURI andVerify_Token: Dmtpheader for content-based detection. (M1037) privacy/coordination - Phishing-resistant email controls + user training targeting the spear-phish initial access. (M1017 / M1031)
Deployable Playbooks
P1 · Enable ASR rules (PowerShell)
# Block executables unless they meet prevalence/age/trusted-list criteria Add-MpPreference -AttackSurfaceReductionRules_Ids 01443614-cd74-433a-b99e-2ecdc07bfc25 -AttackSurfaceReductionRules_Actions Enabled # Block untrusted and unsigned processes that run from USB Add-MpPreference -AttackSurfaceReductionRules_Ids 56a863a9-875e-4185-98a7-b882c64b5ce5 -AttackSurfaceReductionRules_Actions Enabled # Verify Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Ids
P2 · WDAC DLL-enforcement skeleton (block unsigned DLL loads)
# Build a base policy in enforced mode, then enable the option that also # enforces DLL load rules (Option 0 + DLL enforcement). Pilot in Audit first. $pol = "C:\WDAC\TwillTyphoon_DLLenforce.xml" New-CIPolicy -FilePath $pol -Level Publisher -UserPEs -ScanPath C:\Windows Set-RuleOption -FilePath $pol -Option 0 # Enabled:UMCI Set-RuleOption -FilePath $pol -Option 3 -Delete # remove Audit mode -> enforce ConvertFrom-CIPolicy -XmlFilePath $pol -BinaryFilePath C:\WDAC\TwillTyphoon.cip # Stage C:\WDAC\TwillTyphoon.cip via CI policy refresh / Intune; pilot ring first.
P3 · Block infrastructure (DNS sinkhole / hosts — pilot)
# Proxy/firewall block list (preferred). Sample hosts-level fallback: 0.0.0.0 yahoo-cdn.it.com 0.0.0.0 www.yahoo-cdn.it.com 0.0.0.0 icloud-cdn.net 0.0.0.0 www.icloud-cdn.net # Firewall: deny egress to 154.223.58.142
⚠ Pilot before fleet-wide: WDAC DLL enforcement can break legitimate apps. Deploy in Audit, review CodeIntegrity/Operational 3076 events, then enforce on a ring.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain host via Falcon; preserve memory if feasible (FDMTP is memory-staged) | SOC L2 | Containment timestamp, host ID |
| Scope | Run Q2/Q4 environment-wide; pivot on aid of any hit to find sibling hosts; check proxy logs for /GetCluster | Threat Hunt | Hit list, IPs/domains contacted |
| Eradicate | Remove side-loaded DLLs, staged EXE/.config, scheduled task, and registry persistence (IME key + TypeLib CLSID) | IR / Endpoint | File + registry artifacts collected |
| Eradicate | Rotate credentials used on host; assume collection occurred (espionage) | IAM | Reset log |
| Recover | Reimage; restore from known-good; re-baseline after WDAC/ASR applied | Endpoint | Rebuild ticket |
| Report | Block IOCs (§10 CSV), brief stakeholders, file intel update | SOC Lead | This pack + IOC import receipt |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1574.002 Side-Loading | Signed EXE loads rogue co-located DLL | Q1, Q5 | IOA-1 | Good |
| T1071.001 C2 (look-alike CDN) | DNS/connect to impersonating CDN | Q2, Q3 | IOA-2 | Good |
| T1071.001 C2 (URI/header) | /GetCluster + Verify_Token: Dmtp | Native §7 | — | Partial — needs proxy/TLS inspect |
| T1105 Ingress Transfer | Named DLL / archive written | Q4 | IOA-3 | Good |
| T1547.001 / T1546 Persistence | IME key / TypeLib CLSID | Q6 | — | Partial — IME arm noisy |
| T1053.005 Scheduled Task | WpTask plugin creates task | Native §7 | — | Partial |
| T1620 Reflective Load | Memory-only .NET stage | Q5 (proxy) | — | GAP — in-memory only |
| T1566 Initial Access | Spear-phish | — | — | GAP — email-side, out of EDR scope |
Validation: baseline Q1/Q5 over 7 days to capture legitimate VS/Sogou/ClickOnce DLL loads before promoting to IOA. The two GAP rows (reflective .NET load; spear-phish) are not EDR-process-detectable here — cover them via memory-scan/AMSI and email security respectively.
Hunt Summary Ticket
TITLE: Twill Typhoon (Mustang Panda) — Updated FDMTP Backdoor via DLL Side-Loading
SEVERITY: HIGH — Nation-state espionage, active (late Sep 2025 – Apr 2026)
SCOPE: Windows endpoints; APAC/Japan + finance targeting; trusted-process side-load
HYPOTHESIS: Signed legit binaries (biz_render/vshost/dfsvc.exe) side-load malicious DLLs
from CDN-impersonating infra, staging a modular .NET RAT (FDMTP) over DMTP C2
QUERIES: Q1 side-load staging | Q2 look-alike CDN DNS | Q3 C2 beacon/IP
Q4 named DLL/archive | Q5 staged-path exec | Q6 persistence | Q7 cadence
DO FIRST: Run Q2 + Q4 env-wide; block 3 domains + 154.223.58.142; enable ASR (P1)
FINDINGS: <fill: hosts, hits, C2 contacted>
GAPS: Reflective in-memory .NET stage; spear-phish initial access (email-side)
ACTIONS: Isolate -> scope via aid -> eradicate DLL/task/registry -> reimage -> block IOCs
OWNER: HuntPack
VERSION: v0.2 · 2026-06-21
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| 1 | Darktrace — Updated FDMTP Backdoor | Primary IOCs, chain, C2 mechanics | 2026-06-21 |
| 2 | Industrial Cyber — Twill Typhoon DLL side-loading | Chain, binaries, GetCluster, finance scope | 2026-06-21 |
| 2 | Infosecurity Magazine — Mustang Panda FDMTP APJ | icloud-cdn poll, FDMTP v3.2.5.1, aliases | 2026-06-21 |
| 2 | SecurityWeek — Chinese APTs update backdoors | ClickOnce/VS abuse, capability set, scope | 2026-06-21 |
| 3 | IBM X-Force Exchange — OSINT collection | Provenance reference (auth-gated) | 2026-06-21 |