Threat · curated 17 Jul 2026
NadMesh Botnet Analysis: A Product-Grade Threat for the AI Service Era
First reported qianxin.com
Coverage timeline
Single-source incident — first reported, latest, and curated coincide.
Why it matters
NadMesh is an active, industrial-grade botnet that deliberately targets fast-deployed, under-firewalled AI services and the MCP ecosystem to steal cloud keys and Kubernetes tokens, showing that exposed AI infrastructure is now a primary autonomous-attack surface.
NadMesh is a Go-based botnet observed in early July 2026 by QiAnXin's XLab that autonomously scans for and exploits exposed AI services — ComfyUI, Ollama, n8n, Open WebUI, Langflow, and Gradio — using a Shodan harvester (ai_harvest.py) to prioritize AI infrastructure and the MCP ecosystem. It folds scanning, 20+ RCE exploitation vectors (Redis, Docker, MCP, Kubernetes), credential/AI-service intelligence harvesting, polymorphic builds, and redundant persistence into a single productized platform; the operator's dashboard claims 3,811 unique AWS keys plus model inventories tagged as cloud services.
Summary
NadMesh is a Go-based botnet observed in early July 2026 that combines autonomous scanning, 20+ exploitation vectors, and targeted harvesting of AI-service and cloud credentials into a single productized platform. QiAnXin's XLab named it after the 'n4d mesh controller' string in its source and published its analysis, which The Hacker News summarized.[0][8]
The operator's objective is not the host itself but the cloud credentials and Kubernetes cluster privileges reachable from it: bots exfiltrate cloud keys from environment variables, k8s service account tokens, and the contents of ~/.aws/config, .env, and ~/.docker/config.json, plus model access and callable MCP tools. The dashboard captured July 10 claims 3,811 unique AWS keys.[0][8]
A Shodan-fed harvester keeps the queue stocked with ComfyUI, Ollama, n8n, Open WebUI, Langflow, and Gradio targets at highest priority, but most observed exploit traffic still lands on exposed Docker APIs and Jenkins consoles. XLab's sensors recorded distinct source IPs rising from near zero in late June to roughly 139 a day in the first week of July.[0][8]
Attack chain
- Intel harvesting: ai_harvest.py uses the Shodan API to find ComfyUI, Ollama, n8n, Open WebUI, Langflow, and Gradio assets and injects them into the scan queue at highest priority (priority=20), the most direct evidence of deliberate AI-infrastructure targeting.[0][8]
- Control: controller_go.go listens on ports 80 and 8443, handling bot registration and beacon callbacks, dispatching CIDR + port scan tasks, collecting deployment results and credential intelligence, and exposing the /panel dashboard.[8]
- Supply / self-feeding scan loop: Four scripts amplify the scan queue: high-yield subnets are resampled more densely every five minutes, dangerous IPs are rescanned as /32s every quarter hour with AI ports first, full sweeps re-prioritize seven-day dangerous hosts, and targets absorbing ten deployment attempts without result are auto-blacklisted as suspected honeypots. If the queue runs dry, bots generate a random /24.[0][8]
- Build: build_agent.sh applies Garble obfuscation, UPX -9 packing, and random padding so every agent carries a distinct hash, defeating signature-based detection.[0][8]
- Delivery / exploitation: Delivery is handled via Docker/MCP/Redis vectors and a binary+watchdog push; observed exploit traffic is dominated by docker_containers_api_rce and jenkins_scripttext_rce, with Telnet, Redis, and patch-based vectors including CVE-2026-39987 (Marimo) and CVE-2026-41176 (rclone).[0][8]
- Persistence and credential theft: On the victim the agent establishes three independent persistence paths (SSH authorized_keys backdoor, hidden binaries in /dev/shm, /var/tmp, /tmp, and cron watchdogs) and exfiltrates cloud keys, Kubernetes tokens, .env contents, and registry logins.[0][8]
Disclosure timeline
| Date | Event |
|---|---|
| Early July 2026 | XLab observed the Go-based NadMesh botnet pushing samples onto the internet at scale.[0][8] |
| Late June to first week of July 2026 | Distinct source IPs pushing NadMesh rose from near zero to around 139 a day per XLab sensors.[0] |
| July 10, 2026 | XLab captured the operator's dashboard figures, including the AWS-key counter.[0] |
| July 17, 2026 (report published Friday) | XLab published its NadMesh analysis; The Hacker News reported on it.[0][8] |
How it works
NadMesh spreads mainly by abusing exposed services and callable admin functionality rather than a single novel flaw: an open Docker API on 2375, a Jenkins script console, unauthenticated Redis, weak Telnet, and SSH passwords, none of which are closed by a patch. MCP tops the priority order via a JSON-RPC tools/call to execute_command, exploiting MCP deployments that skip the optional authorization flow.[0]
The patch-based vectors include CVE-2026-39987, a pre-auth RCE in Marimo notebooks before 0.23.0, and CVE-2026-41176, which lets an unauthenticated caller flip rc.NoAuth on rclone RC servers (1.45.0 to 1.73.5) started without HTTP auth; older entries include CVE-2022-22947 (Spring Cloud Gateway Actuator, only when enabled and exposed unsecured) and CVE-2017-12611 (Struts Freemarker tag flaw).[0][29][30][31][32]
Affected versions and patch status
| Product | Affected | Patch status |
|---|---|---|
| Marimo notebooks | Versions before 0.23.0 (CVE-2026-39987, pre-auth RCE) | Patched in 0.23.0; added to CISA KEV in April after exploitation within hours of disclosure[0][29] |
| rclone RC server | 1.45.0 up to 1.73.5 started without HTTP auth (CVE-2026-41176) | Fixed after 1.73.5; unauthenticated caller can flip rc.NoAuth[0][30] |
| Spring Cloud Gateway | CVE-2022-22947, exploitable only when the Actuator endpoint is enabled and exposed unsecured | Patched; conditional exposure[0][31] |
| Apache Struts | CVE-2017-12611, the Struts Freemarker tag flaw | Patched (legacy)[0][32] |
| Exposed services (no patch closes them) | Docker API on 2375, Jenkins script console, unauthenticated Redis, weak Telnet, SSH passwords, and unauthenticated MCP execute_command tools | No patch; must be placed behind authentication or off the public internet[0] |
Indicators of Compromise
| Type | Indicator | Context |
|---|---|---|
| ip | 209.99.186.235 | XLab-published NadMesh command-and-control server.[0] |
| domain | cdnorigin.net | XLab-published NadMesh C2 domain.[0] |
| file-hash | 31c69b3e12936abca770d430066f379ec1d997ec | SHA1 of one NadMesh agent sample; polymorphic builds mean this hash catches only one build and misses the rest.[0] |
| file-path | /dev/shm/.a, /var/tmp/.a, /tmp/.a | Persistence files dropped by the agent in multiple locations.[0][8] |
| file-path | /etc/cron.d/.sys_monitor, /etc/cron.d/.s | Hidden cron watchdogs used for redundant persistence.[0][8] |
| file-path | ~/.ssh/authorized_keys | SSH public-key backdoor; check for keys nobody remembers adding.[0][8] |
| cve | CVE-2026-39987 | Marimo pre-auth RCE included in NadMesh's exploit chart; on CISA KEV.[0][29] |
| cve | CVE-2026-41176 | rclone RC unauthenticated auth-bypass vector in the exploit chart.[0][30] |
Key takeaways
- NadMesh is a productized, continuously iterated botnet whose payoff is cloud credentials, Kubernetes privileges, and AI-service access rather than the host, reflecting a shift from GPU cryptomining toward what a compromised box can log into.[0][8]
- Signature-based detection is largely defeated: Garble obfuscation, UPX packing, and random padding give every agent a unique hash, so the single published sample hash catches only one build.[0][8]
- AI targeting is real at the intake and in the loot, but most exploit traffic still lands on exposed Docker APIs and Jenkins consoles, so the fastest wins are getting exposed services behind authentication.[0]
Defensive actions
- Place exposed services behind authentication or off the public internet, starting with ports 8188 (ComfyUI), 11434 (Ollama), 7860 (Gradio), and 5678 (n8n).: These are the four ports NadMesh's rescan job prioritizes; no patch closes exposed-service and admin-function abuse.[0]
- Lock down Docker API on 2375, Jenkins script consoles, unauthenticated Redis, weak Telnet, and SSH passwords, and enable authorization on MCP servers.: Most observed exploit traffic targets Docker sockets and Jenkins consoles, and MCP execute_command tools tops the exploitation priority order; none of these are closed by a patch.[0]
- Patch or restrict CVE-2026-39987 (Marimo before 0.23.0) and CVE-2026-41176 (rclone 1.45.0-1.73.5 without HTTP auth), and verify conditions for CVE-2022-22947 and CVE-2017-12611.: These are active vectors in NadMesh's exploit chart; the Marimo flaw was exploited within hours of disclosure and is on CISA KEV.[0][29][30][31][32]
- Hunt for NadMesh drop paths and, if found, isolate the host and revoke every credential it could see before issuing replacements.: Persistence is built to survive single-point removal; revoking (not rotating) and pulling persistence first prevents new keys being harvested like the old ones.[0][8]