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

← All engagement records

HIGH · case-study May 25, 2026

NextHello CrewAI CRM: 59-Endpoint Operational API Open Without Authentication, Live API Keys

Sector
Commercial
Severity
HIGH

Date: 2026-05-25 Host: 132.145.158.151 Cloud: Oracle Cloud (AS31898), US App: NextHello CrewAI API v1.0.0 + Baileys WhatsApp Bridge Operator: askmikeai@gmail.com Severity: HIGH


What Was Found

F1 — Full Operational API Open Without Authentication (HIGH)

DCWF KSAT coverage

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

  • 672 (AI Test & Evaluation Specialist): K7003, K7004, S7068, S7070, S7075, T5904
  • 733 (AI Risk & Ethics Specialist): K7040, T5854
  • overlap (Common AI KSATs (all 5 roles)): K1157, K1158, K22, K6900, K6935, K7003

Port 8001 runs a FastAPI (uvicorn) service: NextHello CrewAI API v1.0.0. /docs and /redoc return HTTP 200 — interactive Swagger UI and ReDoc are publicly browsable. All operational POST endpoints accept requests without credentials. No auth challenge, no 401, no 403.

GET  /                → {"name":"NextHello CrewAI API","version":"1.0.0","docs":"/docs","health":"/health"}
GET  /health          → {"status":"healthy","llm_provider":"test","whatsapp_configured":false,"redis_connected":true}
GET  /config          → full integration map, all keys (PDL/HeyGen/ElevenLabs/Supabase) configured
GET  /conversations   → {"conversations":[],"count":0}
GET  /state/{phone}/history → message history endpoint open; empty for unknown numbers

Note: /health reports llm_provider: "test" but /config reports "openai/gpt-4o". The health endpoint carries a stale value; the live provider is GPT-4o.

F2 — Live API Keys, No Credential Gate on Execution Endpoints (HIGH)

/config (unauthenticated GET) confirms:

{
  "llm_provider": "openai/gpt-4o",
  "pdl_configured": true,
  "heygen_configured": true,
  "elevenlabs_configured": true,
  "hubspot_configured": false,
  "supabase_configured": true,
  "whatsapp_configured": false,
  "redis_configured": true
}

All execution endpoints accept phone numbers and contact data without credentials. Each call consumes live API quota:

EndpointTrigger
POST /researchPeople Data Labs query on phone number + email + LinkedIn
POST /video/generateHeyGen video generation
POST /voice/generateElevenLabs voice synthesis
POST /crm/syncHubSpot CRM record creation
POST /qualifyContact qualification pipeline
POST /pipeline/fullChained: research → qualify → video → CRM sync

POST /send and POST /send/immediate accept phone_number and content. Both would deliver WhatsApp messages when the bridge reconnects.

F3 — WhatsApp Bridge: Session Credentials Persisted (HIGH)

Port 3000 runs a Baileys WhatsApp bridge. The bridge is disconnected (connected: false) but session credentials exist in both local storage and Postgres.

GET /health:         {"status":"ok","connected":false,"sessionId":"askmikeai-gmail.com","ownerId":"askmikeai@gmail.com","hasPostgres":true}
GET /session/status: {"hasLocal":true,"hasRemote":true,"remoteFormat":"baileys-multifile-v1","postgresConfigured":true}
GET /qr:             {"available":false,"connected":false,"qrPayload":null,"qrText":null}

hasLocal: true and hasRemote: true mean the WhatsApp account was previously authenticated. Session state is persisted in the Baileys multifile format. The bridge is idle, not cleared. When the phone reconnects, the session resumes. At that point, POST /send delivers messages to any phone number.

POST /admin/api/whatsapp/session/reset exists and requires admin auth — it would force a fresh QR flow.

The bridge exposes ownerId: askmikeai@gmail.com and sessionId: askmikeai-gmail.com without credentials.

F4 — Admin Signup Open: Account Creation With No Rate Limiting (HIGH)

POST /admin/api/auth/signup accepts registrations without credentials.

POST /admin/api/auth/signup
{"email":"<any>","password":"<any>","name":"<any>"}
→ {"success":true,"status":"pending"}

Accounts are created in status: pending. The approval endpoint is POST /admin/api/auth/approve/{user_id}. That route is blocked by the tenant account-lookup gate — it requires a provisioned admin account. Registration is open; access to admin data requires approval from an existing owner.

All other /admin/* routes return {"error":"account not found"}. The gate is a tenant-keyed account lookup, not a session or JWT check. Admin data — contacts, messages, enrichment records, CRM sync results, PII from PDL runs, media — is not accessible without a provisioned account.

GET /admin/api/auth/users returns {"error":"forbidden"}. That route checks admin privilege separately.

No Supabase URL or anon key was found in the React SPA bundle at port 80. Supabase access is server-side only.

F5 — OpenClaw Tailscale Integration (LOW)

GET /admin/api/research/openclaw/health returns {"error":"account not found"} — the gate blocks it. The endpoint description confirms an OpenClaw research agent instance is reachable from this host over Tailscale. OpenClaw runs on a separate private host. Tailscale-gated; not reachable from the public internet.


Stack

FastAPI (uvicorn), CrewAI agent framework, GPT-4o (OpenAI), People Data Labs, HeyGen, ElevenLabs, Supabase (Postgres), Redis, OpenClaw (Tailscale-private). WhatsApp bridge: Baileys (multifile session). Port 80: React SPA (nginx/1.27.5), title “NextHello CRM + Swarm”. Port 3000: WhatsApp bridge. Port 8001: main API. Oracle Cloud US (AS31898). No TLS on port 8001 or 3000.

Shodan reports only ports 22, 80, 8001 — port 3000 is not indexed. Port 5432, 6379 are container-internal, not host-exposed.


Failure Mode

The application authenticates the admin layer (tenant-keyed account lookup) but not the operational layer. All execution endpoints — research, qualification, message delivery, media generation — sit in front of the auth gate. The developer separated “admin” from “operational” routes and gated only the former.

The WhatsApp bridge has no auth on its metadata endpoints. The bridge’s connection state is the only gate on live message delivery, and session credentials are already persisted.


Operator Attribution

Operator email: askmikeai@gmail.com (confirmed from WhatsApp bridge /health response). Product: nexthello.ai — “AI-powered multi-channel outreach with real-time orchestration for teams managing follow-ups at scale.” GitHub: github.com/askmikeai, created 2026-02-08. 11 public repos including next-hello (PLpgSQL, 9 stars), openclaw (TypeScript fork), openclaw-digitalocean. Config fields owner_name: "the host" and event_name: "the event" are placeholders — the tool is configured per-event deployment for networking events. Solo developer.