All posts
CVE GHSA-hqm2-cfx2-2vgh ↗ · CVE-2026-102682 ↗ · September 2026 · Offgrid Security

Pipecat’s Development Server Has No Lock on the Door

Pipecat ships a development runner with unauthenticated /start and /daily endpoints designed for local testing. When that server reaches a public network — via --host 0.0.0.0, Docker port publishing, or a public tunnel — anyone can create bot sessions and drive up bills across every AI API in the pipeline. CVE-2026-102682 | CVSS 5.6 Medium.

DateSeptember 29, 2026
CVECVE-2026-102682 ↗
AdvisoryGHSA-hqm2-cfx2-2vgh ↗
Packagepipecat-ai (pip)
Affected0.0.98 – 1.5.0
Fixed in1.6.0
CVSS 3.15.6 Medium
TypeMissing Authorization, CWE-862 / CWE-770 / CWE-345
AuthNone required (network access only)
Found byKira, Offgrid Security

What is Pipecat

Pipecat is an open-source Python framework for building real-time voice and multimodal AI agents. Built by Daily.co, it wires together the components of a conversational AI pipeline — speech-to-text (Deepgram, AssemblyAI), language models (OpenAI, Anthropic, Google), text-to-speech (ElevenLabs, Cartesia), and real-time transport (Daily.co rooms, WebRTC) — into a unified processing pipeline. It is widely used for AI phone agents, voice assistants, interactive demos, and real-time AI applications.

The framework ships with a lightweight development runner designed for local iteration. That runner intentionally omits authentication: the design assumption is that it runs on localhost, accessed only by the developer who started it. The problem arises when that assumption is violated — when the development server is reachable from an untrusted network — because there is nothing in the runner itself that enforces the boundary.

The vulnerability is not that the development runner lacks auth. It is that it lacks any mechanism to detect or block exposure to untrusted networks. Documentation warnings are not a security control.

The exposed endpoints

The Pipecat development runner exposes at minimum two unauthenticated endpoints:

Neither endpoint requires authentication, API keys, or any token from the caller. The runner’s only intended access control is the assumption that it is bound to 127.0.0.1. When the server binds to 0.0.0.0 (either by explicit flag or Docker networking), every caller on the reachable network has the same access as the developer.


How exposure happens

There are four common paths from “local development server” to “publicly reachable endpoint,” and all four are normal developer workflows:

1. The --host 0.0.0.0 flag

Running python bot.py --host 0.0.0.0 binds the server to all network interfaces. This is a common pattern for testing on a mobile device on the same network, or for running on a remote development VM. The flag is in the documentation and in example scripts.

2. Docker port publishing

A docker-compose.yml that includes ports: ["7860:7860"] publishes the container’s port to the host. If the host has a public IP, the port is reachable from the internet. Developers often add port publishing to make local testing easier without thinking through the exposure surface.

3. Public tunnel services

Tools like ngrok, Cloudflare Tunnel, and localtunnel are commonly used to expose a local development server to the internet for webhook testing, mobile device testing, or sharing a demo. A developer who tunnels their Pipecat development server to show a stakeholder a demo creates a live, unauthenticated /start endpoint accessible from anywhere.

4. Cloud development environment deployment

Running a Pipecat bot in a cloud VM or on a service like Modal, RunPod, or a Jupyter notebook server often results in the server binding to a public interface. Developers running Pipecat in the cloud for performance testing or to access GPU resources may inadvertently expose the server to the internet.

In all four cases, the developer’s mental model is “this is my test server.” The server’s behaviour is “accept and fulfill any /start request from any caller.”

The attack

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

# Target: Pipecat development runner exposed at http://target:7860/

# Step 1: create a bot session. No credentials, no token, no API key.
curl -X POST http://target:7860/start \
  -H "Content-Type: application/json" \
  -d '{}'

# HTTP 200 response includes session info and Daily.co room URL.
# The bot pipeline is now running:
#   - Daily.co room created (consumes API quota)
#   - OpenAI Realtime API session opened (metered per minute)
#   - ElevenLabs TTS initialized (metered per character)
# Victim's cost: accumulates for the duration of the session
# Attacker's cost: one HTTP request

The attack requires no credentials, no prior knowledge of the system beyond the host and port, and no interaction from any legitimate user. Each /start request creates a new independent session. An attacker can automate this in a loop.


What each session actually costs

The financial impact depends on which providers the Pipecat bot is configured to use. A typical voice AI pipeline with GPT-4o Realtime, ElevenLabs, and Daily.co:

ProviderPricing (approximate)Per 10-min session
OpenAI GPT-4o Realtime$0.06/min audio in, $0.24/min audio out~$3.00
ElevenLabs TTS~$0.18 per 1,000 characters~$0.50
Daily.co$0.004/participant-minute~$0.04
Deepgram STT$0.0059/min~$0.06

