Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessUpload file with crafted name
-
ExploitName passed to generate_thumbnail()
-
ExecutionShell metacharacters break out of os.system() string
-
ImpactArbitrary 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 |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
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 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
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
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.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
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.
Articles & Coverage 1
Executive ViewAI
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.
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
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
OS command injection occurs when an application passes unsanitized user input directly into system shell commands.
EUVD-2026-101278
GHSA-542h-xc5c-6hxm
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB