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.2.tar.gz (92.4 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.2-py3-none-any.whl (170.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: vyrion-0.2.2.tar.gz
  • Upload date:
  • Size: 92.4 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.2.tar.gz
Algorithm Hash digest
SHA256 6cfcd254a04630422138e725041191ba43b0a2eb27c1b20227c3490570045dc2
MD5 e2693b7be61d2a47d8246591fc5f7698
BLAKE2b-256 5c0483171db110842ba62ae88160762f1be23ff20e5636125689232587d1209b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: vyrion-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 170.0 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 1381e648cc172d984e04dd9f6dda5f81653b38b9173256784d142df3f4040dde
MD5 f7623b76812c25cd4b3887c3369070ed
BLAKE2b-256 6964994125e451afde1f260b104948bacc8fab2ba0133ac704345f4ea234125e

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