A single 10-minute session costs approximately $3.60. An attacker spinning up 100 concurrent sessions produces a bill of $360 in 10 minutes. At higher concurrency or with longer-running sessions, the numbers scale quickly. API accounts without hard spending limits can be depleted in hours.

Beyond billing impact, each session the attacker creates is a fully operational bot. If the bot is configured to accept audio input and produce transcripts or summaries, the attacker can interact with the bot to extract conversation content. If the bot has access to external tools or databases via function calling, those may be reachable through the session as well.


Why the CVSS is 5.6 and not higher

The medium severity reflects several mitigating factors in the CVSS model. The attack requires network access to the running development server, which in most deployments requires either deliberate exposure (Docker port publishing, --host 0.0.0.0) or an active tunnel. The vulnerability does not grant access to persistent application data or allow code execution on the host. There is no confidentiality or integrity impact in the CVSS sense; the impact is resource exhaustion and quota drain.

That said, CVSS scores are context-dependent. In a deployment where the development runner has network access to internal services, or where the bot has privileged integrations (database tools, CRM access, internal APIs), the effective blast radius is larger than the base score suggests. The score reflects the base vulnerability; your deployment context determines the actual risk.


How Kira found it

Kira was pointed at the Pipecat repository. It identified the development runner’s HTTP server, traced the routing configuration for each endpoint, and found that the /start and /daily endpoints had no authentication middleware in their handler chain. It cross-referenced the binding configuration and identified that --host 0.0.0.0 was present in documented examples and example scripts.

The finding is structurally simple: a web endpoint with no auth guard and a documented exposure vector. What makes it worth reporting is the context. These are not low-value endpoints. Every request to /start initiates metered calls to external APIs whose costs are borne by the account owner, not the caller. The absence of authentication on a resource-creating endpoint with real financial consequences is not a theoretical risk.


Remediation

Upgrade to pipecat-ai 1.6.0 or later.

pip install "pipecat-ai>=1.6.0"

Version 1.6.0 adds startup warnings when the server is bound to a non-localhost interface, making the exposure condition visible at startup rather than silent. The fix also includes documentation updates that explicitly state the development runner must not be deployed to production or exposed to untrusted networks, and guidance on building authenticated dispatchers for production use cases.

If you cannot upgrade immediately

  1. Bind to localhost only. Ensure the development runner binds to 127.0.0.1 and not 0.0.0.0. This is the default for local development and the only safe configuration for the development runner.
  2. Do not publish the port in Docker. Remove ports mappings from docker-compose.yml unless you have added an authenticated reverse proxy in front of the runner.
  3. Add a reverse proxy with auth for any public-facing deployment. Nginx or Caddy with basic auth or token-based auth in front of the Pipecat development runner will prevent unauthenticated access. Note this is a workaround; for production use, implement a proper authenticated dispatcher.
  4. Rotate any API keys that may have been exposed. If your Pipecat development server was reachable from an untrusted network, treat your OpenAI, ElevenLabs, Daily.co, and Deepgram API keys as potentially compromised. Check usage dashboards for unexpected activity.

For production deployments

The Pipecat development runner is not designed for production. For production deployments, the correct architecture is an authenticated dispatcher service that validates caller identity before creating bot sessions. The Pipecat documentation and examples include patterns for building this. The development runner should never be the entry point for sessions created by external callers.


The broader pattern: development servers in the wild

Pipecat is not unique in this pattern. Development servers without authentication are a category of vulnerability common across the ML and AI tooling ecosystem. Gradio, Streamlit, Jupyter, and many model-serving frameworks ship with no-auth development servers that are regularly exposed to the internet. The assumption that “development” and “not publicly accessible” are the same thing has not held for a long time.

The distinguishing factor for Pipecat is the cost dimension. Most development server exposures leak data or allow arbitrary code execution. Here the primary immediate impact is financial: each session created costs real money. That makes the exposure timeline short and the damage measurable.

The correct mitigation at the framework level is not documentation: it is making the dangerous configuration impossible or at minimum loudly visible. The 1.6.0 fix moves in that direction. The endpoint still lacks authentication; the improvement is that the developer will now see a warning at startup when the configuration is dangerous. Whether that warning is sufficient is a question the Pipecat team will be better positioned to answer as they observe how the framework is deployed in practice.


Key takeaways

References

Kira finds security vulnerabilities across web applications, APIs, and infrastructure from injection flaws and exposed secrets to misconfigurations and business logic issues. Try it on your own codebase ↗

See what Kira finds in your stack.

Kira runs autonomously on your codebase and delivers verified, exploitable findings with proof. Not alerts. Not maybes.

Get started