Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate to MoviePilot
-
DeliveryCraft workflow context with legacy base64 pickle payload
-
ExploitTrigger WorkflowExecutor.restore_context
-
Executionpickle.loads deserializes payload
-
ImpactExecute arbitrary code on host
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A08:2025 - Software or Data Integrity Failures
ASVS 5.0
V1 - Encoding and Sanitization Safe deserialization, type allowlists
MITRE ATT&CK
2 techniques across 2 tactics: Execution, Initial Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires access to the authenticated Workflow feature (CVSS PR:H in the supplied vector; at minimum an authenticated account). The concrete prerequisite is a workflow whose stored context contains the legacy format - a 'content' key holding a base64-encoded Python pickle - which pre-3.1.3 restore_context deserializes via pickle.loads; the fork endpoint additionally propagated an attacker-supplied 'context' field from shared/forked workflows into that stored context. Limiting factors: the attacker must hold valid credentials/privileges (not a default-unauthenticated path), the vulnerable code path is the deprecated Base64 Pickle legacy format, and exploitation depends on the crafted context being loaded by WorkflowExecutor. Post-patch, the legacy pickle branch is removed (empty context used) and fork ignores the shared context entirely. |
| Impact | This is a CWE-502 Python pickle deserialization flaw in MoviePilot's WorkflowExecutor.restore_context. The signals are mixed. The supplied CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:H/UI:N, score 5.1) describes a remotely reachable, low-complexity, no-interaction issue but requires high privileges and rates each impact as Low (VC:L/VI:L/VA:L). That impact rating is in tension with the actual mechanism: the source diff confirms restore_context ran base64.b64decode + pickle.loads on attacker-influenceable workflow context, and the added test uses a __reduce__ callback payload - the hallmark of arbitrary code execution, which normally warrants High impact rather than Low. No EPSS score and no CISA KEV entry are provided, so there is no evidence of active exploitation or a measured exploitation probability. A public PoC reference exists (0xGenesi write-up) but the input flags it as not verified as working exploit code. The vuln.today decision label is 'this_month' (not act_now/emergency), consistent with an authenticated-only vector and absence of active exploitation. Net: a genuine deserialization-to-code-execution bug gated behind authentication (PR:H/PR:L) in a niche self-hosted product - real and worth patching on the stated this-month cadence, but not an internet-wide emergency. Note the discrepancy: vendor impact metrics (Low) understate pickle RCE - verify impact independently. |
| Exploit ScenarioDerived | An authenticated user supplies a workflow whose context carries a legacy base64-encoded pickle in the 'content' field (for example via the Workflow fork/share feature). When WorkflowExecutor initializes and calls restore_context, the pre-3.1.3 code deserializes that payload with pickle.loads, running the attacker's __reduce__ callback as code. A public PoC reference exists but is not verified as working exploit code. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Nov 02, 2026
MoviePilot through 3.1.2 deserializes untrusted Python pickle data when restoring saved workflow execution context, and the workflow fork endpoint copied an attacker-supplied 'context' field from shared workflow payloads straight into that stored context, so a crafted shared workflow can trigger code execution on the instance that forks or later runs it. Exploitation requires an authenticated account with access to the Workflow feature (CVSS 4.0 PR:H in the supplied vector; the independently assessed 3.1 vector scores PR:L) and depends on the legacy Base64 pickle 'content' format being loaded by WorkflowExecutor.restore_context. A public PoC reference exists; it is not verified as working exploit code, no confirmed active exploitation (CISA KEV) has been reported, and the vendor has fixed the issue in 3.1.3.
RemediationAI
Upgrade MoviePilot to 3.1.3, the vendor-released fix (release https://github.com/jxxghp/MoviePilot/releases/tag/v3.1.3, PR https://github.com/jxxghp/MoviePilot/pull/6930, commit https://github.com/jxxghp/MoviePilot/commit/6034dcc880c13079aeb398dbe32c346ebcd3a6d2), which removes the Base64/pickle branch from WorkflowExecutor.restore_context and makes the fork endpoint ignore the shared 'context' field entirely; note the accepted side effect that workflows still carrying a legacy Base64 pickle context will restart from an empty context and lose their saved progress and node outputs, so in-flight workflows should be completed or re-created before upgrading. If upgrading cannot be done immediately, the actionable compensations are: restrict access to the Workflow feature and its fork/share endpoints to trusted administrators only (trade-off: reduces collaboration/sharing functionality for regular users), and purge or rewrite stored workflow rows whose context contains a legacy 'content' key holding a Base64 pickle payload before any of those workflows is resumed (trade-off: affected workflows restart from scratch). Updating is the vendor's stated complete resolution; other hardening measures are not specified in the available sources.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw is CWE-502 (deserialization of untrusted data) in a Python application. MoviePilot stored workflow execution context in a legacy format where the workflow's context dict held a 'content' key with a Base64-encoded pickle blob; WorkflowExecutor.restore_context decoded it with base64.b64decode and then called pickle.loads on the result. Python pickle is not a safe data format for untrusted input: unpickling honours __reduce__ / REDUCE opcodes, so any attacker who controls the serialized blob can name an arbitrary callable and its arguments, yielding arbitrary code execution in the MoviePilot process. The second half of the bug is the delivery path: the Workflow Fork Endpoint (app/application/workflow.py fork()) parsed a 'context' JSON field from shared workflow payloads and persisted it as the new workflow's context, meaning a publicly shared workflow definition could ship a malicious legacy-format context that would be deserialized on the victim instance. The vendor fix (PR 6930, commit 6034dcc880c13079aeb398dbe32c346ebcd3a6d2) removed the base64/pickle imports and the deserialization branch so legacy contexts are logged and replaced with an empty context, and changed fork() to always store 'context': {} while dropping the JSON-format validation of the shared context. Regression tests added with the patch use a _LegacyPayload class whose __reduce__ would record a call if unpickled, and assert the callback is never invoked and that the executor starts from empty workflow_context and node_outputs.
Know when Moviepilot gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/E:P
Network-reachable workflow feature with unsafe pickle.loads on attacker-controlled context yields code execution (C/I/A High); requires an authenticated account, so PR:L.
Primary rating from Vendor (VulDB).
CVSS VectorVendor: VulDB
Lifecycle Timeline
3DescriptionCVE.org
A vulnerability was determined in jxxghp MoviePilot up to 3.1.2. This vulnerability affects the function WorkflowExecutor.restore_context of the file app/chain/workflow.py of the component Workflow Fork Endpoint. Executing a manipulation can lead to deserialization. The attack can be launched remotely. The exploit has been publicly disclosed and may be utilized. Upgrading to version 3.1.3 is able to resolve this issue. This patch is called 6034dcc880c13079aeb398dbe32c346ebcd3a6d2. It is recommended to upgrade the affected component.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Insecure deserialization occurs when an application converts serialized data (a stream of bytes representing an object's state) back into a living object without proper validation.
More in Moviepilot
View allArbitrary OS command execution on hosts running MoviePilot through 3.1.5 is achievable when the product's LLM agent inge
Path traversal in MoviePilot's AliPan, U115, Rclone, and SMB cloud storage download handlers allows an attacker who cont
Server-side request forgery in MoviePilot v2's image proxy endpoint (/api/v1/system/img-proxy) allows authenticated atta
Improper authorization across multiple dashboard API endpoints in MoviePilot through version 2.13.5 allows any authentic
EUVD-2026-114923
GHSA-8gr5-327m-w3jx
NVD
CVE.org
EPSS
VulDB
Exploit-DB