/

CVE-2026-105691

Severity:

CRITICAL RISK

(9.9)

OS Command Injection (CWE-78) in Penpot SVG Exporter

CVE-2026-105691

Deferred

Vulnerability type

Category:

OS Command Injection

CWE:

CWE-78

Impact:

Remote Code Execution

Severity:

CRITICAL RISK

(9.9)

CVSS version:

3.1

Catch this CVE while code is being written

Detect vulnerable code directly in pull requests, so CVEs are fixed before merge.

Summary

A critical OS command injection vulnerability in Penpot's SVG exporter allows attacker-controlled text color data to become part of a shell command. An attacker who can edit a design file, or access a malicious file through a valid public share link, may execute commands with the exporter service's privileges when SVG export is triggered.

A critical OS command injection vulnerability in Penpot's SVG exporter allows attacker-controlled text color data to become part of a shell command. An attacker who can edit a design file, or access a malicious file through a valid public share link, may execute commands with the exporter service's privileges when SVG export is triggered.

Affected context

The vulnerability occurs in Penpot deployments that use the SVG export functionality and process attacker-controlled text-object styling values. It becomes risky when a user can edit or share a crafted design file and the exporter constructs commands from those values without treating them strictly as data.

The vulnerability occurs in Penpot deployments that use the SVG export functionality and process attacker-controlled text-object styling values. It becomes risky when a user can edit or share a crafted design file and the exporter constructs commands from those values without treating them strictly as data.

Exploit preconditions

  • Attack surface: Penpot's SVG export service and its command-line image-processing workflow
  • Required access: Ability to edit a design file or provide a malicious file through an accessible public share link
  • Trigger point: SVG export of a file containing a crafted text object's fill-color value
  • Why exploitation is possible: The exporter incorporates attacker-controlled data into a command string executed by a child process
  • Attack surface: Penpot's SVG export service and its command-line image-processing workflow
  • Required access: Ability to edit a design file or provide a malicious file through an accessible public share link
  • Trigger point: SVG export of a file containing a crafted text object's fill-color value
  • Why exploitation is possible: The exporter incorporates attacker-controlled data into a command string executed by a child process

Why this happens

The underlying flaw is command construction from untrusted input. A user-controlled fill-color value is inserted into a shell command and passed to a process-execution API that interprets shell syntax, rather than being supplied as a safely separated argument.

This behavior maps to CWE-78: Improper Neutralization of Special Elements used in an OS Command, because input is allowed to influence command interpretation without adequate validation, escaping, or process isolation.

The underlying flaw is command construction from untrusted input. A user-controlled fill-color value is inserted into a shell command and passed to a process-execution API that interprets shell syntax, rather than being supplied as a safely separated argument.

This behavior maps to CWE-78: Improper Neutralization of Special Elements used in an OS Command, because input is allowed to influence command interpretation without adequate validation, escaping, or process isolation.

Potential impact

  • An attacker may execute arbitrary commands as the exporter service account.
  • The attacker could access or alter files available to the exporter process.
  • The compromise could enable theft or manipulation of design assets and service secrets.
  • The attacker could use the service as a foothold for lateral movement, depending on runtime permissions and network access.
  • Availability of export services could be disrupted.
  • An attacker may execute arbitrary commands as the exporter service account.
  • The attacker could access or alter files available to the exporter process.
  • The compromise could enable theft or manipulation of design assets and service secrets.
  • The attacker could use the service as a foothold for lateral movement, depending on runtime permissions and network access.
  • Availability of export services could be disrupted.

General mitigation guidance

Mitigation generally focuses on ensuring that user-controlled values never become shell syntax.

Common defensive patterns include:

  • Prefer direct process-spawning APIs that pass a fixed executable and an argument array without shell interpretation.
  • Validate color values against a strict allowlist or canonical format before processing.
  • Keep command templates fixed and separate data from executable arguments.
  • Run export workers with least-privilege identities, restricted filesystem access, and limited network permissions.
  • Apply container and process isolation so an exporter compromise has a constrained blast radius.
  • Treat public share links and imported design files as untrusted input and apply equivalent validation paths.
  • Maintain vendor-provided security fixes through the organization's normal secure release process.

Mitigation generally focuses on ensuring that user-controlled values never become shell syntax.

Common defensive patterns include:

  • Prefer direct process-spawning APIs that pass a fixed executable and an argument array without shell interpretation.
  • Validate color values against a strict allowlist or canonical format before processing.
  • Keep command templates fixed and separate data from executable arguments.
  • Run export workers with least-privilege identities, restricted filesystem access, and limited network permissions.
  • Apply container and process isolation so an exporter compromise has a constrained blast radius.
  • Treat public share links and imported design files as untrusted input and apply equivalent validation paths.
  • Maintain vendor-provided security fixes through the organization's normal secure release process.

How teams detect issues like this

Organizations can identify similar issues through:

  • Static analysis for shell command construction involving string concatenation or interpolation.
  • Searches for child-process APIs that invoke shells or execute dynamically assembled command strings.
  • Code review checks ensuring user-controlled design properties are validated before reaching process execution.
  • Tests using malformed or unexpected property values to confirm that export workflows do not interpret shell syntax.
  • Runtime monitoring for unusual child processes, command interpreters, outbound connections, or filesystem access from exporter workers.
  • Policy enforcement requiring argument-array process APIs and prohibiting shell execution for user-influenced data.

Automated code review and software composition tools may help flag risky process-execution patterns, but findings should be confirmed against the actual data flow.

Organizations can identify similar issues through:

  • Static analysis for shell command construction involving string concatenation or interpolation.
  • Searches for child-process APIs that invoke shells or execute dynamically assembled command strings.
  • Code review checks ensuring user-controlled design properties are validated before reaching process execution.
  • Tests using malformed or unexpected property values to confirm that export workflows do not interpret shell syntax.
  • Runtime monitoring for unusual child processes, command interpreters, outbound connections, or filesystem access from exporter workers.
  • Policy enforcement requiring argument-array process APIs and prohibiting shell execution for user-influenced data.

Automated code review and software composition tools may help flag risky process-execution patterns, but findings should be confirmed against the actual data flow.

Sources

SourceLink
github.comgithub.com/penpot/penpot/commit/aa3bc1ae984577f0354d4270d2546e15985f4bcf
github.comgithub.com/penpot/penpot/pull/11272
github.comgithub.com/penpot/penpot/releases/tag/2.18.0
github.comgithub.com/penpot/penpot/security/advisories/GHSA-4f36-m4hj-cv86

Frequently asked

questions

It can be remotely exploitable when an attacker can edit a design or make a malicious file available through a valid public share link and an affected service processes it through SVG export.

Not necessarily. The key requirement is the ability to influence a file or design property that reaches the exporter. The resulting command runs with the permissions of the exporter service.

Avoid shell interpretation entirely for exporter operations. Use fixed executables with separately supplied arguments, and strictly validate any user-controlled values before they are passed to external tools.

Combine strict input validation with secure process APIs, least-privilege exporter workers, isolation controls, and monitoring for unexpected child-process behavior.

It can be remotely exploitable when an attacker can edit a design or make a malicious file available through a valid public share link and an affected service processes it through SVG export.

Not necessarily. The key requirement is the ability to influence a file or design property that reaches the exporter. The resulting command runs with the permissions of the exporter service.

Avoid shell interpretation entirely for exporter operations. Use fixed executables with separately supplied arguments, and strictly validate any user-controlled values before they are passed to external tools.

Combine strict input validation with secure process APIs, least-privilege exporter workers, isolation controls, and monitoring for unexpected child-process behavior.

Find out what's already
exploitable in your codebase.