TLP: WHITE | Intelligence Category: Infostealer & Credential Theft Campaigns
Threat Summary
AlienVault OTX pulse data reveals a coordinated supply-chain campaign in which thirteen malicious Composer theme packages were published to Packagist across five distinct vendor namespaces. These packages were engineered to be embedded into Vietnamese movie and comic streaming sites — a watering-hole delivery model that converts legitimate web properties into malware distribution infrastructure without touching the victim's device directly.
Once installed, the packages inject JavaScript that executes a dual-track payload:
- Track A (all mobile devices): An ad-fraud and gambling redirect chain monetizing traffic through affiliate fraud networks.
- Track B (iOS devices only): A full WebKit-to-kernel exploit chain weaponizing CVE-2025-31277 (WebKit renderer compromise) and CVE-2025-43529 (kernel privilege escalation), with CVE-2026-43655 also tagged in the indicator set. Successful exploitation installs persistent spyware capable of harvesting cryptocurrency wallet seed phrases — the crown jewels of self-custodied digital assets.
The infrastructure fingerprint overlaps with FunNULL, a hosting/CDN ecosystem repeatedly linked to Chinese-nexus gambling, scam, and malware distribution operations. The objective is unambiguous: mass credential and crypto-asset theft at watering-hole scale, laundering collection through streaming piracy traffic that naturally attracts a mobile-heavy Vietnamese and regional audience.
This is not opportunistic skimming. A working WebKit-to-kernel chain represents nation-state-grade or high-tier commercial exploit capability being deployed for financially motivated credential theft.
Threat Actor / Malware Profile
Attribution: Unknown actor; infrastructure overlaps with the FunNULL hosting network (funnull01.vip), historically associated with scam/gambling infrastructure and bulletproof hosting resale.
Distribution Method:
- Malicious Composer packages on Packagist (PHP dependency ecosystem) disguised as theme packages across five vendor namespaces
- Typosquatting / namespace abuse targeting developers of Vietnamese streaming sites (phim/comic piracy niche)
- Injected JavaScript executes in the browser context of every site visitor — no user interaction required beyond page load
Payload Behavior:
- Device fingerprinting to route iPhones into the exploit track; other devices get the ad-fraud redirect chain
- CVE-2025-31277: WebKit renderer remote code execution via malicious JavaScript/Safari rendering
- CVE-2025-43529: Kernel-level privilege escalation escaping the WebKit sandbox
- Post-exploitation implant harvests: crypto wallet seed phrases (targeting wallet apps, clipboard contents, and photo library seed-phrase screenshots), Keychain credentials, and session tokens
C2 Communication:
- HTTP-based beaconing to bare-IP infrastructure (e.g.,
http://23.225.52.67:4466/vip344.html— non-standard port 4466, path pattern/vip*.htmlconsistent with FunNULL redirect kits) - Supporting ad-fraud/exfil domains:
cre-ads.com,im.ue8im.com,funnull01.vip
Persistence Mechanism:
- Server-side: malicious code persists in the Composer package itself — every
composer install/updatere-injects the payload; removal requires dependency audit, not webroot cleanup - Client-side (iOS): kernel-level access permits implant persistence surviving app reinstalls; full device reboot may not clear kernel-resident components
Anti-Analysis Techniques:
- Conditional execution: exploit chain only fires on genuine iOS Safari user agents with vulnerable WebKit builds; sandboxes and scanners receive benign ad content
- Obfuscated JavaScript staged across multiple domains
- DGA-style subdomain rotation under FunNULL-controlled TLDs (.vip)
IOC Analysis
The pulse contains 34 indicators across three types:
| Type | Examples | Operationalization |
|---|---|---|
| Domains | xemphimlau.com, funnull01.vip, cre-ads.com | DNS sinkhole/block at resolver; add to proxy blocklist; alert on any resolution |
| Hostnames | im.ue8im.com | TLS SNI inspection; proxy category override; retro-hunt DNS logs 90 days |
| URLs | http://23.225.52.67:4466/vip344.html | Block bare-IP HTTP on non-standard ports; regex hunt for /vip\d+\.html patterns in proxy logs |
| CVEs | CVE-2025-31277, CVE-2025-43529, CVE-2026-43655 | Feed into mobile device management (MDM) compliance policies; enforce iOS patch levels |
SOC Guidance:
- Bare-IP HTTP destinations on ports >1024 are high-fidelity anomalies in most enterprise environments — tune alert logic around this pattern even beyond the listed IP
- Pivot on the
/vipNNN.htmlURI pattern; FunNULL kits reuse path conventions across infrastructure rotations - Query your dependency artifact repository (Artifactory/Nexus) for any cached Packagist packages from the five flagged vendor namespaces
- Tooling: decode injected JS with jsbeautifier/de4js; detonate package archives in Socket.dev, Packj, or OSSF Scorecard-based pipelines; validate domain reputation via OTX, VirusTotal, and urlscan.io
Detection Engineering
---
title: Outbound Connection to FunNULL-Linked Crypto Theft Infrastructure
id: 7a3f1c2e-91b4-4d2a-8e5f-20260901a001
status: experimental
description: Detects DNS resolution or network connections to known FunNULL-linked domains and bare-IP C2 used by the Packagist iOS spyware campaign for crypto seed exfiltration.
author: Security Arsenal Threat Intel
date: 2026/09/01
references:
- https://socket.dev/blog/packagist-themes-ios-spyware
logsource:
category: dns
product: windows
detection:
selection_domain:
QueryName|contains:
- 'funnull01.vip'
- 'xemphimlau.com'
- 'cre-ads.com'
- 'ue8im.com'
condition: selection_domain
falsepositives:
- Threat intelligence validation scans
level: high
tags:
- attack.command_and_control
- attack.t1071.001
---
title: Bare IP HTTP Connection on Non-Standard Port - FunNULL Redirect Kit Pattern
id: 7a3f1c2e-91b4-4d2a-8e5f-20260901a002
status: experimental
description: Detects HTTP connections to bare IPv4 addresses on non-standard high ports with /vip*.html URI patterns consistent with FunNULL redirect and C2 kits observed in the Packagist spyware campaign.
author: Security Arsenal Threat Intel
date: 2026/09/01
references:
- https://socket.dev/blog/packagist-themes-ios-spyware
logsource:
category: proxy
product: webserver
detection:
selection_ip:
c-ip|re: '^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'
selection_port:
cs-port:
- '4466'
- '8443'
- '9443'
selection_uri:
cs-uri-stem|re: '\/vip\d+\.html'
filter_known:
c-ip:
- '127.0.0.1'
condition: selection_ip and selection_port and selection_uri and not filter_known
falsepositives:
- Internal load balancer health checks using bare IPs
level: high
tags:
- attack.command_and_control
- attack.t1071.001
- attack.t1571
---
title: Composer Install of Suspicious Packagist Theme Package
id: 7a3f1c2e-91b4-4d2a-8e5f-20260901a003
status: experimental
description: Detects composer install/require executions pulling theme packages from suspicious vendor namespaces, indicating potential supply-chain compromise of web properties via malicious Packagist packages.
author: Security Arsenal Threat Intel
date: 2026/09/01
references:
- https://socket.dev/blog/packagist-themes-ios-spyware
logsource:
category: process_creation
product: linux
detection:
selection_img:
Image|endswith:
- '/composer'
- '/composer.phar'
selection_cmd:
CommandLine|contains:
- 'install'
- 'require'
- 'update'
selection_pkg:
CommandLine|contains:
- 'theme'
condition: selection_img and selection_cmd and selection_pkg
falsepositives:
- Legitimate theme package installations by web developers - validate package names against the published IOC namespace list
level: medium
tags:
- attack.initial_access
- attack.t1195.001
- attack.t1195.002
// Sentinel Hunt: FunNULL-linked Packagist iOS Spyware C2 + Redirect Chain
// Hunts network connections and DNS to campaign IOCs, plus bare-IP high-port beaconing
let CampaignIOCs = dynamic(["funnull01.vip","xemphimlau.com","cre-ads.com","im.ue8im.com","ue8im.com"]);
let C2IP = "23.225.52.67";
let Lookback = 14d;
let DnsHits = DeviceNetworkEvents
| where Timestamp > ago(Lookback)
| where RemoteUrl has_any (CampaignIOCs) or RemoteIP == C2IP
| project Timestamp, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName,
RemoteUrl, RemoteIP, RemotePort, ActionType
| extend Detection = "IOC Match";
let BareIPBeacon = DeviceNetworkEvents
| where Timestamp > ago(Lookback)
| where RemotePort in (4466, 8443, 9443)
| where isempty(RemoteUrl) // bare IP, no hostname
| where ActionType == "ConnectionSuccess"
| project Timestamp, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName,
RemoteUrl, RemoteIP, RemotePort, ActionType
| extend Detection = "Bare-IP High-Port Beacon";
let ComposerPull = DeviceProcessEvents
| where Timestamp > ago(Lookback)
| where FileName =~ "composer" or FileName =~ "composer.phar"
| where ProcessCommandLine has_any ("install", "require", "update")
and ProcessCommandLine has "theme"
| project Timestamp, DeviceName, AccountName, FileName, ProcessCommandLine, InitiatingProcessFileName
| extend Detection = "Suspicious Composer Theme Install", RemoteUrl = "", RemoteIP = "", RemotePort = 0, ActionType = "", InitiatingProcessAccountName = AccountName;
union DnsHits, BareIPBeacon, ComposerPull
| sort by Timestamp desc
<#
.SYNOPSIS
Security Arsenal IOC Hunt - Packagist iOS Spyware / FunNULL Campaign
.DESCRIPTION
Checks Windows endpoints and build servers for:
1. DNS cache entries for FunNULL-linked domains
2. Active/historical TCP connections to C2 IP 23.225.52.67 or port 4466
3. Malicious Composer packages in composer.json / composer.lock / vendor dirs
4. Web server content referencing injected campaign domains
.NOTES
Run elevated. For fleet-wide sweeps, deploy via SCCM/Intune/EDR Live Response.
#>
$ErrorActionPreference = 'SilentlyContinue'
$Report = @()
$BadDomains = @('funnull01.vip','xemphimlau.com','cre-ads.com','ue8im.com','im.ue8im.com')
$C2IP = '23.225.52.67'
$C2Port = 4466
Write-Host '[*] 1. Checking DNS resolver cache for campaign domains...' -ForegroundColor Cyan
$dnsCache = Get-DnsClientCache
foreach ($d in $BadDomains) {
$hits = $dnsCache | Where-Object { $_.Entry -like "*$d*" }
if ($hits) {
$hits | ForEach-Object {
$Report += [pscustomobject]@{Check='DNS Cache'; Finding=$_.Entry; Detail=$_.Data; Severity='HIGH'}
}
}
}
Write-Host '[*] 2. Checking active TCP connections to C2 infrastructure...' -ForegroundColor Cyan
$conns = Get-NetTCPConnection | Where-Object { $_.RemoteAddress -eq $C2IP -or $_.RemotePort -eq $C2Port }
foreach ($c in $conns) {
$proc = Get-Process -Id $c.OwningProcess
$Report += [pscustomobject]@{Check='Network Connection'; Finding="$($c.LocalAddress):$($c.LocalPort) -> $($c.RemoteAddress):$($c.RemotePort)"; Detail="Process: $($proc.ProcessName) (PID $($c.OwningProcess)) State: $($c.State)"; Severity='CRITICAL'}
}
Write-Host '[*] 3. Scanning for suspicious Composer theme packages...' -ForegroundColor Cyan
$webRoots = @('C:\inetpub','C:\xampp\htdocs','C:\wamp64\www','D:\www','C:\sites')
foreach ($root in $webRoots) {
if (Test-Path $root) {
$manifests = Get-ChildItem -Path $root -Recurse -Include 'composer.json','composer.lock' -ErrorAction SilentlyContinue
foreach ($m in $manifests) {
$content = Get-Content $m.FullName -Raw
foreach ($d in $BadDomains) {
if ($content -match [regex]::Escape($d)) {
$Report += [pscustomobject]@{Check='Composer Manifest'; Finding=$m.FullName; Detail="References campaign domain: $d"; Severity='CRITICAL'}
}
}
if ($content -match '"type"\s*:\s*".*theme') {
$Report += [pscustomobject]@{Check='Composer Manifest'; Finding=$m.FullName; Detail='Theme-type package present - validate vendor namespace against OTX pulse list'; Severity='MEDIUM'}
}
}
# Scan deployed web content for injected campaign JS references
$injected = Get-ChildItem -Path $root -Recurse -Include '*.php','*.html','*.js' -ErrorAction SilentlyContinue |
Select-String -Pattern 'funnull01|cre-ads|ue8im|xemphimlau|vip\d+\.html' -List
foreach ($hit in $injected) {
$Report += [pscustomobject]@{Check='Injected Web Content'; Finding=$hit.Path; Detail="Line $($hit.LineNumber): $($hit.Line.Substring(0,[Math]::Min(120,$hit.Line.Length)))"; Severity='CRITICAL'}
}
}
}
Write-Host '[*] 4. Checking recently modified vendor/ directories (supply-chain footprint)...' -ForegroundColor Cyan
foreach ($root in $webRoots) {
if (Test-Path $root) {
Get-ChildItem -Path $root -Recurse -Directory -Filter 'vendor' -ErrorAction SilentlyContinue | ForEach-Object {
$recent = Get-ChildItem $_.FullName -Recurse -File -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-30) }
if ($recent.Count -gt 0) {
$Report += [pscustomobject]@{Check='Vendor Dir Activity'; Finding=$_.FullName; Detail="$($recent.Count) files modified in last 30 days - review recent composer updates"; Severity='LOW'}
}
}
}
}
Write-Host "`n[=] Hunt complete. $($Report.Count) findings." -ForegroundColor Green
if ($Report.Count -gt 0) {
$Report | Sort-Object Severity | Format-Table -AutoSize -Wrap
$Report | Export-Csv -Path ".\FunNULL_Packagist_Hunt_$(Get-Date -Format 'yyyyMMdd_HHmm').csv" -NoTypeInformation
Write-Host '[!] CRITICAL findings require immediate host isolation and dependency audit.' -ForegroundColor Red
} else {
Write-Host '[+] No indicators found on this host.' -ForegroundColor Green
}
Response Priorities
Immediate (0–4 hours)
- Block all IOC domains and the C2 IP at DNS resolver, web proxy, and egress firewall:
funnull01.vip,xemphimlau.com,cre-ads.com,im.ue8im.com,23.225.52.67:4466 - Audit Composer dependencies across all web properties and build pipelines for the five flagged vendor namespaces; pin and verify package hashes; purge compromised versions from artifact caches (Artifactory/Nexus)
- Hunt web server content for injected JavaScript referencing campaign domains — server-side cleanup without dependency removal will be re-infected on next
composer update - Deploy the Sigma and KQL detections above; retro-hunt proxy/DNS logs for 90 days
24 Hours
- Credential and asset verification: Any user who browsed a compromised streaming site from an iOS device must be treated as having compromised crypto wallet seed phrases and Keychain contents. Force rotation of exchange credentials, revoke active sessions, and migrate funds from any hot wallets whose seeds may have been exposed (wallet apps, clipboard history, photo library screenshots)
- MDM compliance sweep: Identify all iOS devices in the fleet (corporate and BYOD) running WebKit builds vulnerable to CVE-2025-31277 / CVE-2025-43529; enforce emergency OS updates or quarantine
- Enforce FIDO2/hardware-key MFA on crypto exchange and developer accounts — stolen session tokens and passwords are presumed in adversary hands
1 Week
- Supply-chain architecture hardening: Gate all package manager pulls through a curated internal registry with malware scanning (Socket.dev, Packj) and namespace allowlisting; require lockfile review in CI/CD for theme/frontend packages
- Browser isolation or DNS-layer mobile protection for high-risk content categories; block bare-IP HTTP on non-standard ports enterprise-wide
- MDM policy enforcement: automatic iOS update deadlines, exploit-chain CVE compliance gating for network access, and restrictions on wallet seed storage in photos/clipboard on managed devices
- Establish dark web monitoring for dumped credential sets referencing your corporate email domains — Vietnamese-targeted stealer logs frequently surface on Telegram marketplaces within days
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.