Back to Intelligence

Head Mare PhantomCore via TrueConf Supply-Chain Compromise + STARDUST CHOLLIMA Rust Crate Backdoor: OTX Pulse Analysis — Enterprise Detection Pack

SA
Security Arsenal Team
August 21, 2026
11 min read

Two fresh AlienVault OTX pulses (modified 2026-08-21, TLP:WHITE) confirm two concurrent supply-chain intrusion campaigns — one targeting enterprise video conferencing infrastructure, the other poisoning the Rust developer ecosystem. Both are actively distributing backdoors, and both share a common strategic theme: compromising trusted distribution channels so that victims infect themselves.


Threat Summary

The pulses collectively reveal a coordinated surge in upstream distribution-channel compromise:

  1. Head Mare APT — TrueConf Server Exploitation → PhantomCore Delivery. The Head Mare group exploited two vulnerabilities in unpatched TrueConf video conferencing servers to gain arbitrary code execution. Once inside, operators replaced legitimate TrueConf client installers hosted on the compromised server with trojanized versions and planted web shells for persistent access. Conference participants who downloaded the client from the trusted organizational server received PhantomCore (with PhantomGraph tooling observed alongside), a backdoor giving the actor hands-on access to victim endpoints. This is a classic watering-hole/supply-chain hybrid: the victim's own trusted vendor server becomes the malware distribution point.

  2. STARDUST CHOLLIMA (DPRK) — crates.io Supply-Chain Attack. On August 20, 2026, malicious versions of three widely-depended-upon Rust crates — arrayref@0.3.10, internment@0.8.7, and append-only-vec@0.1.9 — were published to crates.io. The poisoned releases introduced a typosquatted dependency, proc-macro1 (mimicking the legitimate proc-macro2), whose build script downloads and executes a remote binary at compile time. The payload is a full-featured backdoor that beacons to C2 over HTTPS, exfiltrates host information, and enumerates the victim environment. Wiz analysis ties this activity to the broader DPRK MASTRA campaign cluster with significant overlap to STARDUST CHOLLIMA tradecraft — consistent with DPRK's established pattern of targeting software developers to reach cryptocurrency, fintech, and defense-sector victims downstream.

Objective in both cases: establish persistent backdoor access at scale by abusing trust — trust in an organization's own conferencing server, and trust in open-source package registries. Developer workstations and CI/CD build runners are the highest-value targets in the Rust campaign; corporate conference participants (often executives and external partners) are the targets in the TrueConf campaign.


Threat Actor / Malware Profile

Head Mare / PhantomCore & PhantomGraph

  • Distribution: Trojanized TrueConf client installers served from exploited, legitimate TrueConf servers — the download source itself is trusted by the victim.
  • Initial access vector: Exploitation of two TrueConf server vulnerabilities enabling arbitrary code execution on the server side, followed by installer replacement and web shell deployment for durable server-side persistence.
  • Payload behavior (PhantomCore): Backdoor providing remote command execution on the endpoint; PhantomGraph observed as companion tooling for lateral movement/collection. Kaspersky ICS CERT reporting indicates the operator manually stages activity post-compromise (semi-interactive APT tradecraft).
  • C2: IPv4-based C2 infrastructure (e.g., 194.87.239.71); HTTPS-blended traffic expected.
  • Anti-analysis: Delivery through a legitimate signed-channel installer defeats most reputation-based controls; victims have no phishing email or malicious link to inspect — the intrusion surfaces only at endpoint execution.

STARDUST CHOLLIMA / proc-macro1 Backdoor

  • Distribution: Malicious crate versions on crates.io (arrayref, internment, append-only-vec) pulling in typosquatted proc-macro1 dependency.
  • Execution mechanism: Rust build.rs compile-time code execution — the malicious build script fetches and runs a remote binary during cargo build. No user double-click required; simply building a dependent project detonates the payload. CI runners, build containers, and developer machines are all exposed.
  • Payload behavior: HTTPS beaconing backdoor; host information exfiltration; environment enumeration (credential files, SSH keys, cloud tokens, crypto wallets are typical DPRK targets on developer hosts).
  • C2: hwsrv-798836.hostwindsdns.com (Hostwinds-hosted infrastructure, a low-cost VPS provider frequently abused by DPRK actors).
  • Persistence: Typically via dropped secondary payloads establishing user-level persistence (launch agents, cron, shell profile hooks, or registry Run keys depending on OS) after initial compile-time execution.
  • Anti-analysis: Payload delivered at build time — not present in the crate source tarball as a readable binary; source-level review shows only an innocuous-looking build script network fetch. Typosquat name closely resembles the ubiquitous legitimate proc-macro2 crate to survive casual Cargo.lock review.

