Skip to main content

MoviePilot EUVDEUVD-2026-114923

| CVE-2026-120320 LOW
Deserialization of Untrusted Data (CWE-502)
2026-11-02 VulDB GHSA-8gr5-327m-w3jx
2.0
CVSS 4.0 · Vendor: VulDB
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate to MoviePilot
  2. Delivery
    Craft workflow context with legacy base64 pickle payload
  3. Exploit
    Trigger WorkflowExecutor.restore_context
  4. Execution
    pickle.loads deserializes payload
  5. Impact
    Execute 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.

Monitor Track and reassess. Why: LOW severity (CVSS 0.1-3.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

MoviePilot 3.1.0
MoviePilot 3.1.2
MoviePilot 3.1.1

Affected Packages

euvd moviepilot no fix

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

Vendor (VulDB) PRIMARY 2.0 MEDIUM
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
vuln.today AI 8.8 HIGH

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.

3.1 AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
4.0 AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (VulDB).

CVSS VectorVendor: VulDB

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
High
User Interaction
None
Vulnerable system: Confidentiality
Low
Vulnerable system: Integrity
Low
Vulnerable system: Availability
Low
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

3
Severity Changed
Nov 02, 2026 - 02:22 NVD
MEDIUM LOW
CVSS changed
Nov 02, 2026 - 02:22 NVD
5.1 (MEDIUM) 2.0 (LOW)
CVE Published
Nov 02, 2026 - 01:30 cve.org
MEDIUM 5.1

DescriptionCVE.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

EPSS Score
0.4%
Top 67% exploitable
Prevalence
Low
self-hosted media automation tool, hobbyist/home-lab niche, no enterprise footprint
Exploit
POC
Public exploit code exists
Data Quality
6 sources
Confidence: High

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.

SignalValue
Severity LOW
CISA KEV No
Public POC Yes
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
LOW severity (CVSS 0.1-3.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
Poc
System Exposure· derived
Open
Automatable· derived
No
Human Impact· derived
Low

Priority Score

30
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +10
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

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.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy