Vulnerability DatabaseCVE-2026-103975

CVE-2026-103975: 
JavaScript vulnerability analysis and mitigation

Overview

CVE-2026-103975 is a symlink-based Zip Slip vulnerability in the @appium/support package's ZIP extraction functionality, allowing arbitrary file writes outside the intended extraction directory. It affects all versions of @appium/support up to and including 7.2.5, and was fixed in version 7.2.6. The vulnerability was originally reported by researcher nikkoenggaliano, published to the GitHub Advisory Database on August 17, 2026, and assigned CVE ID on October 14, 2026. It carries a CVSS v3.1 base score of 6.5 (Medium) (Github Advisory).

Technical details

The root cause is classified as CWE-59 (Improper Link Resolution Before File Access / 'Link Following'). The extractAllTo function in @appium/support/build/lib/zip.js performs only a lexical string comparison (isSubPath) on each archive entry's name to verify containment within the extraction directory, but never resolves symlinks or validates their targets. An attacker crafts a ZIP archive with two entries: first, a symlink entry (e.g., pwn) whose body contains a path pointing outside the extraction root, and second, a regular file entry (e.g., pwn/owned.txt) whose name lexically appears safe. When the extractor processes the second entry, dir/pwn/owned.txt passes the name-based check, but the write follows the symlink and lands outside the extraction root. This is distinct from the earlier CVE-2026-30973 (fixed in 7.0.6), which used ../ in entry names; this bypass uses only legitimate entry names with no path traversal sequences (Github Advisory, Fix PR).

Impact

An attacker who can supply a malicious ZIP archive to an Appium process can write arbitrary files to any filesystem location writable by the Appium service account. This can result in overwriting configuration files, dropping scripts into startup or profile directories, or replacing binaries on the PATH, all of which can escalate to code execution. In CI/CD pipelines or device farm environments — common Appium deployment contexts — the reachable writable paths may include sensitive system or service account directories, amplifying the risk of full host compromise (Github Advisory).

Exploitability

A proof-of-concept (PoC) is publicly available in the GitHub Security Advisory, consisting of a Python script (build_zips.py) to craft the malicious ZIP and a Node.js script (zipslip_poc.js) to trigger extraction and confirm the file write escape. Exploitation requires user interaction — specifically, a user or automated process must cause Appium to extract an attacker-controlled archive. There is no evidence of in-the-wild exploitation at this time, and the vulnerability is not listed in the CISA KEV catalog. The EPSS score is approximately 0.648%, and NVD SSVC classifies exploitation as 'poc' with automation rated 'no' (Github Advisory, Feedly).

Exploitation steps

  1. Craft the malicious ZIP: Use the public PoC Python script (build_zips.py) to create a ZIP archive (symlink_bypass.zip) containing two entries: a symlink entry named pwn whose body is the absolute path of a target directory outside the extraction root (e.g., /tmp/zswork/escapeB), and a regular file entry named pwn/owned.txt with arbitrary content.
  2. Deliver the archive: Provide the malicious ZIP to a system where Appium (version ≤ 7.2.5) will extract it — for example, by hosting it as a plugin, driver, or resource that Appium downloads and extracts, or by supplying it through any interface that triggers zip.extractAllTo().
  3. Trigger extraction: Cause the Appium process to call extractAllTo(zipB, extractDir). The extractor processes the pwn symlink entry, creates a symlink at extractDir/pwn pointing to the attacker-controlled external path, then processes pwn/owned.txt, which passes the lexical containment check but resolves through the symlink to write outside the extraction root.
  4. Achieve arbitrary file write: The file owned.txt (or any payload) is written to the attacker-specified external directory. By targeting writable locations such as ~/.bashrc, cron directories, or PATH binaries, the attacker can escalate to code execution under the Appium service account (Github Advisory).

Indicators of compromise

  • File System: Unexpected files appearing outside the Appium extraction/working directory, particularly in home directories, /etc/, cron directories, or PATH locations; presence of symlinks within Appium's extraction directories pointing to locations outside those directories.
  • Logs: Appium process logs showing ZIP extraction activity followed by unexpected file creation events in sensitive directories; OS-level audit logs (e.g., auditd) recording file writes by the Appium process to paths outside its expected working directories.
  • Process: Unexpected processes spawned by the Appium Node.js process (e.g., shell commands, scripts) following a ZIP extraction event, which may indicate a dropped payload was executed.
  • Network: Outbound connections from the Appium host to unknown external IPs shortly after ZIP extraction, potentially indicating a reverse shell or data exfiltration payload was triggered (Github Advisory).

Mitigation and workarounds

Upgrade @appium/support to version 7.2.6 or later, which resolves the issue by replacing the lexical isSubPath check with a realpath-based isContainedPath function that validates symlink targets and resolves the actual filesystem destination before writing (Fix PR, Release). As interim mitigations, restrict the Appium process to the minimum necessary filesystem write permissions, avoid extracting untrusted ZIP archives, and consider scanning archives for symlink entries before extraction. Running Appium with a dedicated low-privilege service account limits the blast radius if exploitation occurs (Github Advisory).

Additional resources


Source: This report was generated using AI

Related JavaScript vulnerabilities:

CVE ID

Severity

Score

Technologies

Component name

CISA KEV exploit

Has fix

Published date

CVE-2026-104150HIGH8.7
  • JavaScript logoJavaScript
  • grafana-postgres
NoYesOct 15, 2026
CVE-2026-100409HIGH7.5
  • JavaScript logoJavaScript
  • @opennextjs/cloudflare
NoYesOct 15, 2026
CVE-2026-102527MEDIUM6.9
  • JavaScript logoJavaScript
  • nuxt-og-image
NoYesOct 15, 2026
CVE-2026-103975MEDIUM6.5
  • JavaScript logoJavaScript
  • @appium/support
NoYesOct 14, 2026
CVE-2026-76894LOW3.1
  • JavaScript logoJavaScript
  • @aborruso/ckan-mcp-server
NoYesOct 16, 2026

Free Vulnerability Assessment

Benchmark your Cloud Security Posture

Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.

Request assessment

Get a personalized demo

Ready to see Wiz in action?

"Best User Experience I have ever seen, provides full visibility to cloud workloads."
David EstlickCISO
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
Adam FletcherChief Security Officer
"We know that if Wiz identifies something as critical, it actually is."
Greg PoniatowskiHead of Threat and Vulnerability Management