Skip to main content

oras-go CVE-2026-50162

| EUVDEUVD-2026-45262 MEDIUM
External Control of File Name or Path (CWE-73)
2026-07-01 https://github.com/oras-project/oras-go GHSA-8xwf-rjm4-xvhv
6.9
CVSS 4.0 · Vendor: https://github.com/oras-project/oras-go
View

Attack ChainAIDerived

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

  1. Access
    Push malicious OCI artifact with crafted AnnotationTitle to accessible registry
  2. Delivery
    Victim pulls artifact into oras-go file store
  3. Exploit
    `resolveWritePath()` passes lexical `filepath.Rel` check on symlink path component
  4. Execution
    `pushFile()` opens path and OS follows symlink to external directory
  5. Impact
    File created outside `workingDir` in attacker-chosen location

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V5 - File Handling File name/path control
Exploitation Conditions

Exploitation requires all of the following conditions to be true simultaneously: (1) the application uses the oras-go file content store with AllowPathTraversalOnWrite=false explicitly set - this is the mode intended to enforce workingDir confinement and is the targeted security control; (2) one or more directory components under workingDir are symbolic links pointing to a location outside workingDir (e.g., workingDir/out -> /some/outside/dir); and (3) the attacker can influence the value of ocispec.AnnotationTitle on a blob being pulled into the file store, typically by controlling or compromising the OCI registry source. Exploitation is limited by the non-default symlink requirement in workingDir and by the need for attacker-controlled blob annotations from an untrusted OCI source. Systems that pull exclusively from internally controlled registries, or that enforce no symlinks exist under workingDir, are not exploitable regardless of library version.

Impact

No vendor CVSS vector was published alongside GHSA-8xwf-rjm4-xvhv, and no EPSS score is available, so quantitative risk comparison across signals is limited. The CVE is not in the CISA KEV catalog, indicating no confirmed widespread active exploitation at time of analysis. Real-world exploitability is constrained by two concurrent prerequisites: a symlink must pre-exist as a path component under workingDir (non-default; requires either misconfiguration or attacker pre-positioning), and the victim must pull from an untrusted OCI source where the attacker controls blob title annotations. In cloud-native CI/CD pipelines that pull OCI artifacts from third-party or shared registries, both conditions can plausibly co-exist, making the risk non-trivial in those environments. The integrity impact is potentially severe - writes can land in arbitrary filesystem locations writable by the process, enabling supply-chain-style attacks if the written content is subsequently executed. For isolated, registry-controlled deployments without symlinks under workingDir, practical risk is low despite the soundness of the confinement bypass.

Exploit ScenarioDerived

An attacker pushes a malicious OCI artifact to a shared or attacker-controlled registry with a blob whose ocispec.AnnotationTitle is set to out/backdoor.sh. A CI/CD pipeline running oras-go pulls the artifact into a workingDir that contains a symlink out -> /usr/local/bin (introduced, for example, by a prior build step or misconfiguration). The lexical check in resolveWritePath() approves out/backdoor.sh as residing within workingDir, and the OS-level write in pushFile() follows the symlink, placing backdoor.sh at /usr/local/bin/backdoor.sh, where it may be executed by a subsequent pipeline stage. A self-contained proof-of-concept demonstrating this exact behavior was included in the original researcher disclosure.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.5% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Jul 01, 2026

Symlink traversal in oras-go's file content store allows writes outside the intended workingDir boundary even when AllowPathTraversalOnWrite=false. Applications that pull OCI artifacts from untrusted registries where an attacker controls blob titles (ocispec.AnnotationTitle) are at risk if any directory component under workingDir is a symlink pointing to an external path. No confirmed active exploitation (not in CISA KEV), but a self-contained proof-of-concept was included in the researcher's disclosure, making reproduction straightforward given the prerequisites.

RemediationAI

