Pipecat

Development Runner Exposed to Untrusted Networks Allows Unauthenticated Bot Session Creation

pipecat-ai (pip)
CWE-862 · CWE-770 · CWE-345
5.6 MEDIUM
0.0.98 – 1.5.0
1.6.0
2026-09-29
None
Patched

Pipecat ships a development runner with two unauthenticated HTTP endpoints, /start and /daily, designed to create bot sessions during local development. The runner has no authentication mechanism and relies entirely on the assumption that it is bound to 127.0.0.1. When the server reaches a public network — via --host 0.0.0.0, Docker port publishing, ngrok, or a cloud VM — any attacker can create bot sessions and drain third-party AI API quotas at the operator’s expense. No credentials or prior knowledge of the target are required beyond host and port.

01 Root Cause

The Pipecat development runner exposes two endpoints with no authorization check:

  • POST /start — Spawns the full AI pipeline (LLM, TTS, transport). Returns session credentials or a Daily.co room URL.
  • GET /daily — Creates or retrieves a Daily.co room for the session.

Neither endpoint performs any authentication, API key check, or token verification. The entire access control surface is the bind address: the runner is expected to listen on 127.0.0.1 where only the local developer can reach it. When that boundary fails, the endpoints are open to every caller on the reachable network.

Four common developer workflows break the boundary:

# 1. Explicit bind to all interfaces python bot.py --host 0.0.0.0 # 2. Docker port publishing exposes to host, then internet ports: ["7860:7860"] # docker-compose.yml # 3. Public tunnel (ngrok, Cloudflare Tunnel, localtunnel) ngrok http 7860 # creates https://<id>.ngrok.io/start # 4. Cloud VM deployment (Modal, RunPod, Jupyter) # platform networking can publish the port publicly
02 Reproduction

Once the development server is reachable, exploitation is a single unauthenticated HTTP request:

# No credentials, no API key, no token required curl -X POST http://<target>:7860/start \ -H "Content-Type: application/json" \ -d '{}' HTTP/1.1 200 OK { "room_url": "https://<org>.daily.co/<room-id>", ... } # Bot pipeline is now running: # - Daily.co room created (consumes API quota) # - LLM session opened (metered per token / per minute) # - TTS provider initialized (metered per character) # Each /start call creates a new independent session.
03 Impact

The direct impact is financial: each unauthorized /start call initiates a metered session across every AI provider in the pipeline. An attacker running repeated requests can escalate costs continuously. The operator receives no indication until API invoices arrive or provider quotas are exhausted.

Secondary impacts depend on the bot configuration: if the pipeline handles sensitive data, unauthorized sessions may expose that data to the attacker; if the bot executes tool calls or sends outbound messages, those actions are triggered on the attacker’s behalf.

04 CVSS Breakdown
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L Base Score: 5.6 MEDIUM AV:N: exploitable over any network where the dev runner is reachable AC:H: exploitation requires the runner to be exposed to an untrusted network via deliberate misconfiguration (explicit bind, port publishing, or tunnel) PR:N: no credentials of any kind required once the port is reachable UI:N: no user interaction needed S:U: scope unchanged; impact contained to the operator's accounts C:L: session credentials returned; pipeline data potentially accessible I:L: sessions created on operator's behalf; tool calls may be triggered A:L: quota exhaustion can deny service to the legitimate operator
05 Recommended Fix

Upgrade to pipecat-ai ≥ 1.6.0, which adds authentication controls to the development runner. As defence-in-depth regardless of version, bind the server to localhost and avoid publishing dev ports:

# Always bind to localhost for development python bot.py --host 127.0.0.1 # Do not publish dev runner ports in Docker # Remove: ports: ["7860:7860"] from docker-compose.yml # Upgrade pip install "pipecat-ai>=1.6.0"

Patched in GHSA-hqm2-cfx2-2vgh ↗. Fixed in pipecat-ai 1.6.0.