IOC Analysis

TypeExamplesOperationalization
IPv4 (C2)194.87.239.71Block at egress firewall/proxy; retro-hunt NetFlow, DNS, and proxy logs for 90 days
Hostname (C2)hwsrv-798836.hostwindsdns.comDNS sinkhole/block; hunt DNS query logs across endpoints and build runners
FileHash-MD5 (×7)0e4541c3153ec5ed01497f19cf4f63d0, 2bb75c20e778eb5c416965bd4d4259b1, …Load into EDR blocklist; hash-sweep endpoints and the TrueConf server's installer directory
FileHash-SHA1/SHA256 (×7)25ad700976873c76af785cb99b33c48db7df8b81f21d1e9e06b3676b9a9373ae, …Blocklist + sweep developer workstations, CI artifacts, and cargo registry caches (~/.cargo/registry)

How SOC teams should operationalize:

  • Ingest both pulses via the OTX DirectConnect API / OTX pulses feed into your TIP (ThreatQ, OpenCTI, MISP) and push to EDR (Defender, CrowdStrike, SentinelOne) custom indicator lists with block action.
  • MD5s from the TrueConf pulse should be swept specifically against TrueConf server hosts — check the client installer distribution directories for replaced/tampered binaries (compare against vendor-published hashes).
  • Hash-sweep build infrastructure: cargo caches, build container images, artifact repositories. A poisoned crate build leaves compiled artifacts derived from the malicious payloads.
  • Tooling to decode/pivot: MISP/OpenCTI for structured ingestion; VirusTotal Enterprise and Hybrid-Analysis for hash detonation and behavior enrichment; Shodan/Censys for pivoting on 194.87.239.71 to find sibling C2; urlscan.io for the Hostwinds hostname infrastructure.

Detection Engineering

YAML
---
title: Suspicious Child Process from Rust Build Toolchain - Supply Chain Compile-Time Execution
id: 9f2a1c44-7b3d-4e5a-8c1f-a2b3c4d5e6f7
status: experimental
description: Detects cargo/rustc build processes spawning shell or download utilities, consistent with the malicious proc-macro1 build.rs fetching and executing a remote payload at compile time (STARDUST CHOLLIMA crates.io campaign).
author: Security Arsenal Threat Intelligence
references:
  - https://www.wiz.io/blog/rust-supply-chain-attack-on-arrayref-significant-overlap-with-dprk-campaigns
date: 2026/08/22
tags:
  - attack.initial_access
  - attack.t1195.002
  - attack.execution
  - attack.t1059
logsource:
  category: process_creation
  product: windows
detection:
  selection_parent:
    ParentImage|endswith:
      - '\cargo.exe'
      - '\rustc.exe'
  selection_child:
    Image|endswith:
      - '\powershell.exe'
      - '\pwsh.exe'
      - '\cmd.exe'
      - '\curl.exe'
      - '\wget.exe'
      - '\certutil.exe'
      - '\mshta.exe'
      - '\rundll32.exe'
  filter_cargo_bin:
    Image|endswith: '\cargo.exe'
  condition: selection_parent and selection_child and not filter_cargo_bin
falsepositives:
  - Legitimate build scripts compiling native C dependencies may invoke compilers; shells and download utilities are rare and warrant review
level: high
---
title: TrueConf Server Process Spawning Shell or Web Server Script - Web Shell Deployment
id: 3b7c8d9e-2f4a-4b6c-9d1e-5f6a7b8c9d0e
status: experimental
description: Detects TrueConf server processes spawning command interpreters or scripting engines, indicating post-exploitation web shell deployment or installer replacement by Head Mare APT operators.
author: Security Arsenal Threat Intelligence
references:
  - https://ics-cert.kaspersky.com/publications/reports/2026/08/12/head-mare-exploits-vulnerabilities-in-trueconf-server-to-deliver-phantomcore-malware
date: 2026/08/22
tags:
  - attack.persistence
  - attack.t1505.003
  - attack.execution
  - attack.t1059
logsource:
  category: process_creation
  product: windows
