FinLexPurple
A local, air-gapped-capable, hardened autonomous security agent that tests a financial application — and everything it now trusts.
A modern financial app is no longer just its own code and endpoints. It trusts AI agents and their MCP tool integrations, a tree of third-party software dependencies, and the container images it ships in. FinLexPurple's thesis is one engagement, whole surface: test the application and its AI/MCP integrations, its dependencies, and its containers together — with findings that are deterministically verified (re-executed by code, not asserted by an LLM) and cryptographically provable (a signed, reproducible evidence bundle per verified finding).
AUTHORIZATION REQUIRED — this is an offensive security tool. Only run FinLexPurple against systems you own or have explicit, written authorization to test. Unauthorized scanning may be illegal. The tool requires you to attest authorization for each target (recorded in a tamper-evident audit log), runs default-deny egress and spend/iteration caps, and never auto-exploits financial or MCP actions without a human gate — but you are responsible for using it lawfully.
Project status (honest)
FinLexPurple is in active, pre-1.0 development, released milestone by milestone. What works today:
| Capability | Status |
|---|---|
| Hardware/provider setup, scope confirmation + authorization attestation | yes — works |
scan end-to-end: recon → web detectors → verification → report |
yes — works |
| Web detectors (SQLi/XSS/IDOR/SSRF…) + deterministic verification | yes — runs in scan |
Signed evidence bundle + standalone verify-bundle |
yes — works (scan writes a bundle per verified finding) |
| MCP offensive testing | yes — module (runnable; not yet auto-run by scan) |
| Supply-chain (OSV/pip-audit wrap, slopsquat, typosquat, secrets) | yes — module (--include wiring is a follow-up) |
| Container (Trivy/Grype/Dockle/hadolint wrap, escape checks) | yes — module (--include wiring is a follow-up) |
| AST CodeFix (tree-sitter, JS/TS + Python) | yes — module (whitebox scan flow is a follow-up) |
Reporting engine (report.json/report.md, text badges, 0600) |
yes — runs in scan |
The web path is wired end-to-end. finlexpurple scan --target <url> confirms
scope + authorization, runs recon, runs the web detectors through a scope-safe
prober, verifies each finding by deterministic replay, and writes a full report
tree (report.json, report.md, evidence/, replay-logs/, and a signed
bundle per verified finding) into ./finlexpurple-reports/<run>/.
Still a follow-up: the supply-chain and container surfaces (--include supplychain|container) and the whitebox CodeFix flow (--path … --mode whitebox --fix-mode agent) are complete, tested modules but are not yet
auto-run by scan — run them via their module entry points for now. See the
CHANGELOG for exact per-release status.
This is a pre-release; the API, CLI flags, and output layout may change before 1.0.
Install
Requires Python 3.10+.
pip install finlexpurple
Some capabilities wrap best-of-breed open-source scanners rather than
reimplementing them. Install the ones you need and check availability with
finlexpurple doctor --tools:
- Supply-chain: osv-scanner, pip-audit
- Container: Trivy, Grype, Dockle, hadolint
- Evidence signing: cosign (optional; bundles are hash-only without it)
- Container isolation: Docker (Standard tier)
Missing tools are reported clearly and their steps are skipped, never faked.
Usage
# 1. See your hardware and which external scanners are installed
finlexpurple doctor
finlexpurple doctor --tools
# 2. Configure model provider / hardware tier, and the container-isolation tier
finlexpurple setup
finlexpurple setup-isolation
finlexpurple init # create a local .env from the template
# 3. Scan a target you are authorized to test (confirms scope + attestation,
# then recon + the orchestration loop). You will be asked to confirm scope.
finlexpurple scan --target https://app.example.com/
finlexpurple scan --target 10.0.0.0/24 --root-url http://10.0.0.5/ # IP/CIDR
finlexpurple resume <run-id> # resume a paused run
# 4. Independently re-verify a finding's evidence bundle — offline, standalone
finlexpurple verify-bundle ./finlexpurple-reports/<run>/evidence/<id>.bundle.json
Run state and reports are written under ./finlexpurple-reports/ (gitignored;
reports are 0600 on POSIX because they contain real vulnerability detail).
The verify-bundle flow (the credibility differentiator)
A verified finding is backed by a reproducible evidence bundle: the exact request/response, the deterministic replay log, and a canonical content hash (and, when cosign is available and you are online, a Sigstore signature). Anyone — an auditor, a client, a regulator — can re-check it on their own machine, with no scan and no network:
finlexpurple verify-bundle finding.bundle.json
finlexpurple verify-bundle finding.bundle.json --expected-hash sha256:<from-the-report>
It recomputes the hash and reports tampering clearly; a bundle altered after creation fails verification.
What makes it different
- Deterministic exploit verifier — findings are re-executed by code, never trusted on an LLM's say-so.
- Local / air-gapped / bring-your-own-model — runs fully local via Ollama; cloud providers optional.
- AI-agent / MCP offensive testing — active prompt-injection, tool-poisoning, exfiltration-oracle testing (hard-gated).
- Hardened by default — default-deny egress, spend/iteration caps, never mounts the Docker socket, never privileged.
- Fintech business-logic specialization — a suite of financial-domain agents (later milestone).
- Slopsquatting / hallucinated-dependency detection — catches packages an AI coding agent might invent or that were attacker-registered.
- Payment-SDK typosquat detection — fake Stripe/JazzCash/Easypaisa/Paysafe-style packages.
- Privacy-by-architecture install counter — opt-in, cannot identify you.
- Three-state verified badge + aggregate "% verified" —
[VERIFIED]/[REPORTED]/[HUMAN-CONFIRMED], as plain text (no emoji). - One engagement, whole surface — app + AI/MCP + dependencies + containers, not four-to-six stitched-together tools.
- Reproducible, signed evidence bundle per finding — independently re-verifiable.
- Tiered container isolation — the scan runs inside a hardened boundary (None / Standard-Docker / Maximum-gVisor).
Where mature OSS scanners exist, FinLexPurple wraps them (Trivy, Grype, OSV-Scanner, pip-audit, mcp-scan, hadolint, Dockle) and normalizes their real output into one finding schema — it does not reimplement their databases.
Contributing
See CONTRIBUTING.md. Issues and pull requests welcome.
License
Apache License 2.0 — see LICENSE.
Metadata
Release files for finlexpurple 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| finlexpurple-0.3.0.tar.gz | 187.5 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| finlexpurple-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 365.6 kB
Release files / finlexpurple-0.3.0.tar.gz
| Download URL | finlexpurple-0.3.0.tar.gz |
|---|---|
| Size | 187.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ceeed7a9862b4586aea06ac77b5f5edb15e5568acaad8f8ce5a11d9c67d192f1
|
|
BLAKE2b-256 checksum How to use checksums |
0559bb47fd19f45992bd53782c123e938cce7ace9c6fbfee12d5e12e9b5349cc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logRelease files / finlexpurple-0.3.0-py3-none-any.whl
| Download URL | finlexpurple-0.3.0-py3-none-any.whl |
|---|---|
| Size | 178.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c0647090778002ce555b5574ed8b2b6e4e45c97501be0591487c56b9e8f2010f
|
|
BLAKE2b-256 checksum How to use checksums |
bbf319367a251b6238c9bb13b923eee93ef290486f34f385c1da4a379c767989
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logSecurity for finlexpurple 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for finlexpurple-0.3.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.