ai newsMo., 2. Nov.
EilmeldungI Hacked Every AI Voice Agent at a #1 Product Hunt Company's Launch Hackathon

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

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 rea

dev.toMontag 06:48 · 02.11.5 Min. Lesezeit
Bild: dev.to

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> Enter fullscreen mode Exit fullscreen mode 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.

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")) ' Enter fullscreen mode Exit fullscreen mode Output:

prahaladrealestateagent | Real estate agent | 9e14ba08-bdd3-48e0-b4f4-97c55e838606 prahaladhiring-candidatescreeningaiagent | Hiring Agent | a23bca69-328e-472e-977a-8bd9b6419677 Enter fullscreen mode Exit fullscreen mode 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.

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:

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.

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 " Enter fullscreen mode Exit fullscreen mode Response: 403 Forbidden.

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

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

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" Enter fullscreen mode Exit fullscreen mode 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." } }' Enter fullscreen mode Exit fullscreen mode 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..."

"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:

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; Enter fullscreen mode Exit fullscreen mode On the persona patch endpoint, the database query looked like:

UPDATE agent_personas SET system_prompt =: prompt WHERE agent_slug =: slug; Enter fullscreen mode Exit fullscreen mode Notice what is missing?

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:

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.

Quelle: dev.to (dev.to). Original öffnen