Severity by source
AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
Local because the victim must run install on an attacker-supplied archive (AV:L/UI:R), no prior privileges needed (PR:N), and the host-filesystem write escapes the container (S:C) yielding high confidentiality/integrity impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
4DescriptionCVE.org
proot-distro is a utility for managing proot containers. Prior to version 5.1.5, proot-distro install extracted plain tarball root filesystems through _extract_plain_tar() in proot_distro/commands/install.py and Docker layers through _apply_layer() in proot_distro/helpers/docker.py without validating archive-controlled symlink targets in member.linkname, allowing a malicious archive to plant an absolute host-path symlink and write files through it onto the host filesystem. This issue is fixed in version 5.1.5.
Articles & Coverage 1
AnalysisAI
Arbitrary host file write in termux/proot-distro before 5.1.5 lets a malicious rootfs tarball or Docker layer plant an absolute-path symlink during proot-distro install, so a follow-up file member is written through that symlink onto the host filesystem - outside the container, before it is ever run. The install/reset paths (_extract_plain_tar) and the Docker layer path (_apply_layer) validated member names for '..' traversal but never validated symlink targets in member.linkname. No public exploit identified at time of analysis and it is not in CISA KEV, but the flaw is confirmed and fully described by the vendor GHSA advisory with vulnerable source shown.
Technical ContextAI
proot-distro is a Termux/Android utility that installs and manages proot (unprivileged chroot-like) Linux distributions by unpacking rootfs tarballs and OCI/Docker image layers into a target directory. The root cause is CWE-61 (UNIX Symbolic Link Following): the extractor honored archive-controlled symlink targets verbatim via os.symlink(member.linkname, dest) with no clamp inside the destination root. The pre-existing guard only rejected '..'/'' components in the member name (rel_parts), leaving both absolute symlink targets and traversal via linkname unchecked. Because a symlink is materialized before a later regular-file member that references its name, Python's open() follows the planted symlink and writes outside rootfs_dir. The fix introduces helpers/tar_extract.py._safe_resolve/_safe_dest, which re-resolves each destination's parent through existing symlink components while clamping every hop inside the rootfs (re-rooting absolute targets to the guest '/'), and applies the same clamped resolution to hardlink source endpoints in restore.py and build_engine/copy_step.py.
RemediationAI
Vendor-released patch: upgrade to proot-distro 5.1.5 (pip install --upgrade proot-distro, or update via your Termux package source), which adds clamped symlink/hardlink resolution (_safe_resolve/_safe_dest) across the install, reset, restore, and build-engine extraction paths - see the fix commit https://github.com/termux/proot-distro/commit/a96d7a9667f38e45d812614852ee3915d1c0ae45, advisory https://github.com/termux/proot-distro/security/advisories/GHSA-9xq3-3fqg-4vg7, and release https://github.com/termux/proot-distro/releases/tag/v5.1.5. Until upgraded, the concrete compensating control is to only install rootfs tarballs and Docker/OCI images from trusted, integrity-verified sources (verify checksums/signatures) and avoid running proot-distro install, reset, or restore on archives from untrusted third parties; if you must inspect an unknown archive, extract it inside a disposable sandbox or unprivileged container first and audit for symlink members with absolute or traversal targets (e.g. tar -tvf listing link targets). The trade-off is that source-trust vetting is manual and does not protect against a compromised upstream mirror, so upgrading to 5.1.5 is strongly preferred over the workaround.
An issue was discovered in Appsmith before 1.52. Rated critical severity (CVSS 9.8), this vulnerability is remotely expl
runc through version 1.0-rc6 (used in Docker before 18.09.2) contains a container escape vulnerability that allows attac
Netmaker makes networks with WireGuard. Rated high severity (CVSS 7.5), this vulnerability is remotely exploitable, no a
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
The News & Blog Designer Pack - WordPress Blog Plugin - (Blog Post Grid, Blog Post Slider, Blog Post Carousel, Blog Post
Path traversal in JFrog Artifactory (CWE-22) enables an authenticated low-privilege user to write data outside the inten
Docker 1.3.2 allows remote attackers to execute arbitrary code with root privileges via a crafted (1) image or (2) build
Remote code execution in Gogs through 0.14.2 allows authenticated users (and unauthenticated attackers on default-config
Remote code execution in Flowise before 3.1.2 allows any authenticated user (or API caller with chatflow view/update per
Remote code execution in NocoBase Workflow Script Node (npm @nocobase/plugin-workflow-javascript) allows authenticated l
Docker Desktop Community Edition before 2.1.0.1 allows local users to gain privileges by placing a Trojan horse docker-c
Vasion Print (formerly PrinterLogic) Virtual Appliance Host prior to version 25.2.169 and Application prior to version 2
Same weakness CWE-61 – UNIX Symbolic Link (Symlink) Following
View allSame technique Information Disclosure
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-50408
GHSA-9xq3-3fqg-4vg7