Vulnerabilities in pkg:pypi/backpropagate
PACKAGECVE-2026-48797 is a CRITICAL remote code execution vulnerability (CWE-1295: Debug Messages Revealing Unnecessary Information) affecting Backpropagate libraries in the PyPI ecosystem. The issue involves backprop ui --auth and backprop ui --share do not enforce authentication. Remediation is available by upgrading affected packages to version 1.2.0.
pkg:pypi/backpropagate
Vulnerability advisories affecting package pkg:pypi/backpropagate. Select an advisory below to view technical details or fixes.
| Advisory ID | CVE / NVD | Severity | Summary |
|---|---|---|---|
| GHSA-f65r-h4g3-3h9h | CVE-2026-48797 | CRITICAL | Backpropagate: backprop ui --auth and backprop ui --share do not enforce authentication |
CVE-2026-48797 at a Glance
How to Fix CVE-2026-48797
To remediate this vulnerability, upgrade all affected Backpropagate dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
pip install backpropagate>=1.2.0
npm install @mcptoolshop/backpropagate@1.2.0
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
pip show backpropagate
How to Check if You Are Affected
To determine whether your Python environment is affected by CVE-2026-48797, inspect your installed packages using pip:
pip show backpropagate
Analyze the terminal output to locate any version of Backpropagate in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 1.2.0), your application is affected.
Note: The pip show backpropagate command checks currently installed packages in your active Python environment.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-1295: Debug Messages Revealing Unnecessary Information, where the product fails to adequately prevent the revealing of unnecessary and potentially sensitive system information within debugging messages. In Backpropagate, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-48797 Affected Backpropagate Versions
2 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
backpropagate
|
PyPI |
≥ 1.1.0
< 1.2.0
|
1.2.0
|
|
@mcptoolshop/backpropagate
|
npm |
≥ 1.1.0
< 1.2.0
|
1.2.0
|
References
Frequently Asked Questions
What is CVE-2026-48797?
Which Backpropagate versions are affected?
What version fixes CVE-2026-48797?
Is backpropagate affected?
Is @mcptoolshop/backpropagate affected?
What CWE is associated with CVE-2026-48797?
How can I check PyPI dependencies for CVE-2026-48797?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-f65r-h4g3-3h9h",
"modified" : "2026-06-26T20:34:29Z",
"published" : "2026-06-26T20:34:29Z",
"aliases" : [ "CVE-2026-48797" ],
"summary" : "Backpropagate: backprop ui --auth and backprop ui --share do not enforce authentication",
"details" : "## Summary\n\nIn `backpropagate >= 1.1.0`, the optional Reflex web UI (`pip install backpropagate[ui]`, launched via `backprop ui`) exposes a training control plane: dataset upload, model load, training start/stop, multi-run orchestration, GGUF export, and HuggingFace Hub push.\n\nThe CLI accepts two operator-facing flags intended as security controls:\n\n- `--auth user:pass` — documented as \"require HTTP Basic authentication on every request to the UI.\"\n- `--share` — documented as \"expose the UI on a public address; requires `--auth`.\"\n\nWhen `--auth user:pass` is passed, the CLI prints `Auth: enabled (user: <username>)` to confirm to the operator that authentication is active, then exports `BACKPROPAGATE_UI_AUTH=user:pass` to the subprocess that launches the Reflex backend.\n\n**The Reflex backend (`backpropagate/ui_app/**`) never reads `BACKPROPAGATE_UI_AUTH`.** No authentication middleware is registered. No request-level guard runs. No WebSocket upgrade guard runs. Any client that reaches the bound port — local or remote, depending on whether `--share` is used — has full UI access.\n\nAn inline comment at `backpropagate/cli.py:1217-1218` in the v1.1.0 source documents the gap: *\"For Phase 1 the variable is exported but Reflex doesn't read it yet.\"* This comment was internal-facing; the user-facing documentation (README, CHANGELOG, SHIP_GATE) advertised the contract as enforced.\n\nThis advisory is filed primarily because the runtime contradicted an operator-facing security claim. Code-only bugs of comparable shape (auth check missing entirely from a path) would already warrant disclosure; the additional false-promise dimension raises the severity.\n\n## Impact\n\nAn attacker who reaches the bound port can:\n\n- **Read uploaded datasets** rendered in the UI preview, including content of any JSONL/CSV/TXT file the legitimate operator has uploaded for fine-tuning.\n- **Trigger arbitrary training runs** against any base model the operator has installed locally or that can be downloaded from HuggingFace.\n- **Trigger HuggingFace Hub pushes** to repositories named via the UI input (subject to the operator's local HF token's scope — typically all repos owned by the operator).\n- **Cause disk-fill DoS** via the `rx.upload` endpoint (no size cap, no extension filter, no per-session count cap in v1.1.0 / v1.1.1).\n- **Read model paths** (`source_model_path`, `dataset_path`, `model`, `uploaded_path`) which are user-supplied and bypass the `safe_path()` helper that lives in `backpropagate/ui_security.py` (path validation is dead code on the Reflex surface in v1.1.0 / v1.1.1).\n\nThe combination of unauthenticated training control, HF push target spoofing, and path-input traversal makes the affected endpoint suitable for both data exfiltration (reading uploaded training data) and supply-chain attacks (pushing tampered model weights to the operator's HF account).\n\nThe local-only default (no `--share`) reduces exposure to a host-local attacker. The `--share` flag is documented as a \"public URL\" feature; operators who used `--share --auth user:pass` had no warning that the auth half was inert.\n\n## Patches\n\nFixed in **v1.2.0** (released 2026-05-23). The patch implements real ASGI middleware via `rx.App(api_transformer=basic_auth_transformer)` that gates HTTP routes AND the `/_event` WebSocket upgrade. Four modes (`no_auth_local_only` / `token_auto` / `explicit_creds` / `production`), HMAC-signed cookie validated PRE-`websocket.accept()`, Host + Origin allowlists. The middleware ships alongside a 4-layer defense in depth at the cli.py / ui_app/app.py / rxconfig.py / env-strip surfaces so direct `python -m reflex run` invocations (bypassing the CLI guard) also enforce authentication.\n\nUpgrade with:\n\n- pip: `pip install --upgrade backpropagate`\n- npm: `npm install -g @mcptoolshop/backpropagate@latest`\n\nFull release notes: https://github.com/mcp-tool-shop-org/backpropagate/blob/main/CHANGELOG.md#120---2026-05-23\n\n## Workarounds\n\nIf users cannot upgrade immediately:\n\n1. **Do not pass `--auth` or `--share` to `backprop ui`.** Run the UI with no flags (`backprop ui`); it will bind to `localhost` and accept any client that can reach `127.0.0.1`.\n2. **For remote access, use SSH port-forwarding** instead of `--share`:\n ```\n # On the client:\n ssh -L 7860:localhost:7860 <training-host>\n # On the server:\n backprop ui # no --share\n # Then open http://localhost:7860 in your local browser.\n ```\n SSH provides the authentication layer the Reflex UI did not.\n3. **Audit existing deployments.** If any host running `backpropagate >= 1.1.0` has previously been launched with `--share`, treat any uploaded training data, model paths, or HF push targets visible in that UI session as potentially exposed. Re-issue HF tokens that have been in use during such sessions.\n\n**Binary distribution gap.** Standalone binaries (Windows .exe / macOS .app via PyInstaller) failed to build for v1.2.0 and will land in a follow-up patch release. In the interim, users who relied on the v1.1.x binary distribution should install the patched version via `pip install backpropagate==1.2.0` to receive the auth-bypass fix. The v1.2.0 PyPI package and `@mcptoolshop/backpropagate@1.2.0` npm package both carry the patched code.\n\n## Credit\n\nDiscovered by the dogfood-swarm Stage A audit on 2026-05-22 (finding ID `FRONTEND-A-001`, classified CRITICAL). The audit also surfaced contradicting documentation in CHANGELOG / SHIP_GATE / README; those were corrected in v1.2.0 alongside the runtime fix.",
"severity" : [ {
"type" : "CVSS_V4",
"score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "PyPI",
"name" : "backpropagate"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "1.1.0"
}, {
"fixed" : "1.2.0"
} ]
} ]
}, {
"package" : {
"ecosystem" : "npm",
"name" : "@mcptoolshop/backpropagate"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "1.1.0"
}, {
"fixed" : "1.2.0"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/mcp-tool-shop-org/backpropagate/security/advisories/GHSA-f65r-h4g3-3h9h"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-48797"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/mcp-tool-shop-org/backpropagate"
}, {
"type" : "WEB",
"url" : "https://github.com/mcp-tool-shop-org/backpropagate/releases/tag/v1.2.0"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-1295", "CWE-358", "CWE-862" ],
"severity" : "CRITICAL",
"github_reviewed" : true,
"github_reviewed_at" : "2026-06-26T20:34:29Z",
"nvd_published_at" : "2026-06-17T13:20:43Z"
}
}