detection:
  selection_parent:
    ParentImage|contains:
      - 'trueconf'
  selection_child:
    Image|endswith:
      - '\cmd.exe'
      - '\powershell.exe'
      - '\pwsh.exe'
      - '\wscript.exe'
      - '\cscript.exe'
      - '\mshta.exe'
      - '\bitsadmin.exe'
      - '\certutil.exe'
  condition: selection_parent and selection_child
falsepositives:
  - Rare; TrueConf server processes should not spawn interactive shells in normal operation
level: critical
---
title: Network Connection to PhantomCore or proc-macro1 Backdoor C2 Infrastructure
id: 5e6f7a8b-1c2d-4e5f-a6b7-c8d9e0f1a2b3
status: experimental
description: Detects outbound connections to known PhantomCore C2 IPv4 and proc-macro1 backdoor C2 hostname from OTX pulses dated 2026-08-21.
author: Security Arsenal Threat Intelligence
date: 2026/08/22
tags:
  - attack.command_and_control
  - attack.t1071.001
logsource:
  category: network_connection
  product: windows
detection:
  selection_ip:
    DestinationIp:
      - '194.87.239.71'
  selection_dns:
    DestinationHostname|contains:
      - 'hwsrv-798836.hostwindsdns.com'
  condition: selection_ip or selection_dns
falsepositives:
  - None expected for these dedicated C2 indicators
level: critical
KQL — Microsoft Sentinel / Defender
// Security Arsenal - Head Mare / STARDUST CHOLLIMA Supply Chain Hunt
// Hunts C2 connections, compile-time payload execution, and TrueConf exploitation artifacts
let Lookback = 14d;
let C2_IPs = dynamic(["194.87.239.71"]);
let C2_Hosts = dynamic(["hwsrv-798836.hostwindsdns.com"]);
let BadHashes = dynamic([
  "0e4541c3153ec5ed01497f19cf4f63d0",
  "0e79996d9483d1e44fea32b0a48c2c19",
  "129462164a7d52e9ea8560b60f0412c5",
  "12d4e8f5295f2ef7e0f9bfc0f4830939",
  "2bb75c20e778eb5c416965bd4d4259b1",
  "43f435c3c437bc879a2d7d4634f43494",
  "489f43be558b2679284ceabed7adc4f3",
  "25ad700976873c76af785cb99b33c48db7df8b81f21d1e9e06b3676b9a9373ae",
  "61198155da51b838772eecf5bfaac6cbc4dcc388dccc56658fc28a8e831b34d4",
  "b5c1b5b0763a8809a644a8f92224653f0aca623a98eecc714d27f74b80fbe436",
  "f22e3e01e38bcdf001f0d15a2dbfdec5a1cf8eff",
  "f4767ad92cb61401fd69139cade563501c39b991",
  "fc0fdb978eac72f4484b48db058e4473f1bc516e",
  "ff7e20cf642346bf893f1eca808df82035bb53d0"]);
union isfuzzy=true
  // C2 network connections
  (DeviceNetworkEvents
  | where TimeGenerated > ago(Lookback)
  | where RemoteIP in~ (C2_IPs) or RemoteUrl has_any (C2_Hosts)
  | project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteIP, RemoteUrl, RemotePort, ActionType
  | extend Hunt = "C2 Connection"),
  // cargo/rustc spawning shells or downloaders (proc-macro1 compile-time execution)
  (DeviceProcessEvents
  | where TimeGenerated > ago(Lookback)
  | where InitiatingProcessFileName in~ ("cargo.exe", "rustc.exe", "cargo", "rustc")
  | where FileName in~ ("powershell.exe", "pwsh.exe", "cmd.exe", "curl.exe", "wget.exe", "certutil.exe", "sh", "bash")
  | project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, FileName, ProcessCommandLine, SHA256, MD5
  | extend Hunt = "Compile-Time Payload Execution"),
  // TrueConf server spawning shells (web shell / installer replacement)
  (DeviceProcessEvents
  | where TimeGenerated > ago(Lookback)
  | where InitiatingProcessCommandLine has "trueconf" or InitiatingProcessFileName has "trueconf"
  | where FileName in~ ("cmd.exe", "powershell.exe", "pwsh.exe", "wscript.exe", "mshta.exe", "bitsadmin.exe")
  | project TimeGenerated, DeviceName, InitiatingProcessFileName, FileName, ProcessCommandLine, SHA256, MD5
  | extend Hunt = "TrueConf Post-Exploitation"),
  // Hash hits on endpoints
  (DeviceFileEvents
  | where TimeGenerated > ago(Lookback)
  | where MD5 in~ (BadHashes) or SHA256 in~ (BadHashes) or SHA1 in~ (BadHashes)
  | project TimeGenerated, DeviceName, FolderPath, FileName, MD5, SHA256, SHA1, ActionType
  | extend Hunt = "IOC Hash Match")
