Open-Source Security Intelligence

Know every vulnerability
before it knows you.

DevGuard continuously monitors your dependencies and alerts you when CVEs like this one affect your stack — with real-time threat intelligence built for developers.

Search

GHSA-47c3-hpmg-7j6p

MediumCVSS 6.9 / 10
Published Oct 9, 2026·Last modified Oct 9, 2026
Affected Components(1)
PyPI logoshiny
1.4.0 – 1.6.4
Description

Impact

Shiny for Python's bookmark-restore path accepted a client-supplied _state_id_ query-string value and joined it into the server-side bookmark directory (<cwd>/shiny_bookmarks/<id>) without validating it. A value containing .. path segments, or an absolute path, could therefore cause the server to open and parse input.json and values.json from a directory outside the bookmark store.

On a default application the restore was attempted whenever the client supplied a URL query string — including when bookmarking was disabled (bookmark_store="disable") — so no opt-in configuration was required. For such applications the impact is an unauthenticated, server-side probe for the existence and JSON-validity of attacker-chosen paths, constrained to those two file names.

Applications configured with bookmark_store="server" and using ui.input_file() are affected more seriously. The file-input restore handler copies files out of the restore directory, so the contents of an attacker-selected file name within an attacker-selected directory could be read into the application.

Affected versions

1.4.0 through 1.6.3. Bookmarking was introduced in 1.4.0; earlier releases do not contain the affected code path and are not affected.

Patches

Fixed in 1.6.4. Upgrade with:

pip install --upgrade shiny

The fix validates bookmark IDs against an allowlist — a single path segment matching [A-Za-z0-9_-]+, which cannot express a path separator, a .. parent reference, or an absolute path — before the ID is used to build a filesystem path. Bookmark IDs generated by Shiny are unaffected by this restriction. Restore is additionally gated on the application's bookmark_store setting at a single point, so it no longer runs when bookmarking is disabled, and the on-disk restore path is honored only under bookmark_store="server".

Workarounds

There is no configuration change that mitigates this on an affected version: the restore path ran even with bookmark_store="disable". Deployments that cannot upgrade immediately can strip the _state_id_ parameter from incoming query strings at a reverse proxy or load balancer, which prevents the affected code path from being reached.

Credits

Reported by @0xRenSec.

Upload your SBOM

Upload your own SBOM in CycloneDX 1.6 or higher (JSON) directly here to check your vulnerabilities.

Risk Scores
Base Score
6.9

The vulnerability can be exploited over the network without needing physical access. It is easy for an attacker to exploit this vulnerability. An attacker does not need any special privileges or access rights. No user interaction is needed for the attacker to exploit this vulnerability.

Threat Intelligence
2.7

Limited exploitation activity has been observed. Close monitoring and planned remediation are recommended.

EPSS
N/A

Probability that this vulnerability will be exploited in the wild within the next 30 days.

Exploit
Not available

We did not find any exploit available. Neither in GitHub repositories nor in the Exploit-Database.

Related Vulnerabilities
  • CVE-2026-108258
    Alias
  • EUVD-2026-95986
    Alias

Browse More

Scan your project

Continuously monitor your dependencies and get alerted when vulnerabilities like this one affect your stack.

Checkout DevGuard