ACVE-2026-0420
n4d mesh uses exposed AI services and MCP command loops
Part of campaign: n4d mesh
In the wild
exploited-itw · dfir
Description
What
The n4d mesh campaign used Shodan-driven discovery across ComfyUI, Ollama, n8n, Open WebUI, Langflow, Gradio, and MCP infrastructure. The reported chain included MCP JSON-RPC execute_command loops and harvesting of cloud, Kubernetes, Bedrock, and GPT-4 credentials. Victim counts were not published.
Which configuration is exposed
The exposed configuration combines a non-loopback AI service with a reachable MCP server whose host is not loopback. The product surface may vary, so the matcher uses a named exposure feature and scopes the remote-host check to one MCP server element rather than combining fields from different servers.
How ACVE detects it
ACVE checks ai.surface.exposed and a remote-looking mcpServers.urlHost. It does not probe Shodan, execute JSON-RPC, or infer whether the remote service is actually public. Missing host data is possible.
Fix
Bind AI services to private interfaces, add authentication and network allowlists, disable execute_command-style tools, and rotate cloud, Kubernetes, Bedrock, and model-provider credentials after investigation. Review Docker and Redis exposure as part of containment.
Grounding needed
The public page should be checked against the underlying XLab source for campaign dates and impact. The actor claim is retained, but no victim count is invented.
This record is limited to the condition named in the public source: n4d mesh uses exposed AI services and MCP command loops. A match is a review signal for that condition, not a claim that every installation, package, model, or host was compromised. Operators should preserve the resolved evidence and investigate adjacent credentials, network exposure, and execution history before closing the finding. The result should be retained with the lock snapshot used for the match so later review can distinguish configuration drift from a changed public record.
Configuration
and
features["ai.surface.exposed"] eq true
some mcpServers where
urlHost regex "^(?!localhost$|127\\.0\\.0\\.1$|::1$).+"Fix
Remove public AI service exposure and disable untrusted MCP command tools.
- Reconfigure
features["ai.surface.exposed"]tofalse. Close the public service boundary. - Reconfigure
mcpServers. Remove execute_command loops and require authentication.
Validation
No validation entries recorded.
Grounding
No grounding checks recorded.
References
No references recorded.
Report a problemValidate this advisoryDiscussJSONEdit on GitHub