{"cve":"CVE-2026-61599","nvd":{"published":"2026-09-16T23:16:54.010","modified":"2026-09-30T17:51:56.193","status":"Deferred","description":"djust provides Phoenix LiveView-style reactive server-side rendering for Django with Rust-powered performance. Prior to version 1.0.7, the djust live transport resolves the LiveView to mount from a client-supplied dotted path by calling `__import__(module_path, ...)`. The module is imported — running its top-level code (import side effects) — before the framework checks that the resolved object is a `LiveView` subclass and before any per-view authentication. The `LIVEVIEW_ALLOWED_MODULES` allowlist that should contain this is fail-open (`if allowed_modules:` — skipped when the setting is unset, the framework default) and uses loose `startswith` matching. An unauthenticated WebSocket client (the WS handshake does not require auth; per-view auth runs only after import + instantiate) can therefore send a `mount` / `live_redirect_mount` / `url_change` frame (or an SSE mount) with `view = \"<any.importable.module>.AnyName\"` and cause the server to import — and execute the top-level code of — any importable Python module by name. Version 1.0.7 fixes the issue with a fail-closed resolution gate (`djust._view_resolution.is_view_import_allowed`): a client view path resolves only if (a) its module is already loaded (`sys.modules` — so resolving runs no new code; URL-routed views loaded by URLconf at startup keep working with zero config) or (b) it matches `LIVEVIEW_ALLOWED_MODULES` on a module-segment boundary (explicit opt-in for lazily-imported views). The gate runs before `__import__` at all three sinks (+ defense-in-depth inside `_instantiate_view`). As a workaround, set `LIVEVIEW_ALLOWED_MODULES` to the narrow list of modules that contain your mountable LiveView classes. (Note: pre-patch the allowlist is `startswith`-matched and the import still precedes the subclass check, so this is mitigation, not a complete fix.)","cvss_v4":{"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:H/VA:L/SC:N/SI:N/SA:N","score":8.8},"cvss_v3":null,"cwes":["CWE-470"],"references":["https://github.com/djust-org/djust/releases/tag/v1.0.7","https://github.com/djust-org/djust/security/advisories/GHSA-7prp-2623-8g45"],"products":[],"source":"nvd","synced_at":"2026-10-19T22:54:41.405518556+00:00"},"epss":{"cve":"CVE-2026-61599","score":0.00604,"percentile":0.48593,"date":"2026-10-25"},"kev":null,"osv":[{"id":"GHSA-7prp-2623-8g45","url":"https://osv.dev/vulnerability/GHSA-7prp-2623-8g45","summary":"djust has an unauthenticated arbitrary module import via the WebSocket/SSE view-mount path","modified":"2026-10-01T17:55:40.963305125Z","packages":[{"ecosystem":"PyPI","name":"djust","purl":"pkg:pypi/djust","ranges":["<1.0.7"],"fixed":["1.0.7"]}]},{"id":"PYSEC-2026-4038","url":"https://osv.dev/vulnerability/PYSEC-2026-4038","summary":"djust has an unauthenticated arbitrary module import via the WebSocket/SSE view-mount path","modified":"2026-10-01T17:45:02.043021561Z","packages":[{"ecosystem":"PyPI","name":"djust","purl":"pkg:pypi/djust","ranges":["<1.0.7"],"fixed":["1.0.7"]}]}],"attribution":["This product uses the NVD API but is not endorsed or certified by the NVD.","EPSS scores: FIRST Exploit Prediction Scoring System, https://www.first.org/epss","Known exploited vulnerabilities: CISA Known Exploited Vulnerabilities Catalog, https://www.cisa.gov/known-exploited-vulnerabilities-catalog","Package advisories: OSV (https://osv.dev), from the GitHub Advisory Database, PyPA, Go, RustSec and other ecosystem databases, under CC-BY 4.0 or CC0","CVE records: the CVE Program's CVE List (https://www.cve.org), under its terms of use (https://www.cve.org/Legal/TermsOfUse). CVE is a registered trademark of The MITRE Corporation; this product is not affiliated with the CVE Program."]}