Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as step-creating user or import bundle
-
DeliveryStore malicious Jinja2 in wizard step Markdown
-
ExploitVictim/admin loads GET /wizard/{server}/{idx}
-
ExecutionSSTI evaluates in non-sandboxed Jinja2
-
PersistExecute OS commands as app user
-
ImpactExfiltrate SECRET_KEY, credentials, and database
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V1 - Encoding and Sanitization Template injection prevention
|
| Exploitation Conditions | Requires an account with privileges to create or edit wizard steps, OR administrator access to import an untrusted bundle through POST /settings/wizard/import - this is the concrete prerequisite, matching PR:H. The vulnerable sinks are the non-sandboxed Jinja2 rendering in app/blueprints/wizard/routes.py (_render), plus app/jinja_filters.py (render_jinja) and app/services/wizard_widgets.py. Execution triggers when a stored step is rendered at GET /wizard/{server}/{idx}; no victim user interaction beyond rendering is needed (UI:N). Exploitation is limited to Wizarr instances prior to 2026.9.1 and to attackers who already hold step-authoring or bundle-import privileges, which substantially narrows the realistic attacker population to trusted-but-malicious users or admins tricked into importing attacker-supplied bundles. Exploitation status: no public exploit identified at time of analysis. |
| Impact | This is a genuine high-priority vulnerability, not an inflated CVSS score. The CWE-1336 server-side template injection flaw lets stored Jinja2 content execute arbitrary Python in a non-sandboxed environment with application globals exposed, confirmed by the source-code diff (the fix replaces current_app.jinja_env.overlay/render_template_string with a locked-down render_wizard_template and adds nh3 HTML sanitization). The CVSS 3.1 vector (AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H, 9.1) is internally consistent: network-reachable, low complexity, scope change reflecting the jump from the web template context to OS command execution, SECRET_KEY disclosure, and database/credential access. The limiting signal is PR:H - exploitation requires privileges to create wizard steps or administrator rights to import a bundle, so this is a privileged-insider or malicious-untrusted-bundle scenario rather than anonymous internet exploitation. No EPSS score, KEV listing, or POC was provided in the input; absence of these is not evidence of safety but means there is no confirmed active exploitation or published exploit. Note a PR nuance: the description distinguishes 'an authenticated user able to create steps' (potentially lower privilege) from 'an administrator importing an untrusted bundle' - the scored vector uses PR:H, but the lower-privilege step-creation path may warrant PR:L; verify role requirements against the Wizarr RBAC model. |
| Exploit ScenarioDerived | An authenticated Wizarr user with permission to create or edit wizard steps (or an administrator importing a malicious bundle via POST /settings/wizard/import) stores Markdown containing a Jinja2 payload. When GET /wizard/{server}/{idx} renders the step, the payload executes arbitrary Python as the application user, running OS commands, exfiltrating the Flask SECRET_KEY and connected media-server credentials, and reading the database. No public exploit code was identified in the provided data. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 09, 2026
Server-side template injection in Wizarr before 2026.9.1 allows an authenticated user with privileges to create or edit wizard steps - or an administrator who imports an attacker-supplied wizard bundle - to execute arbitrary Python in the context of the application process. Because the stored step Markdown is compiled by the application's non-sandboxed Jinja2 environment with application globals exposed, successful exploitation can run operating-system commands as the application user, disclose the Flask SECRET_KEY, reach connected media-server service credentials and the database, and inject stored cross-site scripting into pages rendered at GET /wizard/{server}/{idx}. The issue is rated 9.1 (CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H) and is fixed in 2026.9.1; no public exploit code was identified at the time of analysis, and the PR:H prerequisite narrows the realistic attacker population to trusted-but-malicious insiders or admins socially engineered into importing a hostile bundle.
RemediationAI
Upgrade to Wizarr 2026.9.1 or later - the vendor-released patch - which replaces direct Jinja rendering of stored step content with an isolated template helper, tokens out widget placeholders so they are never parsed as templates, and runs rendered HTML through an nh3 sanitizer. Until the upgrade can be applied, restrict the ability to create or edit wizard steps to fully trusted administrators and never import wizard bundles from untrusted or third-party sources, since POST /settings/wizard/import is a direct path to the vulnerable renderer; disabling or removing the wizard feature entirely, if not needed, eliminates the attack surface. Treat these as compensating controls only - they reduce exposure but do not remove the code-execution sink, and locking down step authoring degrades the delegated workflows Wizarr is designed to provide. Because exploitation yields OS command execution as the application user and exposes the Flask SECRET_KEY plus connected media-server credentials and the database, any instance where an untrusted step or bundle was ever created or imported should be treated as compromised: rotate the SECRET_KEY (invalidating sessions), rotate Jellyfin/Plex/Emby and any database credentials stored in configuration, audit wizard steps for suspicious template syntax, and review the host for persistence. No public exploit code was identified at the time of analysis, which lowers the near-term urgency for airtight instances but does not reduce the impact if the PR:H prerequisite is met.
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 root cause is CWE-1336 (improper neutralization of special elements used in a template engine), i.e. classic server-side template injection. Wizarr renders administrator- and author-supplied wizard step content - either entered through the step editor or carried inside an imported bundle - by passing it to the application's live Jinja2 environment. The patch diff shows that app/blueprints/wizard/routes.py previously built the template via current_app.jinja_env.overlay(autoescape=False) and called template.render(**render_ctx) on the stored Markdown, after a context copy that deliberately re-exposed the entire config dictionary as a top-level settings variable; app/jinja_filters.py's render_jinja filter called Flask's render_template_string(text) on arbitrary input, and app/services/wizard_widgets.py contained further evaluation sinks. Since the environment is not a jinja2.sandbox.SandboxedEnvironment and full application globals (including Flask's config and helper functions) were reachable, template syntax such as {{ config }} or Python object-traversal payloads yields code execution rather than mere data interpolation. The CPE cpe:2.3:a:wizarrrr:wizarr:*:*:*:*:*:*:*:* confirms the Wizarr application is the affected component. The fix (commit 6aa3c33c1b3d945e055ef116cc531028b3735bb7) introduces app/services/wizard_templates.py, which renders stored templates through a context-isolated helper with no access to the application environment, plus app/services/wizard_html.py, which uses the nh3 HTML sanitizer to strip scripts and application actions while permitting a constrained allowlist of display markup (including a single pinned discord.com/widget iframe that is force-sandboxed). The rewritten _render also extracts widget placeholders into opaque tokens before Jinja rendering and substitutes them afterwards, so widget syntax is no longer parsed as a template.
Know when Wizarr 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
AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H
Network-rendered template requires step-authoring/bundle-import privileges (PR:H), low complexity; SSTI escapes the web context to OS command execution (S:C) with full C/I/A impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Wizarr is an advanced user invitation and management system for Jellyfin, Plex, Emby, and other media servers. Prior to 2026.9.1, wizard step Markdown supplied through the editor or imported bundles was evaluated by app/blueprints/wizard/routes.py in the application's non-sandboxed Jinja2 environment with application globals exposed. An authenticated user able to create steps, or an administrator importing an untrusted bundle through POST /settings/wizard/import, could execute arbitrary Python when GET /wizard/{server}/{idx} rendered the stored step; app/jinja_filters.py and app/services/wizard_widgets.py contained additional evaluation sinks. This could execute operating-system commands as the application user, disclose the Flask SECRET_KEY, access connected service credentials and the database, and produce stored cross-site scripting. This issue is fixed in 2026.9.1.
Articles & Coverage 1
Technical POC Analysis
CWE-1336: Improper Neutralization of Special Elements Used in a Template Engine.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Wizarr, the self-hosted wizard and invite-management front end for media servers such as Plex and Jellyfin, contains a critical template-injection flaw (CVE-2026-108264) that lets an already-privileged account turn ordinary wizard-step content into arbitrary code running as the Wizarr service account. Because those permissions are normally held by trusted staff or administrators, the realistic exposure is a malicious insider or an administrator tricked into importing a tampered wizard bundle, and successful abuse can expose the application's signing secret, connected media-server credentials, and database contents while also planting persistent browser-side scripts for end users. Leadership should treat this as a trusted-insider and supply-chain risk to the identity and credential material underpinning the media platform, not merely as an application bug.
No vendor-released patch is confirmed as available at time of analysis, though the advisory references a fix in 2026.9.1. Interim mitigations: restrict wizard-step create/edit and bundle-import permissions to a minimal set of trusted administrators, block import of externally supplied or untrusted wizard bundles, avoid internet exposure of the Wizarr interface, and rotate the Flask SECRET_KEY, connected media-server service credentials, and database credentials that could be disclosed. Note that the vulnerability requires PR:H, so an authenticated high-privilege account is needed; no public exploit code was identified at the time of analysis. Apply vendor patch (2026.9.1) as soon as it is obtainable.
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
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
EUVD-2026-95995
NVD
CVE.org
EPSS
GitHub
Exploit-DB