| sort by TimeGenerated desc
PowerShell
# Security Arsenal - Supply Chain Compromise Hunt
# Head Mare (TrueConf/PhantomCore) + STARDUST CHOLLIMA (proc-macro1) IOC Sweep
# Run elevated on endpoints, build servers, and TrueConf hosts. Read-only.

$ErrorActionPreference = 'SilentlyContinue'
$findings = @()

$C2IPs    = @('194.87.239.71')
$C2Hosts  = @('hwsrv-798836.hostwindsdns.com')
$BadMD5   = @('0e4541c3153ec5ed01497f19cf4f63d0','0e79996d9483d1e44fea32b0a48c2c19',
              '129462164a7d52e9ea8560b60f0412c5','12d4e8f5295f2ef7e0f9bfc0f4830939',
              '2bb75c20e778eb5c416965bd4d4259b1','43f435c3c437bc879a2d7d4634f43494',
              '489f43be558b2679284ceabed7adc4f3')
$BadSHA1  = @('f22e3e01e38bcdf001f0d15a2dbfdec5a1cf8eff','f4767ad92cb61401fd69139cade563501c39b991',
              'fc0fdb978eac72f4484b48db058e4473f1bc516e','ff7e20cf642346bf893f1eca808df82035bb53d0')
$BadSHA256= @('25ad700976873c76af785cb99b33c48db7df8b81f21d1e9e06b3676b9a9373ae',
              '61198155da51b838772eecf5bfaac6cbc4dcc388dccc56658fc28a8e831b34d4',
              'b5c1b5b0763a8809a644a8f92224653f0aca623a98eecc714d27f74b80fbe436')

Write-Host '[*] Checking active/historical network connections to C2...'
$conns = Get-NetTCPConnection | Where-Object { $C2IPs -contains $_.RemoteAddress }
foreach ($c in $conns) {
    $p = Get-Process -Id $c.OwningProcess
    $findings += [pscustomobject]@{Type='C2-Connection'; Detail="$($p.ProcessName) (PID $($c.OwningProcess)) -> $($c.RemoteAddress):$($c.RemotePort) [$($c.State)]"}
}

Write-Host '[*] Checking DNS cache for C2 hostname...'
$dns = Get-DnsClientCache | Where-Object { $n = $_.Entry; ($C2Hosts | Where-Object { $n -like "*$_*" }) }
foreach ($d in $dns) { $findings += [pscustomobject]@{Type='C2-DNSCache'; Detail="$($d.Entry) -> $($d.Data)"} }

Write-Host '[*] Scanning Cargo caches and project lockfiles for proc-macro1 / poisoned crate versions...'
$cargoPaths = @("$env:USERPROFILE\.cargo\registry", "$env:USERPROFILE\.cargo\git")
foreach ($base in $cargoPaths) {
    if (Test-Path $base) {
        Get-ChildItem -Path $base -Recurse -Directory -Filter 'proc-macro1*' | ForEach-Object {
            $findings += [pscustomobject]@{Type='Malicious-Crate'; Detail="proc-macro1 found: $($_.FullName)"}
        }
    }
}
Get-ChildItem -Path "$env:USERPROFILE" -Recurse -Filter 'Cargo.lock' -Depth 6 | ForEach-Object {
    $content = Get-Content $_.FullName -Raw
    if ($content -match 'proc-macro1' -or
        $content -match 'name = "arrayref"[\s\S]{0,80}version = "0\.3\.10"' -or
        $content -match 'name = "internment"[\s\S]{0,80}version = "0\.8\.7"' -or
        $content -match 'name = "append-only-vec"[\s\S]{0,80}version = "0\.1\.9"') {
        $findings += [pscustomobject]@{Type='Poisoned-Dependency'; Detail="$($_.FullName) references malicious crate version"}
    }
}

Write-Host '[*] Hash-sweeping TrueConf install directories and common staging paths...'
$scanPaths = @('C:\Program Files\TrueConf', 'C:\Program Files (x86)\TrueConf', "$env:TEMP", "$env:APPDATA\TrueConf")
foreach ($sp in $scanPaths) {
    if (Test-Path $sp) {
        Get-ChildItem -Path $sp -Recurse -File | ForEach-Object {
            $h = Get-FileHash $_.FullName -Algorithm MD5
            if ($BadMD5 -contains $h.Hash.ToLower()) {
                $findings += [pscustomobject]@{Type='IOC-MD5-Match'; Detail="$($_.FullName) [$($h.Hash)]"}
            }
        }
    }
}

Write-Host '[*] Checking persistence locations (Run keys, scheduled tasks)...'
$runKeys = @('HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run',
             'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run')
foreach ($rk in $runKeys) {
    (Get-ItemProperty $rk).PSObject.Properties | Where-Object {
        $_.Value -match 'cargo|rustc|proc-macro|trueconf|hostwindsdns|194\.87\.239' } | ForEach-Object {
        $findings += [pscustomobject]@{Type='Persistence-RunKey'; Detail="$rk :: $($_.Name) = $($_.Value)"}
    }
}
Get-ScheduledTask | Where-Object { ($_.Actions.Execute + ($_.Actions.Arguments -join ' ')) -match 'cargo|proc-macro|hostwindsdns|trueconf.*\.ps1' } | ForEach-Object {
    $findings += [pscustomobject]@{Type='Persistence-Task'; Detail="$($_.TaskName): $($_.Actions.Execute) $($_.Actions.Arguments)"}
}

Write-Host "`n[+] Hunt complete. $($findings.Count) finding(s)."
$findings | Format-Table -AutoSize | Out-String -Width 300 | Write-Host
$findings | Export-Csv -Path ".\supplychain_hunt_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv" -NoTypeInformation

Response Priorities

Immediate (0–4 hours)

  • Block 194.87.239.71 and hwsrv-798836.hostwindsdns.com at egress firewall, proxy, and DNS resolver layers; push all 45 MD5 hashes and 7 SHA1/SHA256 hashes to EDR custom indicator blocklists.
  • Audit crates.io dependencies immediately: grep all repositories and Cargo.lock files for proc-macro1, arrayref@0.3.10, internment@0.8.7, and append-only-vec@0.1.9. Quarantine any build that pulled these versions; treat the build host and its output artifacts as compromised.
  • Run the KQL hunt and PowerShell sweep against developer workstations, CI/CD runners, and any host running TrueConf server.
  • If TrueConf is deployed: verify server patch level, compare hosted client installer hashes against vendor-published values, and check web directories for unauthorized scripts (web shells).

24 Hours

  • Credential exposure assessment: both campaigns backdoor endpoints with high-value secrets. Developer machines hold SSH keys, cloud tokens, signing keys, and crypto wallets — DPRK's primary objective. TrueConf conference participants (often executives/partners) may have had session credentials harvested. Force rotation of credentials, tokens, and SSH keys on any host that built a poisoned crate or installed a trojanized TrueConf client.
  • Retro-hunt 90 days of DNS, proxy, and NetFlow telemetry for C2 indicators; build hosts beaconing over HTTPS may have been low-and-slow.
  • Review artifact repositories for binaries built during the exposure window — downstream software releases may carry the implant.

1 Week

  • Dependency supply-chain hardening: enforce lockfile verification, use a private crates proxy/registry mirror with allowlisting, pin and vendor dependencies, and gate CI builds on dependency-diff review (new transitive deps require approval).
  • TrueConf architecture: patch or isolate TrueConf servers; restrict server-to-endpoint installer distribution to a validated internal repo; monitor conferencing infrastructure with the Sigma rules above.
  • Egress controls: deny direct internet egress from build runners; force builds through an inspected proxy so compile-time downloads are visible and blockable.
  • Adopt OTX pulse feed automation (DirectConnect → TIP → EDR/SIEM) so indicator operationalization is measured in minutes, not days.

This briefing synthesizes two TLP:WHITE OTX pulses submitted by AlienVault referencing Kaspersky ICS CERT and Wiz research. Both campaigns are active; treat detection deployment as urgent.

Related Resources

Security Arsenal Incident Response Managed SOC & MDR Services AlertMonitor Threat Detection From The Dark Side Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.