【中危】v2 安全更新(GHSA-8xwf-rjm4-xvhv)
安全情报快照 · 风险级别:中危 · CVE-2026-50162 · GHSA-8xwf-rjm4-xvhv
先看结论
v2存在安全风险,< 2.6.1 受影响,建议升级至 2.6.1。
影响范围
| 生态 | 组件 | 受影响版本 | 首个修复版本 |
|---|---|---|---|
| go | oras.land/oras-go/v2 |
< 2.6.1 | 2.6.1 |
处置建议
优先将 oras.land/oras-go/v2 升级至 2.6.1 或更高版本;升级前请结合业务依赖完成兼容性验证。
上游技术详情(原文)
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 bypushFile())
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
- Attacker provides a blob title (via
ocispec.AnnotationTitle) that contains a path likeout/pwn.txt. - Victim uses
oras-gofile store withAllowPathTraversalOnWrite=falseand aworkingDirthat contains a symlink directoryout -> /some/outside/dir. - The lexical boundary check accepts
out/pwn.txtas being underworkingDir. - 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 outsideworkingDir - control (no symlink component): prints
[NC_MARKER]and confirms no outside write occurs
run:
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
来源与许可
- GitHub Advisory GHSA-8xwf-rjm4-xvhv
- https://github.com/oras-project/oras-go/security/advisories/GHSA-8xwf-rjm4-xvhv
- https://github.com/oras-project/oras-go/commit/cc323e564d90c6b5b4bdd71d3c8d2ee2713b37e5
本页自动同步 GitHub Advisory Database 的公开数据,并保留上游原文供核验;不宣称原创分析。数据许可:CC-BY-4.0。
评论
登录 后参与讨论。
还没有评论,来说两句。