Threat Summary
A single but high-signal OTX pulse published by AlienVault documents NadMesh, an industrial-grade, Go-based botnet first observed in July 2026 that represents a meaningful escalation in autonomous threat tooling. Unlike traditional botnets that rely on operator-driven campaigns, NadMesh integrates scanning, exploitation, and intelligence harvesting into a single self-contained platform — effectively productizing the entire intrusion lifecycle.
The campaign targets AI service infrastructure and cloud environments across more than 90 cloud provider address ranges. Its exploitation surface is broad and deliberate: Redis, Docker, Kubernetes, MCP (Model Context Protocol) servers, and adjacent cloud services, chained through 20+ distinct exploitation vectors. The botnet conducts autonomous scanning (correlated with Shodan-style internet intelligence), identifies exposed or misconfigured services, exploits them, and then pivots to its true objective: credential harvesting from cloud control planes, container registries, orchestration APIs, and AI pipeline secrets.
The strategic implication is clear: as enterprises rush AI workloads into production — often with permissive service accounts, exposed MCP endpoints, and over-privileged Kubernetes secrets — NadMesh is purpose-built to industrialize the theft of exactly those credentials. Harvested cloud keys, kubeconfigs, and AI service tokens are precisely the commodity that fuels dark web access-broker markets.
Threat Actor / Malware Profile
Family: NadMesh (Go-based botnet) | Attribution: Unknown | TLP: White
Distribution / Initial Access: NadMesh does not rely on phishing. It propagates through autonomous internet-wide scanning of cloud provider netblocks, fingerprinting exposed Redis instances, Docker remote API daemons (port 2375/2376), Kubernetes API servers (6443/10250), etcd, and MCP server endpoints. It weaponizes known vulnerabilities — the pulse includes CVE-2016-0638 (Oracle WebLogic Java deserialization) among its exploitation vectors — alongside misconfiguration abuse such as unauthenticated Redis writes and anonymous Docker API access.
Payload Behavior: Once a service is compromised, NadMesh drops a statically compiled Go binary (SHA256: fc4109f5dd1d30b65dd60e57dc639ac1d313bfa5241e36e61fbc4aabc1cda482), harvests environment variables, cloud metadata service credentials (IMDS at 169.254.169.254), Kubernetes service account tokens (/var/run/secrets/kubernetes.io/serviceaccount/), and container secrets, then expands laterally using the stolen material.
C2 Communication: The botnet communicates with infrastructure behind the domain cdnorigin.net, masquerading as legitimate CDN traffic — a common technique to blend beaconing into allowed egress categories.
Persistence: On containerized hosts, NadMesh establishes persistence via cron entries, systemd service units, and Kubernetes DaemonSet/CronJob abuse, allowing reinfection even after individual pod remediation.
Anti-Analysis: The malware is polymorphic (per pulse tags), recompiling or mutating payload artifacts per deployment to defeat static hash detection — which is why behavioral detection on scanning, exploitation, and credential-access patterns is critical in addition to IOC matching.
IOC Analysis
The pulse provides five indicators across three types:
| Type | Indicator | Operationalization |
|---|---|---|
| CVE | CVE-2016-0638 | Map to asset inventory — any exposed WebLogic is a candidate entry vector. Feed into vulnerability prioritization. |
| Domain | cdnorigin.net | Block at DNS sinkhole / secure web gateway / egress firewall. Alert on any resolution in proxy and DNS logs. |
| MD5 | ca024acead8f54cfe5b07ac4bdf7fcea | Hash-block in EDR; low standalone value due to polymorphism. |
| SHA1 | 31c69b3e12936abca770d430066f379ec1d997ec | EDR blocklist + retro-hunt in file event telemetry. |
| SHA256 | fc4109f5dd1d30b65dd60e57dc639ac1d313bfa5241e36e61fbc4aabc1cda482 | Primary hash for EDR blocking and retro-hunts across process and file-creation events. |
SOC guidance: Because NadMesh is polymorphic, hashes have a short shelf life — treat them as retro-hunt seeds, not durable blocks. The durable detections are behavioral: outbound scanning from servers, access to cloud metadata endpoints from unusual processes, reads of Kubernetes service account tokens, and egress to cdnorigin.net. Tooling that operationalizes this pulse: EDR hash/IoA engines, Zeek/Suricata for C2 egress, Falco for container runtime detection, and Sigma/KQL correlation in your SIEM.
Detection Engineering
---
title: NadMesh Botnet - Kubernetes Service Account Token Access by Non-System Process
description: Detects reads of Kubernetes service account token material by processes outside expected system daemons, consistent with NadMesh credential harvesting behavior (OTX pulse 2026-08-16).
status: experimental
date: 2026/08/16
author: Security Arsenal Threat Intelligence
logsource:
category: file_access
product: linux
detection:
selection_path:
TargetFilename|contains: '/var/run/secrets/kubernetes.io/serviceaccount/'
filter_legit:
Image|startswith:
- '/usr/bin/kubelet'
- '/usr/local/bin/kube-proxy'
condition: selection_path and not filter_legit
falsepositives:
- Legitimate in-pod applications reading their own projected tokens
level: high
tags:
- attack.credential_access
- attack.t1552
- nadmesh
---
title: NadMesh Botnet - Cloud Instance Metadata Service Access via Curl or Wget
description: Detects command-line HTTP clients querying the cloud metadata service, a technique NadMesh uses to harvest IAM/instance credentials after exploitation.
status: experimental
date: 2026/08/16
author: Security Arsenal Threat Intelligence
logsource:
category: process_creation
product: linux
detection:
selection_img:
Image|endswith:
- '/curl'
- '/wget'
selection_cli:
CommandLine|contains: '169.254.169.254'
condition: all of selection_*
falsepositives:
- Cloud-init and provisioning scripts during instance bootstrap
- SRE diagnostics
level: medium
tags:
- attack.credential_access
- attack.t1552.005
- nadmesh
---
title: NadMesh Botnet - Outbound Connection to Known C2 Domain
description: Detects network connections to the NadMesh C2 domain cdnorigin.net, which masquerades as CDN traffic.
status: experimental
date: 2026/08/16
author: Security Arsenal Threat Intelligence
logsource:
category: dns
product: any
detection:
selection:
query|contains: 'cdnorigin.net'
condition: selection
falsepositives:
- None expected; domain is associated with botnet C2
level: critical
tags:
- attack.command_and_control
- attack.t1071
- nadmesh
// NadMesh Botnet Hunt — C2 egress, hash execution, and metadata-service credential access
// Microsoft Sentinel / Defender XDR — OTX Pulse 2026-08-16
let NadMeshHashes = dynamic([
"ca024acead8f54cfe5b07ac4bdf7fcea",
"31c69b3e12936abca770d430066f379ec1d997ec",
"fc4109f5dd1d30b65dd60e57dc639ac1d313bfa5241e36e61fbc4aabc1cda482"
]);
union isfuzzy=true
(
DeviceNetworkEvents
| where TimeGenerated > ago(7d)
| where RemoteUrl has "cdnorigin.net"
| project TimeGenerated, DeviceName, InitiatingProcessFileName, RemoteUrl, RemoteIP, ActionType, SignalSource = "C2_Egress"
),
(
DeviceProcessEvents
| where TimeGenerated > ago(7d)
| where MD5 in~ (NadMeshHashes) or SHA1 in~ (NadMeshHashes) or SHA256 in~ (NadMeshHashes)
| project TimeGenerated, DeviceName, FileName, ProcessCommandLine, SHA256, InitiatingProcessAccountName, SignalSource = "Hash_Match"
),
(
DeviceProcessEvents
| where TimeGenerated > ago(7d)
| where ProcessCommandLine has "169.254.169.254"
and FileName in~ ("curl", "wget", "curl.exe", "wget.exe")
| project TimeGenerated, DeviceName, FileName, ProcessCommandLine, InitiatingProcessAccountName, SignalSource = "IMDS_Access"
)
| sort by TimeGenerated desc
# NadMesh Botnet IOC & Persistence Hunt — Security Arsenal
# Run elevated on suspect Linux-adjacent Windows hosts via WSL/SSH or adapt for fleet EDR sweep
$ErrorActionPreference = 'SilentlyContinue'
$report = @()
# 1. Hash-based file hunt (NadMesh payload artifacts)
$hashes = @(
'ca024acead8f54cfe5b07ac4bdf7fcea',
'31c69b3e12936abca770d430066f379ec1d997ec',
'fc4109f5dd1d30b65dd60e57dc639ac1d313bfa5241e36e61fbc4aabc1cda482'
)
Get-ChildItem -Path 'C:\','D:\' -Recurse -File -Force | ForEach-Object {
$h = Get-FileHash $_.FullName -Algorithm SHA256
if ($hashes -contains $h.Hash.ToLower()) {
$report += "[HASH MATCH] $($_.FullName) SHA256=$($h.Hash)"
}
}
# 2. Network connections / DNS cache check for C2 domain
$dns = Get-DnsClientCache | Where-Object { $_.Entry -like '*cdnorigin.net*' }
if ($dns) { $report += "[C2 DNS] cdnorigin.net resolved on this host: $($dns | Out-String)" }
$conns = Get-NetTCPConnection | Where-Object { $_.State -eq 'Established' } | ForEach-Object {
$proc = Get-Process -Id $_.OwningProcess
if ($proc.ProcessName -notin @('chrome','msedge','firefox','svchost','System')) {
$report += "[NET] PID $($_.OwningProcess) $($proc.ProcessName) -> $($_.RemoteAddress):$($_.RemotePort)"
}
}
# 3. Persistence artifacts — scheduled tasks & services with suspicious Go-binary traits
Get-ScheduledTask | Where-Object {
$_.Actions.Execute -match 'tmp|appdata|programdata' -and $_.TaskPath -notlike '\Microsoft*'
} | ForEach-Object { $report += "[TASK] $($_.TaskName) -> $($_.Actions.Execute)" }
Get-CimInstance Win32_Service | Where-Object {
$_.PathName -match 'tmp|appdata|programdata' -and $_.State -eq 'Running'
} | ForEach-Object { $report += "[SERVICE] $($_.Name) -> $($_.PathName)" }
# 4. Kubernetes / cloud credential artifacts on disk
$kPaths = @("$env:USERPROFILE\.kube\config", "$env:USERPROFILE\.docker\config.json", "$env:USERPROFILE\.aws\credentials")
foreach ($p in $kPaths) {
if (Test-Path $p) { $report += "[CRED AT RISK] $p exists — rotate if host shows other hits" }
}
$report | Out-File "NadMesh_Hunt_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt"
$report | Format-List
Response Priorities
Immediate (0–4 hours):
- Block
cdnorigin.netat DNS resolver, secure web gateway, and egress firewall; alert on any historical resolution. - Push the three file hashes to EDR blocklists; run retro-hunts for execution in the last 30 days.
- Audit external exposure: identify any internet-facing Redis, Docker API (2375/2376), Kubernetes API (6443), etcd, or MCP endpoints and take them offline or behind authentication immediately.
Within 24 hours:
- Treat any host that touched the C2 domain or ran a matching hash as fully credential-compromised: rotate cloud IAM keys, kubeconfigs, container registry tokens, AI service API keys, and any secrets stored in environment variables on that host.
- Review cloud audit logs (CloudTrail / Azure Activity Log / GCP Audit) for use of those credentials from unexpected source IPs.
- Invalidate active sessions and enforce re-authentication for identities tied to affected workloads.
Within 1 week:
- Harden architecture: enforce authenticated-only access on Redis/Docker/Kubernetes control planes, disable IMDSv1 (require IMDSv2), and apply network policies restricting pod egress.
- Deploy runtime detection (Falco/eBPF) in Kubernetes clusters to catch token reads and anomalous outbound scanning.
- Patch or isolate any WebLogic instances vulnerable to CVE-2016-0638, and implement egress filtering that denies cloud netblock-to-netblock scanning.
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.