The upstream fix is available at commit cc323e564d90c6b5b4bdd71d3c8d2ee2713b37e5 (https://github.com/oras-project/oras-go/commit/cc323e564d90c6b5b4bdd71d3c8d2ee2713b37e5); consumers should update their go.mod to a tagged release that includes this commit - verify inclusion via git log against the fix SHA, as a specific released version number is not confirmed in the available advisory data. As a compensating control, audit workingDir for symlink components using find $workingDir -type l and replace any symlink directories with real directories; this eliminates the traversal surface entirely without a library update, though it requires ongoing operational governance to enforce. A second mitigation is to restrict OCI pulls exclusively to internal, access-controlled registries, preventing attacker-controlled ocispec.AnnotationTitle values from reaching the vulnerable codepath - note this has the trade-off of blocking legitimate third-party artifact consumption. Do not rely on AllowPathTraversalOnWrite=false alone as a security boundary until the fix is applied, as this flag's protection is currently bypassed by symlink traversal.

Affected VersionsENISA

oras-go < 2.6.1

Affected Packages

go oras.land/oras-go/v2 fix: 2.6.1
euvd oras_go fix: 2.6.1

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in go, euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

oras-go is the canonical Go library implementing OCI Registry As Storage (ORAS), used by tooling that reads and writes OCI artifacts to and from registries. The vulnerable codepath is content/file/file.go:609 inside resolveWritePath(), which is invoked by pushFile() during blob materialization. When a blob is written to the file store, resolveWritePath() enforces the workingDir confinement boundary using a filepath.Rel-style lexical comparison to reject ../ escapes (CWE-73: External Control of File Name or Path). Critically, this check operates purely on the string representation of the path and never calls filepath.EvalSymlinks() or walks components with os.Lstat. Consequently, a path like out/pwn.txt clears the lexical guard even if out is a symlink to /external/dir; the subsequent os.Open/os.Create call in pushFile() follows the symlink at the OS level, materializing the file at /external/dir/pwn.txt. The affected package is oras.land/oras-go/v2 (CPE: pkg:go/oras.land_oras-go_v2).

Know when Canonical 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 (https://github.com/oras-project/oras-go) PRIMARY 6.9 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N
vuln.today AI 6.9 MEDIUM

Network delivery of malicious OCI artifact (AV:N); symlink prerequisite in workingDir raises complexity (AC:H); no victim-system privileges needed (PR:N); victim must pull artifact (UI:R); write escapes workingDir boundary into broader filesystem (S:C); no read impact (C:N); arbitrary file write is high integrity (I:H); incidental overwrite risk (A:L).

3.1 AV:N/AC:H/PR:N/UI:R/S:C/C:N/I:H/A:L
4.0 AV:N/AC:H/AT:P/PR:N/UI:P/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N
SUSE 5.3 MEDIUM
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N
Red Hat 5.3 MEDIUM

Primary rating from Vendor (https://github.com/oras-project/oras-go).

CVSS VectorVendor: https://github.com/oras-project/oras-go

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

Lifecycle Timeline

1
CVSS changed
Jul 17, 2026 - 20:22 NVD
6.9 (MEDIUM)

DescriptionCVE.org

The file content store in oras-go attempts to confine writes to workingDir when AllowPathTraversalOnWrite=false, but the guard is lexical and does not account for symlink traversal. If workingDir contains a symlink path component and an attacker-controlled blob title (via ocispec.AnnotationTitle) targets a path under that symlink, pushFile() can create a file outside workingDir.

relevant links

  • repository: https://github.com/oras-project/oras-go
  • commit: 03243809936cce826494b5506f724c6dc11115b1
  • callsite: content/file/file.go:609 resolveWritePath() (used by pushFile())

vulnerability details

pins: oras-project/oras-go@03243809936cce826494b5506f724c6dc11115b1

as-of: 2026-02-17

policy: GitHub Security Advisory (oras-project/oras-go)

callsite: content/file/file.go:609 resolveWritePath() → pushFile()

attacker control: Attacker controls the pushed name (ocispec.AnnotationTitle) and can select a path with a symlink path component under workingDir → resolveWritePath() blocks .. via filepath.Rel but does not prevent symlink traversal → pushFile() opens/creates the final path and follows the symlink → a file is created outside workingDir

root cause

resolveWritePath() enforces the write boundary using a filepath.Rel-style check against workingDir. This prevents ../ escapes but is purely lexical and does not resolve symlinks. If a path component under workingDir is a symlink to an external location, the subsequent filesystem operation in pushFile() follows that symlink and performs the write outside workingDir while still passing the lexical boundary check.

attack path

  1. Attacker provides a blob title (via ocispec.AnnotationTitle) that contains a path like out/pwn.txt.
  2. Victim uses oras-go file store with AllowPathTraversalOnWrite=false and a workingDir that contains a symlink directory out -> /some/outside/dir.
  3. The lexical boundary check accepts out/pwn.txt as being under workingDir.
  4. The write follows the symlink and creates /some/outside/dir/pwn.txt.

impact

This is a filesystem boundary bypass that permits writes outside workingDir when a symlink path component exists under workingDir. The concrete security impact depends on the runtime environment (what filesystem locations are writable by the process and what downstream consumers do with the written file), but the intended confinement guarantee is violated.

proof of concept

the attached poc.zip contains a small, self-contained go harness that demonstrates:

  • canonical (vulnerable): prints [CALLSITE_HIT] and [PROOF_MARKER] and shows the file is created outside workingDir
  • control (no symlink component): prints [NC_MARKER] and confirms no outside write occurs

run:

bash
unzip -q -o poc.zip -d /tmp
cd /tmp/poc-F-ORAS-SYMLINK-WRITE-001
make test

expected: when AllowPathTraversalOnWrite=false, file store writes should not be able to escape workingDir, including via symlink traversal.

actual: A symlink path component under workingDir allows writes to escape workingDir even when AllowPathTraversalOnWrite=false.

recommended fix

ensure confinement checks account for symlink traversal. Options include rejecting symlinks in any path component (walk components with os.Lstat), validating the resolved parent directory via EvalSymlinks and enforcing it remains under the resolved workingDir, or using an openat()-style approach so the check and open happen relative to a trusted directory file descriptor.

fix accepted when: The canonical PoC no longer prints [PROOF_MARKER] for the same attacker-controlled inputs.

cheers, Oleh

Threat Intelligence Overview

EPSS Score
0.5%
Top 60% exploitable
Prevalence
Medium
widely used Go library in cloud-native OCI artifact tooling
Threat Intel
1
1 source
Data Quality
7 sources
Confidence: High
EUVD NVD CVE.org EPSS GHSA Vendor GitHub VulDB

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 MEDIUM
CISA KEV No
Public POC No
EPSS 0.5%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
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· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
Yes
Human Impact· derived
Medium

Priority Score

35
Low Medium High Critical
KEV: 0
EPSS: +1
CVSS: +34
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

CVE-2011-3544 CRITICAL POC
9.8 Oct 19

Oracle Java SE JDK/JRE 7 and 6 Update 27 and earlier allows remote code execution with complete system compromise throug

CVE-2019-11043 CRITICAL POC
9.8 Oct 28

In PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11 in certain configurations of FPM setup it

CVE-2014-6271 CRITICAL POC
9.8 Sep 24

GNU Bash through 4.3 processes trailing strings after function definitions in the values of environment variables, which

CVE-2013-0422 CRITICAL POC
9.8 Jan 10

Multiple vulnerabilities in Oracle Java 7 before Update 11 allow remote attackers to execute arbitrary code by (1) using

CVE-2016-3714 HIGH POC
8.4 May 05

The (1) EPHEMERAL, (2) HTTPS, (3) MVG, (4) MSL, (5) TEXT, (6) SHOW, (7) WIN, and (8) PLT coders in ImageMagick before 6.

CVE-2017-12617 HIGH POC
8.1 Oct 04

When running Apache Tomcat versions 9.0.0.M1 to 9.0.0, 8.5.0 to 8.5.22, 8.0.0.RC1 to 8.0.46 and 7.0.0 to 7.0.81 with HTT

CVE-2016-8735 CRITICAL POC
9.8 Apr 06

Remote code execution is possible with Apache Tomcat before 6.0.48, 7.x before 7.0.73, 8.x before 8.0.39, 8.5.x before 8

CVE-2014-7169 CRITICAL POC
9.8 Sep 25

GNU Bash through 4.3 bash43-025 processes trailing strings after certain malformed function definitions in the values of

CVE-2014-0160 HIGH POC
7.5 Apr 07

The (1) TLS and (2) DTLS implementations in OpenSSL 1.0.1 before 1.0.1g do not properly handle Heartbeat Extension packe

CVE-2016-5195 HIGH POC
7.0 Nov 10

Race condition in mm/gup.c in the Linux kernel 2.x through 4.x before 4.8.3 allows local users to gain privileges by lev

CVE-2013-2423 LOW POC
3.7 Apr 17

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 17 and earlier, and

CVE-2023-4911 HIGH POC
7.8 Oct 03

Local privilege escalation in the GNU C Library (glibc) dynamic loader ld.so allows unprivileged local users on affected

Vendor StatusVendor

SUSE

Severity: Moderate

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