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.0.tar.gz (89.2 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.0-py3-none-any.whl (164.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: vyrion-0.2.0.tar.gz
  • Upload date:
  • Size: 89.2 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.0.tar.gz
Algorithm Hash digest
SHA256 4c94c9109adffefa90a0ff2b9325cb2a2efd322ebaae08165060dbffcbe01bb3
MD5 acabdcb71da4735710864b17f3f01e43
BLAKE2b-256 ed5126416fab0e387d47b67235dbc5aeb3c665dbf34590ff0adfa8cd72602c92

See more details on using hashes here.

File details

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

File metadata

  • Download URL: vyrion-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 164.2 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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f9ccd96c60af0b018abd20e6d9449b666b465d0e0c951b3c709ada9ef8dbed31
MD5 c894fa0ce467da1d2de05308c373d214
BLAKE2b-256 c57bea6c09865b0547f0655a98b88640664433a8ca881da9883763ab394191ef

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