Skip to main content
Vyrion

Vyrion

Find and fix Ghost Approvals: forged human-approval bypasses in AI agent, workflow, and CI/CD systems.

Version License Python Frameworks


The problem, in one sentence

Many AI agents and workflows pause for a human to approve a risky action, then store that approval as ordinary state and trust it on resume, so anything that can write to that state can forge the approval and the action runs with no human involved.

We call this a Ghost Approval. The audit log still shows a human signed off. Nobody did.

The attacker does not need a stolen password, a prompt injection, or code execution. It needs only a write to a store the workflow already trusts, which loggers, exporters, backup jobs, and queue consumers often have.

See it in 20 seconds

pip install vyrion
vyrion demo

vyrion demo runs a real agent three times:

  1. A vulnerable payment tool executes a forged one-million-dollar transfer. No human approved it.
  2. Vyrion reports the gate as exposed and explains why.
  3. The same tool, hardened with a Vyrion Seal, rejects the forgery and runs only on a genuine signed approval.

Install

pip install vyrion

That is the whole install for the core tool and the demo. To test a specific framework live, add its extra so you only pull what you need:

pip install "vyrion[langgraph]"
pip install "vyrion[crewai]"
pip install "vyrion[haystack]"

The two Node frameworks (Genkit and Vercel AI) install with npm instead:

npm install genkit ai

Use it on your own project

Point Vyrion at a folder. It finds the approval gate, tells you if it is exposed, and can wire in the fix.

vyrion run ./my-agent

Or drive the three steps yourself:

vyrion certify --framework langgraph --live    # prove the fix on a real run
vyrion apply --framework langgraph --project ./my-agent   # wire the guard in
vyrion rollback --framework langgraph --project ./my-agent  # undo, byte for byte

Every apply keeps a backup and every rollback restores the original source exactly.

What the fix is

Vyrion installs a small guard next to your protected action. Before the action runs, the guard checks that the approval is a Vyrion Seal: a signed artifact that binds the approval to the exact action, the exact arguments, the run it belongs to, the approver, the policy, an expiry, and a one-time nonce. A forged, replayed, or tampered approval fails that check and the action does not run. The guard holds public verification keys only and fails closed.

The Seal is language agnostic. A Seal minted in Python verifies byte for byte in Node, which is how the same guarantee covers both Python and JavaScript frameworks. See docs/concepts/cross-language-seal.md.

Supported frameworks

Fifteen frameworks are certified, meaning the fix was proven on a real run of each: a genuine approval passes, and forged, rebound, replayed, and bypassed approvals are all blocked.

Tier Frameworks
Trusted run anchor (approval bound to a run id from the runtime) LangGraph, Apache Burr, DBOS
No anchor (approval bound to action, arguments, and a one-time nonce) LlamaIndex, CrewAI, OpenAI Agents SDK, Google ADK, AutoGen, Haystack, Strands, Agno, Semantic Kernel, Apache Airflow, Genkit, Vercel AI

Full detail and how each tier is decided: docs/support-matrix.md.

Is this real? The disclosure trail

The vulnerability class is not hypothetical. It was reported to the affected vendors, and their responses are on the record. One is a published advisory; several vendors agreed the behaviour is exactly as described and placed the missing control outside their own trust boundary, which is precisely the gap Vyrion fills.

  • Flowise: confirmed and accepted as a Medium-severity advisory (GHSA-2hjv-g5fh-6w4j).
  • Apache Burr: PMC confirmed the finding is technically accurate and invited us to help author Burr's security model.
  • Google ADK: reported and triaged (issue 518333638, priority P3, under review).
  • Microsoft, Kestra, AWS (Strands), OpenAI: each confirmed the behaviour and treated it as an application or operator responsibility.

Full account, with exactly what each vendor said: docs/research/disclosures.md.

Documentation

Contributing

New framework adapters, testbeds, and documentation are all welcome. See CONTRIBUTING.md. Please report security issues in Vyrion itself privately, see SECURITY.md.

License

Apache-2.0. See LICENSE.

Citation

If you build on this work, please cite it. See CITATION.cff.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vyrion-0.2.1.tar.gz (91.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vyrion-0.2.1-py3-none-any.whl (167.4 kB view details)

Uploaded Python 3

File details

Details for the file vyrion-0.2.1.tar.gz.

File metadata

  • Download URL: vyrion-0.2.1.tar.gz
  • Upload date:
  • Size: 91.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.9

File hashes

Hashes for vyrion-0.2.1.tar.gz
Algorithm Hash digest
SHA256 f96721639927002657d2e2c2faa50d60b169969e5bc270dd93fba30c2f659b20
MD5 7a7b5d3e27ffb2cb03b4ec3847e50449
BLAKE2b-256 8d709e98a79e0a954d4773492624f11a791dec6ac58098ced94bef5b0ea25e22

See more details on using hashes here.

File details

Details for the file vyrion-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: vyrion-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 167.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.9

File hashes

Hashes for vyrion-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 cbb8b410d04435b1d80004e8f968e8a40c34d22a7ae03a1c4de52fe378a32fbb
MD5 dd9248c1936b536ca4ce39a68d4a4ee5
BLAKE2b-256 61244fb5504d0d16e4d2355b7164b64641904165b6a1121546601304d3c2f1a1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page