Most recent
navigate open esc close Corpus index built 2026-06-07 23:58 UTC

← All research

Survey May 3, 2026

n8n on Public Cloud: Auth Posture Survey

NuClide Research · 2026-05-03


Summary

Sweep of 1.83M IPs across 28 cloud-provider /16 ranges (DigitalOcean, Hetzner, Vultr) on port 5678 → 5,885 live hosts → 1,006 confirmed n8n instances via /rest/settings"timezone" fingerprint. Zero unauthenticated, exploitable instances.

DCWF KSAT coverage

Auto-derived from DCWF AI work-role rule files (ksat-tag).

  • 672 (AI Test & Evaluation Specialist): K7003, K7044, K7054, S7068, S7075, T5904, T5919
  • 733 (AI Risk & Ethics Specialist): K7040, K7051, T5868, T5893
  • overlap (Common AI KSATs (all 5 roles)): K108, K1158, K1159, K22, K6311, K6935, K7003

This matches the Flowise result: orchestration-layer tools on cloud platforms are uniformly auth-protected. n8n made authentication mandatory in v0.166.0 (September 2022) and operator adoption on the three largest self-hosting clouds appears complete.


Methodology

masscan -iL <28 cloud /16 CIDRs> -p 5678 --rate 6000
  → 5,885 unique live hosts on :5678

httpx -p 5678 -path /rest/settings -mc 200 -ms '"timezone"'
  → 1,011 n8n instances confirmed

aiapp-probe.py (deep enumeration)
  → /api/v1/workflows, /api/v1/credentials, /rest/workflows,
    /rest/credentials, /api/v1/executions

Why /rest/settings is the definitive fingerprint: Returns a JSON object containing n8n-specific fields: executionMode, endpointWebhook, endpointMcp, databaseType, timezone. No other software in the wild returns this schema on this path. The /healthz{"status":"ok"} alternative was rejected, 5,139 matches vs 1,011 for /rest/settings, confirming ~80% false-positive rate on the generic healthz filter.


Findings Summary

MetricValue
Live hosts on :56785,885
Confirmed n8n (via /rest/settings)1,006
Unauthenticated /api/v1/credentials0
Unauthenticated /api/v1/workflows0
SPA catch-all false positives3
Instances with MCP endpoint exposed~400 (estimated from settings sample)

SPA Catch-All Anti-Pattern

Three instances (167.71.196.43, 167.71.78.254, 178.62.181.200) returned HTTP 200 on /api/v1/credentials and /api/v1/workflows, but the response body was the n8n Vue SPA HTML, not JSON. These instances serve the frontend on every path, making HTTP status codes useless as auth indicators for these endpoints.

Correct verification: check Content-Type: application/json and parse response before concluding a credential endpoint is open.


Notable Observations

Database types (from /rest/settings):

  • SQLite: majority of instances (single-node, personal/dev deployments)
  • PostgreSQL ("databaseType":"postgresdb"): minority, production multi-tenant setups

MCP endpoints: Newer n8n instances (v1.x) expose "endpointMcp": "mcp" in settings. This wires n8n’s 400+ integrations as MCP tools accessible to LLMs. The MCP endpoint itself (/mcp/) requires the same auth as the rest of the API, but the existence of the endpoint is disclosed unauthenticated via /rest/settings.

Version signal:

  • Instances with "inE2ETests", "isDocker", "endpointForm" fields → n8n ≥1.0
  • Instances without those fields → legacy n8n <1.0 (pre-2023)
  • Both cohorts returned 401/403 on all data endpoints

Why This Matters (Even as a Negative Result)

n8n’s credential store, when exposed, returns names and types for every stored integration: OAuth tokens for Google/Slack/GitHub, API keys for OpenAI/Anthropic/Stripe, database connection strings, SSH credentials. The /api/v1/credentials endpoint in unauth configurations is a single-request multi-service compromise.

The empirical result, 0 of 1,006 cloud-hosted instances exposed, indicates mandatory auth adoption is near-complete on cloud platforms. The risk surface has moved to:

  • Self-hosted on bare metal / home servers, different operator population, lower update cadence
  • Internal network deployments, not reachable from public internet but accessible post-lateral-movement
  • Webhook endpoints, n8n webhooks (/webhook/) execute workflows and are intentionally public; misconfigured webhook triggers are a separate attack surface

Platform Posture Comparison

PlatformConfirmedUnauthNotes
Flowise430 (0%)Post-CVE-2024-36420 hygiene
n8n1,0060 (0%)Mandatory auth since v0.166.0
Qdrant6161 (100%)Auth off by default, no change
Elasticsearch4242 (100%)7.x default-no-auth still common

Pattern: orchestration tools have hardened; data layer tools haven’t.


Probe Tooling

  • data/aiapp-probe.py, n8n prober: /rest/settings fingerprint, dual-path credential/workflow enumeration (/api/v1/ and /rest/), execution history sampling
  • httpx filter: httpx -p 5678 -path /rest/settings -mc 200 -ms '"timezone"'

Discoverer

NuClide Research, nicholas@nuclide-research.com

No data was accessed, modified, or exfiltrated. All instances probed only on documented endpoints to determine auth posture.