CVE-2026-28385: CVE-2026-28385: Server-Side Request Forgery in Canonical LXD Image Import
CVE-2026-28385: Server-Side Request Forgery in Canonical LXD Image Import
> Vulnerability ID: CVE-2026-28385
> CVSS Score: 5.0
> Published: 2026-11-06
CVE-2026-28385 (GHSA-3gq2-x4qg-p4g6) is a Server-Side Request Forgery (SSRF) vulnerability in Canonical LXD versions 4.12 through 6.9. An authenticated user possessing the can_create_images entitlement can force the LXD daemon to execute arbitrary outbound HTTP and HTTPS requests via the /1.0/images API endpoint. Due to the absence of egress destination validation, an attacker can probe host loopback services, RFC 1918 private network segments, and cloud Instance Metadata Services (IMDS) from the network position of the privileged LXD daemon.
TL;DR
Authenticated LXD users with image creation privileges can abuse the URL image import functionality to perform error-based port scanning and interact with internal HTTP services across loopback, private networks, and cloud metadata endpoints.
---
Technical Details
- Vulnerability Class: CWE-918: Server-Side Request Forgery (SSRF)
- CVSS v3.1 Score: 5.0 Medium (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:N/A:N)
- Attack Vector: Network via REST API (POST /1.0/images)
- Authentication Required: Yes (User with can_create_images entitlement)
- EPSS Score: 0.28% (20.30th Percentile)
- Affected Versions: Canonical LXD 4.12 through 6.9
- Patched Version: Canonical LXD 6.10
- CISA KEV Status: Not Listed
Affected Systems
- Canonical LXD (versions 4.12 through 6.9)
- LXD: >= 4.12, <= 6.9 (Fixed in: 6.10)
Code Analysis
Commit: 5976c92
doc: update guide to hardening security for LXD (#18462)
Commit: c4a919f
Image registries switchover (#17680)
Commit: 4bbdb17
lxd: Add backward-compatible translation of deprecated image source fields
Mitigation Strategies
- Upgrade Canonical LXD to version 6.10 or later to enforce centralized Image Registries and disable arbitrary URL image imports.
- Route all LXD daemon outbound HTTP and HTTPS connections through a hardened egress proxy that blocks loopback (127.0.0.0/8, ::1), RFC 1918 private subnets, and link-local cloud metadata (169.254.169.254) addresses.
- Audit RBAC policies and revoke the can_create_images entitlement from untrusted users or multi-tenant roles.
- Enable project-level registry restrictions (restricted.registries=builtin) on multi-tenant LXD projects.
- Restrict network exposure of the LXD REST API by binding core.https_address to a dedicated management interface rather than all interfaces.
Remediation Steps:
1. Upgrade the LXD snap or package to version 6.10 or newer: snap refresh lxd --channel=latest/stable
2. Configure an outbound filtering proxy in LXD: lxc config set core.proxy_http "http://<proxy_ip>:<port>" and lxc config set core.proxy_https "http://<proxy_ip>:<port>"
3. Restrict untrusted projects to approved image registries: lxc project set <project_name> restricted.registries=builtin
4. Verify the API listening address is restricted to a management network: lxc config get core.https_address
References
- CVE-2026-28385 Official CVE Record
- NVD Vulnerability Detail: CVE-2026-28385
- GitHub Security Advisory: GHSA-3gq2-x4qg-p4g6
- GitHub Pull Request #18462: Update Guide to Hardening Security for LXD
- GitHub Commit 5976c92: Hardening Guide Update
- GitHub Commit c4a919f: Image Registries Switchover
- GitHub Commit 4bbdb17: Transitional Image Source Allowlist
- Canonical LXD Security Hardening Documentation: Restrict Outbound Requests
---
Read the full report for CVE-2026-28385 on our website for more details including interactive diagrams and full exploit analysis.
GHSA-9J25-MM2H-2F76: CVE-2026-48750: Arbitrary File Write on Host via exec-output Symlink in Canonical LXD and Incus
CVE-2026-48750: Arbitrary File Write on Host via exec-output Symlink in Canonical LXD and Incus
> Vulnerability ID: GHSA-9J25-MM2H-2F76
> CVSS Score: 9.9
> Published: 2026-11-06
Canonical LXD and LXC Incus contain an arbitrary file write vulnerability (CWE-73 / CWE-59) in the /1.0/instances/<name>/exec REST API endpoint. When an instance is unpacked from an image archive, top-level symbolic links are extracted directly onto the host filesystem within the instance storage directory. If a crafted image includes a symbolic link named exec-output pointing to an arbitrary host path, invoking the execution endpoint with record-output: true causes the privileged host daemon to follow the symlink and write command output files directly to the target host directory. An authenticated attacker with permissions to import images and execute commands can exploit this flaw to write controlled content to sensitive host directories such as /etc/cron.d, resulting in arbitrary code execution on the host as root.
TL;DR
An unsanitized symlink named exec-output inside a crafted container image allows authenticated LXD and Incus users to write arbitrary command output to any directory on the host filesystem when invoking the /exec endpoint with record-output: true, leading to host-level privilege escalation and arbitrary code execution as root.
---
⚠️ Exploit Status: POC
Technical Details
- CVE Identifier: CVE-2026-48750 (GHSA-9j25-mm2h-2f76)
- Weakness Class: CWE-73: External Control of File Name or Path / CWE-59: Symlink Following
- CVSS v3.1 Score: 9.9 Critical (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H)
- EPSS Score: 0.78% (56.22nd Percentile)
- Attack Vector: Authenticated REST API (/1.0/instances/<name>/exec with record-output: true)
- Security Impact: Arbitrary file creation on host leading to root code execution (Container Escape)
- Exploit Maturity: Public Proof-of-Concept (PoC) Available
- CISA KEV Status: Not Listed
Affected Systems
- Canonical LXD
- LXC Incus
- LXD (4.0 LTS): >= 4.0.0, < 4.0.11 (Fixed in: 4.0.11)
- LXD (5.0 LTS): >= 5.0.0, < 5.0.7 (Fixed in: 5.0.7)
- LXD (5.x / 5.21 LTS): >= 5.1.0, < 5.21.5 (Fixed in: 5.21.5)
- LXD (6.x): >= 6.0.0, < 6.9.0 (Fixed in: 6.9.0)
- Incus: < 7.2.0 (Fixed in: 7.2.0)
Code Analysis
Commit: 124f901
lxd/instance_exec: Confine opening of exec outputs
--- a/lxd/instance_exec.go
+++ b/lxd/instance_exec.go
@@ -718,24 +716,24 @@ func instanceExecPost(d *Daemon, r *http.Request) response.Response {
var stdout, stderr *os.File
if post.RecordOutput {
- // Ensure exec-output directory exists
- execOutputDir := inst.ExecOutputPath()
- err = os.Mkdir(execOutputDir, 0600)
- if err != nil && !errors.Is(err, fs.ErrExist) {
+ execOutputRoot, err := inst.OpenExecOutput()
+ if err != nil {
return err
}
+ defer func() { _ = execOutputRoot.Close() }()
+
// Prepare stdout and stderr recording.
stdoutFile := "exec_" + opID + ".stdout"
- stdout, err = os.OpenFile(filepath.Join(execOutputDir, stdoutFile), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
+ stdout, err = execOutputRoot.OpenFile(stdoutFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
if err != nil {
return err
}
defer func() { _ = stdout.Close() }()
stderrFile := "exec_" + opID + ".stderr"
- stderr, err = os.OpenFile(filepath.Join(execOutputDir, stderrFile), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
+ stderr, err = execOutputRoot.OpenFile(stderrFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
if err != nil {
return err
}
Commit: 254b85c
lxd/instance/drivers/common: Helper to ensure opening of instance paths is confined
--- a/lxd/instance/drivers/driver_common.go
+++ b/lxd/instance/drivers/driver_common.go
@@ -4,6 +4,7 @@ import (
"context"
"errors"
"fmt"
+ "io/fs"
"net/http"
"os"
"path/filepath"
@@ -396,6 +397,64 @@ func (d *common) Path() string {
return storagePools.InstancePath(d.dbType, d.project.Name, d.name, d.isSnapshot)
}
+// openSubPath opens name as a confined [os.Root] beneath [common.Path], rejecting any attempt to
+// escape the instance path.
+func (d *common) openSubPath(name string) (*os.Root, error) {
+ parent, err := os.OpenRoot(d.Path())
+ if err != nil {
+ return nil, err
+ }
+
+ defer func() { _ = parent.Close() }()
+
+ root, err := parent.OpenRoot(name)
+ if err != nil {
+ return nil, fmt.Errorf("Failed opening %q for instance %q (path %s): %w", name, d.Name(), d.Path(), err)
+ }
+
+ return root, nil
+}
+
+// openOrCreateSubPath is like openSubPath but also creates the name if it does not exist.
+func (d *common) openOrCreateSubPath(name string, mode os.FileMode) (*os.Root, error) {
+ parent, err := os.OpenRoot(d.Path())
+ if err != nil {
+ return nil, err
+ }
+
+ defer func() { _ = parent.Close() }()
+
+ err = parent.Mkdir(name, mode)
+ if err != nil && !errors.Is(err, fs.ErrExist) {
+ return nil, fmt.Errorf("Failed creating %q for instance %q (path %s): %w", name, d.Name(), d.Path(), err)
+ }
+
+ root, err := parent.OpenRoot(name)
+ if err != nil {
+ return nil, fmt.Errorf("Failed opening %q for instance %q (path %s): %w", name, d.Name(), d.Path(), err)
+ }
+
+ return root, nil
+}
+
+// OpenRootfs opens the instance's rootfs directory as a confined *os.Root.
+// Caller must close the returned Root.
+func (d *common) OpenRootfs() (*os.Root, error) {
+ return d.openSubPath("rootfs")
+}
+
+// OpenExecOutput opens the instance's exec-output directory as a confined *os.Root, creating it if absent.
+// Caller must close the returned Root.
+func (d *common) OpenExecOutput() (*os.Root, error) {
+ return d.openOrCreateSubPath("exec-output", 0700)
+}
+
+// OpenTemplates opens the instance's templates directory as a confined *os.Root, creating it if absent.
+// Caller must close the returned Root.
+func (d *common) OpenTemplates() (*os.Root, error) {
+ return d.openOrCreateSubPath("templates", 0700)
+}
+
// ExecOutputPath returns the instance's exec output path.
func (d *common) ExecOutputPath() string {
return filepath.Join(d.Path(), "exec-output")
Commit: 4cd6334
lxd/instance/drivers/common: Helper to ensure opening of instance paths is confined (cherry-pick)
Commit: 937b761
lxd/instance_exec: Confine opening of exec outputs (cherry-pick)
Commit: bb0f252
lxd/instance_exec: Confine opening of exec outputs (cherry-pick)
Exploit Details
- GitHub Security Advisory (Canonical LXD): Official security advisory containing a shell script PoC demonstrating image repacking with an exec-output symlink and triggering file creation via the REST API.
- GitHub Security Advisory (LXC Incus): Upstream Incus security advisory with full reproduction steps and PoC script.
Mitigation Strategies
- Upgrade Canonical LXD or LXC Incus to the patched release corresponding to your deployment branch.
- Restrict access to the LXD/Incus UNIX control socket and TLS REST API endpoints to trusted host administrators.
- Audit instance directories across all storage pools for symbolic links named exec-output.
- Monitor host configuration directories (such as /etc/cron.d and /etc/profile.d) for files matching the pattern exec_*.stdout or exec_*.stderr.
Remediation Steps:
1. Identify the currently running LXD or Incus version using lxd --version or incus --version.
2. For Snap-based LXD deployments, run sudo snap refresh lxd to update to version 5.21.5, 5.0.7, 4.0.11, or 6.9.0+.
3. For Incus deployments, upgrade the incus package via your distribution package manager to version 7.2.0 or higher.
4. Verify that no existing container directories contain symbolic links for exec-output using find /var/lib/lxd/containers/ -maxdepth 2 -name "exec-output" -type l -ls.
References
- GitHub Security Advisory GHSA-9j25-mm2h-2f76 (Canonical LXD)
- Incus Security Advisory GHSA-73hr-m85f-64v9
- Incus Reporter Advisory GHSA-48q5-w887-33wv
- National Vulnerability Database (NVD) Entry for CVE-2026-48750
- CVE.org Record for CVE-2026-48750
- Canonical LXD Release Tag lxd-5.21.5
- Upstream Canonical LXD Repository
- Patch Commit: lxd/instance_exec: Confine opening of exec outputs
- Patch Commit: lxd/instance/drivers/common: Helper to ensure opening of instance paths is confined
- Incus 7.2 Release Announcement
- Debian Cron(8) Manual Page
---
Read the full report for GHSA-9J25-MM2H-2F76 on our website for more details including interactive diagrams and full exploit analysis.
GHSA-VGHH-5RFX-XHQ8: CVE-2026-48749: Arbitrary Host File Read and Write via Malicious Image Symlink in Canonical LXD and Incus
CVE-2026-48749: Arbitrary Host File Read and Write via Malicious Image Symlink in Canonical LXD and Incus
> Vulnerability ID: GHSA-VGHH-5RFX-XHQ8
> CVSS Score: 9.9
> Published: 2026-11-06
CVE-2026-48749 (tracked as GHSA-vghh-5rfx-xhq8 for LXD and GHSA-2q3f-q5pq-g8wv for Incus) is a critical container escape vulnerability in the Canonical LXD and Linux Containers Incus system container managers. By importing a specially crafted container image archive containing duplicate tar member headers, an authenticated attacker can replace the instance rootfs directory with a symbolic link pointing to the underlying host root filesystem. When performing file operations on a stopped container, the privileged forkfile helper binary resolves the symbolic link without confinement and chroots directly into the host filesystem, granting arbitrary root-level file read and write access.
TL;DR
A tar extraction validation bypass and unconfined symlink resolution flaw in Canonical LXD and Incus allows authenticated users with image import permissions to replace a container's rootfs directory with a symlink to the host root filesystem, resulting in arbitrary file read, arbitrary file write, and complete host compromise as root.
---
⚠️ Exploit Status: POC
Technical Details
- CVE ID: CVE-2026-48749 (GHSA-vghh-5rfx-xhq8 / GHSA-2q3f-q5pq-g8wv)
- Weakness Class: CWE-73: External Control of File Name or Path
- CVSS v3.1 Score: 9.9 CRITICAL (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H)
- EPSS Score: 0.78% (56.22nd Percentile)
- Attack Vector: Authenticated API / Malicious Container Image Import
- Security Impact: Container Escape via Arbitrary Host File Read and Write as Root
- Exploit Status: Public Proof-of-Concept (PoC) Available
- CISA KEV Status: Not Listed
Affected Systems
- Canonical LXD
- Linux Containers Incus
- LXD: >= 4.0.0, < 4.0.11 (Fixed in: 4.0.11)
- LXD: >= 5.0.0, < 5.0.7 (Fixed in: 5.0.7)
- LXD: >= 5.1.0, < 5.21.5 (Fixed in: 5.21.5)
- LXD: >= 6.0.0, < 6.9.0 (Fixed in: 6.9.0)
- Incus: < 7.2.0 (Fixed in: 7.2.0)
Code Analysis
Commit: 190e245
Canonical LXD security patch for rootfs and templates path validation (CVE-2026-48749).
Commit: 254b85c
Canonical LXD security patch enforcing symlink checks and path confinement.
Commit: 3dbf4ce
Canonical LXD backport commit addressing GHSA-vghh-5rfx-xhq8.
Commit: 4cd6334
Canonical LXD commit updating instance rootfs access methods.
Commit: 51dc11e
Canonical LXD commit confining subdirectory operations within instance paths.
Commit: 62bcee5
Canonical LXD patch preventing symlink traversal in instance drivers.
Commit: 8751ea6
Canonical LXD backport patch for CVE-2026-48749.
Commit: b499ec4
Canonical LXD commit hardening template and rootfs path resolution.
Commit: e2aeca6
Canonical LXD fix for rootfs symlink resolution in forkfile operations.
Commit: edb6d99
Canonical LXD commit introducing subPath symlink rejection.
Exploit Details
- GitHub Security Advisory (LXD): Official Canonical LXD advisory containing functional shell script Proof-of-Concept demonstrating arbitrary host file read and write.
- GitHub Security Advisory (Incus): Official Linux Containers Incus advisory detailing the rootfs symlink arbitrary file read/write exploit.
Mitigation Strategies
- Upgrade Canonical LXD and Linux Containers Incus to the latest patched point releases.
- Restrict LXD/Incus Unix socket membership and remote REST API access to trusted host administrators only.
- Disable custom image imports for untrusted or multi-tenant project users until patches are applied.
- Monitor storage pool directories for symbolic links named 'rootfs' or 'templates' and audit forkfile helper executions.
Remediation Steps:
1. Identify all hosts running Canonical LXD (< 4.0.11, < 5.0.7, < 5.21.5, < 6.9.0) or Incus (< 7.2.0).
2. Audit storage pool directories using 'find /var/lib/lxd/storage-pools/ -maxdepth 3 -type l -name rootfs' and 'find /var/lib/incus/storage-pools/ -maxdepth 3 -type l -name rootfs' to verify no malicious instances exist.
3. Apply vendor updates via snap, apt, or distribution package managers to upgrade LXD to 4.0.11 / 5.0.7 / 5.21.5 / 6.9.0+ or Incus to 7.2.0+.
4. Restart the LXD or Incus daemon if not automatically handled by the package manager and verify version status.
References
- GitHub Security Advisory: GHSA-vghh-5rfx-xhq8 (Canonical LXD)
- GitHub Security Advisory: GHSA-2q3f-q5pq-g8wv (LXC Incus)
- NVD Vulnerability Detail: CVE-2026-48749
- CVE.org Official Record: CVE-2026-48749
- Canonical LXD Source Repository
- Announcing Incus 7.2
---
Read the full report for GHSA-VGHH-5RFX-XHQ8 on our website for more details including interactive diagrams and full exploit analysis.
GHSA-FMC8-P6Q7-75CC: GHSA-fmc8-p6q7-75cc: Argument Injection in Canonical LXD Backup Compression Leads to Host Root Code…
GHSA-fmc8-p6q7-75cc: Argument Injection in Canonical LXD Backup Compression Leads to Host Root Code Execution
> Vulnerability ID: GHSA-FMC8-P6Q7-75CC
> CVSS Score: 9.9
> Published: 2026-11-06
GHSA-fmc8-p6q7-75cc (associated with CVE-2026-48755) is a critical argument injection vulnerability in Canonical LXD (github.com/canonical/lxd). The vulnerability occurs during instance and storage volume backup operations when processing the user-supplied compression_algorithm configuration parameter. While LXD validates the primary executable token against an allowlist of supported compression binaries, it fails to sanitize or restrict subsequent tokens parsed via shellquote.Split. These additional arguments are passed directly to exec.Command. An authenticated attacker with privileges to trigger backups can inject command-line flags for utilities like zstd to read staged files from a container filesystem and write them to arbitrary paths on the underlying host filesystem, such as /etc/cron.d/, achieving root-level arbitrary code execution on the host.
TL;DR
An argument injection flaw in Canonical LXD's backup compression handling allows authenticated users to pass arbitrary command-line flags to host compression utilities like zstd. By abusing flags such as -o, an attacker can write files from a container directly to the host's /etc/cron.d/ directory, escaping the container and executing arbitrary code as root on the host.
---
⚠️ Exploit Status: POC
Technical Details
- Vulnerability ID: GHSA-fmc8-p6q7-75cc (CVE-2026-48755)
- Primary Weakness: CWE-88: Argument Injection
- CVSS v3.1 Score: 9.9 Critical (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H)
- Affected Component: Canonical LXD (compressFile / backup compression parser)
- Attack Vector: Authenticated REST API request (/1.0/instances/{name}/backups)
- Security Impact: Container escape, arbitrary host file write, root RCE
- Exploit Maturity: Public Proof-of-Concept (PoC)
- CISA KEV Status: Not Listed
Affected Systems
- Canonical LXD (github.com/canonical/lxd)
- Linux Containers Incus (github.com/lxc/incus)
- github.com/canonical/lxd: < 0.0.0-20260630083100-c5184be310b1 (Fixed in: 0.0.0-20260630083100-c5184be310b1)
Code Analysis
Commit: 0915bb8
AppArmor confinement wrapper for backup file compression (CVE-2026-48755)
Commit: 0ab30d1
Pass sys.OS state and apply AppArmor wrapper during compression
Commit: 1887e3d
Update callers of compressFile to supply sys.OS
Commit: 32fd885
AppArmor archive profile generation for compression binaries
Commit: 932592d
Backport compression AppArmor confinement to stable branch
Commit: 9b09906
Confine compression utilities using AppArmor CompressWrapper
Commit: a280842
Ensure backup compression commands run under AppArmor profile
Commit: afc0e7f
Update backup export paths to pass sysOS into compressFile
Commit: b3e8ced
Add AppArmor CompressWrapper implementation in lxd/apparmor/archive.go
Commit: c6c9995
Apply AppArmor confinement to image and backup compression
Commit: e1e6018
Backport CVE-2026-48755 compression wrapper fixes
Commit: e224d6f
lxd/images: Confine compressFile execution with AppArmor
Exploit Details
- GitHub Advisory (Incus Upstream PoC): Publicly documented Python proof-of-concept script demonstrating remote RCE via zstd argument injection into /etc/cron.d/.
- GitHub Advisory (Canonical LXD): Canonical LXD security advisory containing full reproduction steps and PoC script.
Mitigation Strategies
- Upgrade Canonical LXD to a patched release containing the AppArmor CompressWrapper confinement.
- Ensure the Linux kernel has AppArmor enabled and enforcing so that dynamic confinement profiles are applied to compressor subprocesses.
- Restrict access to the LXD UNIX socket and REST API (:8443) exclusively to trusted host administrators.
- Deploy auditd rules and file integrity monitoring on /etc/cron.d/, /etc/crontab, and /etc/ld.so.preload to detect unauthorized host file writes.
Remediation Steps:
1. Refresh the LXD Snap package to the latest patched revision: sudo snap refresh lxd
2. For source or Go module deployments, update github.com/canonical/lxd to at least 0.0.0-20260630083100-c5184be310b1.
3. Verify that AppArmor is active on the host by running: sudo aa-status
4. Audit existing client certificates and tokens via 'lxc config trust list' and remove untrusted clients.
References
- Canonical LXD Security Advisory: GHSA-fmc8-p6q7-75cc
- Linux Containers Incus Security Advisory: GHSA-v6mj-8pf4-hhw4
- NVD Detail: CVE-2026-48755
- Canonical LXD Fix Commit: e224d6f8230a2da7ed7e60ab2aee44c788f9dba8
- Canonical LXD Fix Commit: 0915bb88cbb0baed5ac1aef8e62079c57ac877da
---
Read the full report for GHSA-FMC8-P6Q7-75CC on our website for more details including interactive diagrams and full exploit analysis.
GHSA-PJFF-C2WC-F6JM: CVE-2026-48769: Arbitrary File Write and Remote Code Execution via Trusted Image Hash in Canonical LXD…
CVE-2026-48769: Arbitrary File Write and Remote Code Execution via Trusted Image Hash in Canonical LXD and Linux Containers Incus
> Vulnerability ID: GHSA-PJFF-C2WC-F6JM
> CVSS Score: 9.9
> Published: 2026-11-06
A critical path traversal vulnerability caused by improper input validation (CWE-20) exists in the direct image download handler of Canonical LXD and Linux Containers Incus. When an authenticated user requests an image import using the URL source type, the daemon reads the image fingerprint from an untrusted HTTP response header (Incus-Image-Hash or LXD-Image-Hash) without validating that it conforms to a SHA-256 format. This unvalidated string is concatenated directly into a filesystem path via filepath.Join prior to file creation and cryptographic verification, allowing directory traversal sequences to write arbitrary files on the host filesystem as root.
TL;DR
Canonical LXD and Linux Containers Incus fail to validate the Incus-Image-Hash and LXD-Image-Hash HTTP headers during URL-based image imports. Attackers with low-privilege API access can supply path traversal sequences in this header to write arbitrary files as root on the host filesystem (such as /etc/cron.d/), resulting in full host remote code execution.
---
⚠️ Exploit Status: POC
Technical Details
- CVE ID: CVE-2026-48769 (GHSA-pjff-c2wc-f6jm / GHSA-f6m5-xw2g-xc4x)
- Weakness Class: CWE-20 (Improper Input Validation / Path Traversal)
- CVSS v3.1 Score: 9.9 Critical (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H)
- Attack Vector: Network / Authenticated API (POST /1.0/images with source.type=url)
- Impact: Arbitrary Host File Write and Remote Code Execution as root
- Exploit Status: Public Proof-of-Concept (PoC) Available
- EPSS Score: 0.78% (56.21st Percentile)
- CISA KEV Status: Not Listed
Affected Systems
- Canonical LXD
- Linux Containers Incus
- Incus: < 7.2.0 (Fixed in: 7.2.0)
- LXD: >= 4.0.0, < 4.0.11 (Fixed in: 4.0.11)
- LXD: >= 5.0.0, < 5.0.7 (Fixed in: 5.0.7)
- LXD: >= 5.1.0, < 5.21.5 (Fixed in: 5.21.5)
- LXD: >= 6.0.0, < 6.9.0 (Fixed in: 6.9.0)
Exploit Details
- GitHub Advisory (Incus): Official upstream advisory containing the complete Python Proof-of-Concept exploit script demonstrating host cron RCE.
- GitHub Advisory (Canonical LXD): Canonical LXD security advisory detailing the vulnerability and exploit mechanism.
Mitigation Strategies
- Upgrade Linux Containers Incus and Canonical LXD packages to the patched release versions across all container hosts.
- Restrict access to the Incus and LXD local Unix domain sockets and remote HTTPS APIs (port 8443) to trusted host administrators only.
- Enforce strict outbound egress firewall policies on container hosts to prevent the Incus/LXD daemon from connecting to untrusted HTTP/HTTPS endpoints.
- Monitor host filesystem integrity in critical directories such as /etc/cron.d/, /etc/systemd/system/, and /root/.ssh/ for unauthorized file creation.
Remediation Steps:
1. Identify all hosts running Incus (< 7.2.0) or Canonical LXD (< 4.0.11, < 5.0.7, < 5.21.5, < 6.9.0).
2. For Incus installations, update the incus package to version 7.2.0 or later via the distribution package manager.
3. For Canonical LXD installations managed via Snap or system packages, refresh or upgrade to 4.0.11, 5.0.7, 5.21.5, or 6.9.0 depending on the active channel.
4. Verify the running daemon version using 'incus version' or 'lxc version' and restart the service if required.
5. Review /etc/cron.d/ and system logs on previously exposed multi-tenant hosts for any indicators of transient file creation or unauthorized image import attempts.
References
- Canonical LXD Security Advisory (GHSA-pjff-c2wc-f6jm)
- Incus Security Advisory (GHSA-f6m5-xw2g-xc4x)
- Incus 7.2 Release Announcement
- National Vulnerability Database (NVD) Record for CVE-2026-48769
- CVE.org Authoritative Record for CVE-2026-48769
- Linux Containers Forum Release Announcement: Incus 7.2
- Canonical LXD GitHub Repository
- Linux Containers Incus GitHub Repository
---
Read the full report for GHSA-PJFF-C2WC-F6JM on our website for more details including interactive diagrams and full exploit analysis.
There is also workshop recently released by canonical that uses lxd under the hood
canonical/workshop
なんかこっちのほうが翻訳しましたって出せる感じがして良い(?)
なお現在のUbuntu Pro for WSLの翻訳率は58%ほどらしいから興味あったら参加してみよう👍️
github.com/canonical/ubuntu-pro-for-wsl/commit/c9…
54 views
Commitはこちらです
(やはりWSLの翻訳でした)
github.com/canonical/ubuntu-pro-for-wsl/commit/c9…
43 views
@YukiharuYABUKI LXDのほうは
ubuntu.com
からリンクされている
github.com/canonical/lxd/security/advisories/GHSA…
が404 Not Foundで見れないので詳細は不明です。が、Incus側は
salsa.debian.org
と
github.com/lxc/incus/security/advisories/GHSA-xg7…
を見ると、クライアント証明書の検証時に証明書チェーンをきちんと見ていなかったという脆弱性の修正も含まれていますね。
2 likes · 67 views
CVE-2026-112816
nvd.nist.gov
該当PR これか
lxd#19426
- ピン留め方式の mTLS
- サーバは、「先頭の証明書(leaf)」だけ署名検証する
- なので、leafだけ信頼一覧と照合する必要があった
- でも、クライアントが一緒に送った「leaf以外の未検証の証明書」も照合に使ってた
- 先頭にオレオレ証明書、次以降に信頼された証明書をいれとけば攻撃成立する
私のMoQのSDKは自前QUICでTLS1.3相当の処理もある (AI開発) けど、相互認証は入れてなかったや。
仮に入れたら、こういう所は気をつけんとあかんねんな
1 like · 122 views
Mentions
CVE-2026-28385: CVE-2026-28385: Server-Side Request Forgery in Canonical LXD Image Import CVE-2026-28385: Server-Side Request Forgery in Canonical LXD Image Import > Vulnerability ID: CVE-2026-28385 > CVSS Score: 5.0 > Published: 2026-11-06 CVE-2026-28385 (GHSA-3gq2-x4qg-p4g6) is a Server-Side Request Forgery (SSRF) vulnerability in Canonical LXD versions 4.12 through 6.9. An authenticated user possessing the can_create_images entitlement can force the LXD daemon to execute arbitrary outbound HTTP and HTTPS requests via the /1.0/images API endpoint. Due to the absence of egress destination validation, an attacker can probe host loopback services, RFC 1918 private network segments, and cloud Instance Metadata Services (IMDS) from the network position of the privileged LXD daemon. TL;DR Authenticated LXD users with image creation privileges can abuse the URL image import functionality to perform error-based port scanning and interact with internal HTTP services across loopback, private networks, and cloud metadata endpoints. --- Technical Details - Vulnerability Class: CWE-918: Server-Side Request Forgery (SSRF) - CVSS v3.1 Score: 5.0 Medium (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:N/A:N) - Attack Vector: Network via REST API (POST /1.0/images) - Authentication Required: Yes (User with can_create_images entitlement) - EPSS Score: 0.28% (20.30th Percentile) - Affected Versions: Canonical LXD 4.12 through 6.9 - Patched Version: Canonical LXD 6.10 - CISA KEV Status: Not Listed Affected Systems - Canonical LXD (versions 4.12 through 6.9) - LXD: >= 4.12, <= 6.9 (Fixed in: 6.10) Code Analysis Commit: 5976c92 doc: update guide to hardening security for LXD (#18462) Commit: c4a919f Image registries switchover (#17680) Commit: 4bbdb17 lxd: Add backward-compatible translation of deprecated image source fields Mitigation Strategies - Upgrade Canonical LXD to version 6.10 or later to enforce centralized Image Registries and disable arbitrary URL image imports. - Route all LXD daemon outbound HTTP and HTTPS connections through a hardened egress proxy that blocks loopback (127.0.0.0/8, ::1), RFC 1918 private subnets, and link-local cloud metadata (169.254.169.254) addresses. - Audit RBAC policies and revoke the can_create_images entitlement from untrusted users or multi-tenant roles. - Enable project-level registry restrictions (restricted.registries=builtin) on multi-tenant LXD projects. - Restrict network exposure of the LXD REST API by binding core.https_address to a dedicated management interface rather than all interfaces. Remediation Steps: 1. Upgrade the LXD snap or package to version 6.10 or newer: snap refresh lxd --channel=latest/stable 2. Configure an outbound filtering proxy in LXD: lxc config set core.proxy_http "http://<proxy_ip>:<port>" and lxc config set core.proxy_https "http://<proxy_ip>:<port>" 3. Restrict untrusted projects to approved image registries: lxc project set <project_name> restricted.registries=builtin 4. Verify the API listening address is restricted to a management network: lxc config get core.https_address References - CVE-2026-28385 Official CVE Record - NVD Vulnerability Detail: CVE-2026-28385 - GitHub Security Advisory: GHSA-3gq2-x4qg-p4g6 - GitHub Pull Request #18462: Update Guide to Hardening Security for LXD - GitHub Commit 5976c92: Hardening Guide Update - GitHub Commit c4a919f: Image Registries Switchover - GitHub Commit 4bbdb17: Transitional Image Source Allowlist - Canonical LXD Security Hardening Documentation: Restrict Outbound Requests --- Read the full report for CVE-2026-28385 on our website for more details including interactive diagrams and full exploit analysis.
GHSA-9J25-MM2H-2F76: CVE-2026-48750: Arbitrary File Write on Host via exec-output Symlink in Canonical LXD and Incus CVE-2026-48750: Arbitrary File Write on Host via exec-output Symlink in Canonical LXD and Incus > Vulnerability ID: GHSA-9J25-MM2H-2F76 > CVSS Score: 9.9 > Published: 2026-11-06 Canonical LXD and LXC Incus contain an arbitrary file write vulnerability (CWE-73 / CWE-59) in the /1.0/instances/<name>/exec REST API endpoint. When an instance is unpacked from an image archive, top-level symbolic links are extracted directly onto the host filesystem within the instance storage directory. If a crafted image includes a symbolic link named exec-output pointing to an arbitrary host path, invoking the execution endpoint with record-output: true causes the privileged host daemon to follow the symlink and write command output files directly to the target host directory. An authenticated attacker with permissions to import images and execute commands can exploit this flaw to write controlled content to sensitive host directories such as /etc/cron.d, resulting in arbitrary code execution on the host as root. TL;DR An unsanitized symlink named exec-output inside a crafted container image allows authenticated LXD and Incus users to write arbitrary command output to any directory on the host filesystem when invoking the /exec endpoint with record-output: true, leading to host-level privilege escalation and arbitrary code execution as root. --- ⚠️ Exploit Status: POC Technical Details - CVE Identifier: CVE-2026-48750 (GHSA-9j25-mm2h-2f76) - Weakness Class: CWE-73: External Control of File Name or Path / CWE-59: Symlink Following - CVSS v3.1 Score: 9.9 Critical (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) - EPSS Score: 0.78% (56.22nd Percentile) - Attack Vector: Authenticated REST API (/1.0/instances/<name>/exec with record-output: true) - Security Impact: Arbitrary file creation on host leading to root code execution (Container Escape) - Exploit Maturity: Public Proof-of-Concept (PoC) Available - CISA KEV Status: Not Listed Affected Systems - Canonical LXD - LXC Incus - LXD (4.0 LTS): >= 4.0.0, < 4.0.11 (Fixed in: 4.0.11) - LXD (5.0 LTS): >= 5.0.0, < 5.0.7 (Fixed in: 5.0.7) - LXD (5.x / 5.21 LTS): >= 5.1.0, < 5.21.5 (Fixed in: 5.21.5) - LXD (6.x): >= 6.0.0, < 6.9.0 (Fixed in: 6.9.0) - Incus: < 7.2.0 (Fixed in: 7.2.0) Code Analysis Commit: 124f901 lxd/instance_exec: Confine opening of exec outputs --- a/lxd/instance_exec.go +++ b/lxd/instance_exec.go @@ -718,24 +716,24 @@ func instanceExecPost(d *Daemon, r *http.Request) response.Response { var stdout, stderr *os.File if post.RecordOutput { - // Ensure exec-output directory exists - execOutputDir := inst.ExecOutputPath() - err = os.Mkdir(execOutputDir, 0600) - if err != nil && !errors.Is(err, fs.ErrExist) { + execOutputRoot, err := inst.OpenExecOutput() + if err != nil { return err } + defer func() { _ = execOutputRoot.Close() }() + // Prepare stdout and stderr recording. stdoutFile := "exec_" + opID + ".stdout" - stdout, err = os.OpenFile(filepath.Join(execOutputDir, stdoutFile), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + stdout, err = execOutputRoot.OpenFile(stdoutFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { return err } defer func() { _ = stdout.Close() }() stderrFile := "exec_" + opID + ".stderr" - stderr, err = os.OpenFile(filepath.Join(execOutputDir, stderrFile), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + stderr, err = execOutputRoot.OpenFile(stderrFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { return err } Commit: 254b85c lxd/instance/drivers/common: Helper to ensure opening of instance paths is confined --- a/lxd/instance/drivers/driver_common.go +++ b/lxd/instance/drivers/driver_common.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "io/fs" "net/http" "os" "path/filepath" @@ -396,6 +397,64 @@ func (d *common) Path() string { return storagePools.InstancePath(d.dbType, d.project.Name, d.name, d.isSnapshot) } +// openSubPath opens name as a confined [os.Root] beneath [common.Path], rejecting any attempt to +// escape the instance path. +func (d *common) openSubPath(name string) (*os.Root, error) { + parent, err := os.OpenRoot(d.Path()) + if err != nil { + return nil, err + } + + defer func() { _ = parent.Close() }() + + root, err := parent.OpenRoot(name) + if err != nil { + return nil, fmt.Errorf("Failed opening %q for instance %q (path %s): %w", name, d.Name(), d.Path(), err) + } + + return root, nil +} + +// openOrCreateSubPath is like openSubPath but also creates the name if it does not exist. +func (d *common) openOrCreateSubPath(name string, mode os.FileMode) (*os.Root, error) { + parent, err := os.OpenRoot(d.Path()) + if err != nil { + return nil, err + } + + defer func() { _ = parent.Close() }() + + err = parent.Mkdir(name, mode) + if err != nil && !errors.Is(err, fs.ErrExist) { + return nil, fmt.Errorf("Failed creating %q for instance %q (path %s): %w", name, d.Name(), d.Path(), err) + } + + root, err := parent.OpenRoot(name) + if err != nil { + return nil, fmt.Errorf("Failed opening %q for instance %q (path %s): %w", name, d.Name(), d.Path(), err) + } + + return root, nil +} + +// OpenRootfs opens the instance's rootfs directory as a confined *os.Root. +// Caller must close the returned Root. +func (d *common) OpenRootfs() (*os.Root, error) { + return d.openSubPath("rootfs") +} + +// OpenExecOutput opens the instance's exec-output directory as a confined *os.Root, creating it if absent. +// Caller must close the returned Root. +func (d *common) OpenExecOutput() (*os.Root, error) { + return d.openOrCreateSubPath("exec-output", 0700) +} + +// OpenTemplates opens the instance's templates directory as a confined *os.Root, creating it if absent. +// Caller must close the returned Root. +func (d *common) OpenTemplates() (*os.Root, error) { + return d.openOrCreateSubPath("templates", 0700) +} + // ExecOutputPath returns the instance's exec output path. func (d *common) ExecOutputPath() string { return filepath.Join(d.Path(), "exec-output") Commit: 4cd6334 lxd/instance/drivers/common: Helper to ensure opening of instance paths is confined (cherry-pick) Commit: 937b761 lxd/instance_exec: Confine opening of exec outputs (cherry-pick) Commit: bb0f252 lxd/instance_exec: Confine opening of exec outputs (cherry-pick) Exploit Details - GitHub Security Advisory (Canonical LXD): Official security advisory containing a shell script PoC demonstrating image repacking with an exec-output symlink and triggering file creation via the REST API. - GitHub Security Advisory (LXC Incus): Upstream Incus security advisory with full reproduction steps and PoC script. Mitigation Strategies - Upgrade Canonical LXD or LXC Incus to the patched release corresponding to your deployment branch. - Restrict access to the LXD/Incus UNIX control socket and TLS REST API endpoints to trusted host administrators. - Audit instance directories across all storage pools for symbolic links named exec-output. - Monitor host configuration directories (such as /etc/cron.d and /etc/profile.d) for files matching the pattern exec_*.stdout or exec_*.stderr. Remediation Steps: 1. Identify the currently running LXD or Incus version using lxd --version or incus --version. 2. For Snap-based LXD deployments, run sudo snap refresh lxd to update to version 5.21.5, 5.0.7, 4.0.11, or 6.9.0+. 3. For Incus deployments, upgrade the incus package via your distribution package manager to version 7.2.0 or higher. 4. Verify that no existing container directories contain symbolic links for exec-output using find /var/lib/lxd/containers/ -maxdepth 2 -name "exec-output" -type l -ls. References - GitHub Security Advisory GHSA-9j25-mm2h-2f76 (Canonical LXD) - Incus Security Advisory GHSA-73hr-m85f-64v9 - Incus Reporter Advisory GHSA-48q5-w887-33wv - National Vulnerability Database (NVD) Entry for CVE-2026-48750 - CVE.org Record for CVE-2026-48750 - Canonical LXD Release Tag lxd-5.21.5 - Upstream Canonical LXD Repository - Patch Commit: lxd/instance_exec: Confine opening of exec outputs - Patch Commit: lxd/instance/drivers/common: Helper to ensure opening of instance paths is confined - Incus 7.2 Release Announcement - Debian Cron(8) Manual Page --- Read the full report for GHSA-9J25-MM2H-2F76 on our website for more details including interactive diagrams and full exploit analysis.
GHSA-VGHH-5RFX-XHQ8: CVE-2026-48749: Arbitrary Host File Read and Write via Malicious Image Symlink in Canonical LXD and Incus CVE-2026-48749: Arbitrary Host File Read and Write via Malicious Image Symlink in Canonical LXD and Incus > Vulnerability ID: GHSA-VGHH-5RFX-XHQ8 > CVSS Score: 9.9 > Published: 2026-11-06 CVE-2026-48749 (tracked as GHSA-vghh-5rfx-xhq8 for LXD and GHSA-2q3f-q5pq-g8wv for Incus) is a critical container escape vulnerability in the Canonical LXD and Linux Containers Incus system container managers. By importing a specially crafted container image archive containing duplicate tar member headers, an authenticated attacker can replace the instance rootfs directory with a symbolic link pointing to the underlying host root filesystem. When performing file operations on a stopped container, the privileged forkfile helper binary resolves the symbolic link without confinement and chroots directly into the host filesystem, granting arbitrary root-level file read and write access. TL;DR A tar extraction validation bypass and unconfined symlink resolution flaw in Canonical LXD and Incus allows authenticated users with image import permissions to replace a container's rootfs directory with a symlink to the host root filesystem, resulting in arbitrary file read, arbitrary file write, and complete host compromise as root. --- ⚠️ Exploit Status: POC Technical Details - CVE ID: CVE-2026-48749 (GHSA-vghh-5rfx-xhq8 / GHSA-2q3f-q5pq-g8wv) - Weakness Class: CWE-73: External Control of File Name or Path - CVSS v3.1 Score: 9.9 CRITICAL (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) - EPSS Score: 0.78% (56.22nd Percentile) - Attack Vector: Authenticated API / Malicious Container Image Import - Security Impact: Container Escape via Arbitrary Host File Read and Write as Root - Exploit Status: Public Proof-of-Concept (PoC) Available - CISA KEV Status: Not Listed Affected Systems - Canonical LXD - Linux Containers Incus - LXD: >= 4.0.0, < 4.0.11 (Fixed in: 4.0.11) - LXD: >= 5.0.0, < 5.0.7 (Fixed in: 5.0.7) - LXD: >= 5.1.0, < 5.21.5 (Fixed in: 5.21.5) - LXD: >= 6.0.0, < 6.9.0 (Fixed in: 6.9.0) - Incus: < 7.2.0 (Fixed in: 7.2.0) Code Analysis Commit: 190e245 Canonical LXD security patch for rootfs and templates path validation (CVE-2026-48749). Commit: 254b85c Canonical LXD security patch enforcing symlink checks and path confinement. Commit: 3dbf4ce Canonical LXD backport commit addressing GHSA-vghh-5rfx-xhq8. Commit: 4cd6334 Canonical LXD commit updating instance rootfs access methods. Commit: 51dc11e Canonical LXD commit confining subdirectory operations within instance paths. Commit: 62bcee5 Canonical LXD patch preventing symlink traversal in instance drivers. Commit: 8751ea6 Canonical LXD backport patch for CVE-2026-48749. Commit: b499ec4 Canonical LXD commit hardening template and rootfs path resolution. Commit: e2aeca6 Canonical LXD fix for rootfs symlink resolution in forkfile operations. Commit: edb6d99 Canonical LXD commit introducing subPath symlink rejection. Exploit Details - GitHub Security Advisory (LXD): Official Canonical LXD advisory containing functional shell script Proof-of-Concept demonstrating arbitrary host file read and write. - GitHub Security Advisory (Incus): Official Linux Containers Incus advisory detailing the rootfs symlink arbitrary file read/write exploit. Mitigation Strategies - Upgrade Canonical LXD and Linux Containers Incus to the latest patched point releases. - Restrict LXD/Incus Unix socket membership and remote REST API access to trusted host administrators only. - Disable custom image imports for untrusted or multi-tenant project users until patches are applied. - Monitor storage pool directories for symbolic links named 'rootfs' or 'templates' and audit forkfile helper executions. Remediation Steps: 1. Identify all hosts running Canonical LXD (< 4.0.11, < 5.0.7, < 5.21.5, < 6.9.0) or Incus (< 7.2.0). 2. Audit storage pool directories using 'find /var/lib/lxd/storage-pools/ -maxdepth 3 -type l -name rootfs' and 'find /var/lib/incus/storage-pools/ -maxdepth 3 -type l -name rootfs' to verify no malicious instances exist. 3. Apply vendor updates via snap, apt, or distribution package managers to upgrade LXD to 4.0.11 / 5.0.7 / 5.21.5 / 6.9.0+ or Incus to 7.2.0+. 4. Restart the LXD or Incus daemon if not automatically handled by the package manager and verify version status. References - GitHub Security Advisory: GHSA-vghh-5rfx-xhq8 (Canonical LXD) - GitHub Security Advisory: GHSA-2q3f-q5pq-g8wv (LXC Incus) - NVD Vulnerability Detail: CVE-2026-48749 - CVE.org Official Record: CVE-2026-48749 - Canonical LXD Source Repository - Announcing Incus 7.2 --- Read the full report for GHSA-VGHH-5RFX-XHQ8 on our website for more details including interactive diagrams and full exploit analysis.
GHSA-FMC8-P6Q7-75CC: GHSA-fmc8-p6q7-75cc: Argument Injection in Canonical LXD Backup Compression Leads to Host Root Code… GHSA-fmc8-p6q7-75cc: Argument Injection in Canonical LXD Backup Compression Leads to Host Root Code Execution > Vulnerability ID: GHSA-FMC8-P6Q7-75CC > CVSS Score: 9.9 > Published: 2026-11-06 GHSA-fmc8-p6q7-75cc (associated with CVE-2026-48755) is a critical argument injection vulnerability in Canonical LXD (github.com/canonical/lxd). The vulnerability occurs during instance and storage volume backup operations when processing the user-supplied compression_algorithm configuration parameter. While LXD validates the primary executable token against an allowlist of supported compression binaries, it fails to sanitize or restrict subsequent tokens parsed via shellquote.Split. These additional arguments are passed directly to exec.Command. An authenticated attacker with privileges to trigger backups can inject command-line flags for utilities like zstd to read staged files from a container filesystem and write them to arbitrary paths on the underlying host filesystem, such as /etc/cron.d/, achieving root-level arbitrary code execution on the host. TL;DR An argument injection flaw in Canonical LXD's backup compression handling allows authenticated users to pass arbitrary command-line flags to host compression utilities like zstd. By abusing flags such as -o, an attacker can write files from a container directly to the host's /etc/cron.d/ directory, escaping the container and executing arbitrary code as root on the host. --- ⚠️ Exploit Status: POC Technical Details - Vulnerability ID: GHSA-fmc8-p6q7-75cc (CVE-2026-48755) - Primary Weakness: CWE-88: Argument Injection - CVSS v3.1 Score: 9.9 Critical (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) - Affected Component: Canonical LXD (compressFile / backup compression parser) - Attack Vector: Authenticated REST API request (/1.0/instances/{name}/backups) - Security Impact: Container escape, arbitrary host file write, root RCE - Exploit Maturity: Public Proof-of-Concept (PoC) - CISA KEV Status: Not Listed Affected Systems - Canonical LXD (github.com/canonical/lxd) - Linux Containers Incus (github.com/lxc/incus) - github.com/canonical/lxd: < 0.0.0-20260630083100-c5184be310b1 (Fixed in: 0.0.0-20260630083100-c5184be310b1) Code Analysis Commit: 0915bb8 AppArmor confinement wrapper for backup file compression (CVE-2026-48755) Commit: 0ab30d1 Pass sys.OS state and apply AppArmor wrapper during compression Commit: 1887e3d Update callers of compressFile to supply sys.OS Commit: 32fd885 AppArmor archive profile generation for compression binaries Commit: 932592d Backport compression AppArmor confinement to stable branch Commit: 9b09906 Confine compression utilities using AppArmor CompressWrapper Commit: a280842 Ensure backup compression commands run under AppArmor profile Commit: afc0e7f Update backup export paths to pass sysOS into compressFile Commit: b3e8ced Add AppArmor CompressWrapper implementation in lxd/apparmor/archive.go Commit: c6c9995 Apply AppArmor confinement to image and backup compression Commit: e1e6018 Backport CVE-2026-48755 compression wrapper fixes Commit: e224d6f lxd/images: Confine compressFile execution with AppArmor Exploit Details - GitHub Advisory (Incus Upstream PoC): Publicly documented Python proof-of-concept script demonstrating remote RCE via zstd argument injection into /etc/cron.d/. - GitHub Advisory (Canonical LXD): Canonical LXD security advisory containing full reproduction steps and PoC script. Mitigation Strategies - Upgrade Canonical LXD to a patched release containing the AppArmor CompressWrapper confinement. - Ensure the Linux kernel has AppArmor enabled and enforcing so that dynamic confinement profiles are applied to compressor subprocesses. - Restrict access to the LXD UNIX socket and REST API (:8443) exclusively to trusted host administrators. - Deploy auditd rules and file integrity monitoring on /etc/cron.d/, /etc/crontab, and /etc/ld.so.preload to detect unauthorized host file writes. Remediation Steps: 1. Refresh the LXD Snap package to the latest patched revision: sudo snap refresh lxd 2. For source or Go module deployments, update github.com/canonical/lxd to at least 0.0.0-20260630083100-c5184be310b1. 3. Verify that AppArmor is active on the host by running: sudo aa-status 4. Audit existing client certificates and tokens via 'lxc config trust list' and remove untrusted clients. References - Canonical LXD Security Advisory: GHSA-fmc8-p6q7-75cc - Linux Containers Incus Security Advisory: GHSA-v6mj-8pf4-hhw4 - NVD Detail: CVE-2026-48755 - Canonical LXD Fix Commit: e224d6f8230a2da7ed7e60ab2aee44c788f9dba8 - Canonical LXD Fix Commit: 0915bb88cbb0baed5ac1aef8e62079c57ac877da --- Read the full report for GHSA-FMC8-P6Q7-75CC on our website for more details including interactive diagrams and full exploit analysis.
GHSA-PJFF-C2WC-F6JM: CVE-2026-48769: Arbitrary File Write and Remote Code Execution via Trusted Image Hash in Canonical LXD… CVE-2026-48769: Arbitrary File Write and Remote Code Execution via Trusted Image Hash in Canonical LXD and Linux Containers Incus > Vulnerability ID: GHSA-PJFF-C2WC-F6JM > CVSS Score: 9.9 > Published: 2026-11-06 A critical path traversal vulnerability caused by improper input validation (CWE-20) exists in the direct image download handler of Canonical LXD and Linux Containers Incus. When an authenticated user requests an image import using the URL source type, the daemon reads the image fingerprint from an untrusted HTTP response header (Incus-Image-Hash or LXD-Image-Hash) without validating that it conforms to a SHA-256 format. This unvalidated string is concatenated directly into a filesystem path via filepath.Join prior to file creation and cryptographic verification, allowing directory traversal sequences to write arbitrary files on the host filesystem as root. TL;DR Canonical LXD and Linux Containers Incus fail to validate the Incus-Image-Hash and LXD-Image-Hash HTTP headers during URL-based image imports. Attackers with low-privilege API access can supply path traversal sequences in this header to write arbitrary files as root on the host filesystem (such as /etc/cron.d/), resulting in full host remote code execution. --- ⚠️ Exploit Status: POC Technical Details - CVE ID: CVE-2026-48769 (GHSA-pjff-c2wc-f6jm / GHSA-f6m5-xw2g-xc4x) - Weakness Class: CWE-20 (Improper Input Validation / Path Traversal) - CVSS v3.1 Score: 9.9 Critical (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) - Attack Vector: Network / Authenticated API (POST /1.0/images with source.type=url) - Impact: Arbitrary Host File Write and Remote Code Execution as root - Exploit Status: Public Proof-of-Concept (PoC) Available - EPSS Score: 0.78% (56.21st Percentile) - CISA KEV Status: Not Listed Affected Systems - Canonical LXD - Linux Containers Incus - Incus: < 7.2.0 (Fixed in: 7.2.0) - LXD: >= 4.0.0, < 4.0.11 (Fixed in: 4.0.11) - LXD: >= 5.0.0, < 5.0.7 (Fixed in: 5.0.7) - LXD: >= 5.1.0, < 5.21.5 (Fixed in: 5.21.5) - LXD: >= 6.0.0, < 6.9.0 (Fixed in: 6.9.0) Exploit Details - GitHub Advisory (Incus): Official upstream advisory containing the complete Python Proof-of-Concept exploit script demonstrating host cron RCE. - GitHub Advisory (Canonical LXD): Canonical LXD security advisory detailing the vulnerability and exploit mechanism. Mitigation Strategies - Upgrade Linux Containers Incus and Canonical LXD packages to the patched release versions across all container hosts. - Restrict access to the Incus and LXD local Unix domain sockets and remote HTTPS APIs (port 8443) to trusted host administrators only. - Enforce strict outbound egress firewall policies on container hosts to prevent the Incus/LXD daemon from connecting to untrusted HTTP/HTTPS endpoints. - Monitor host filesystem integrity in critical directories such as /etc/cron.d/, /etc/systemd/system/, and /root/.ssh/ for unauthorized file creation. Remediation Steps: 1. Identify all hosts running Incus (< 7.2.0) or Canonical LXD (< 4.0.11, < 5.0.7, < 5.21.5, < 6.9.0). 2. For Incus installations, update the incus package to version 7.2.0 or later via the distribution package manager. 3. For Canonical LXD installations managed via Snap or system packages, refresh or upgrade to 4.0.11, 5.0.7, 5.21.5, or 6.9.0 depending on the active channel. 4. Verify the running daemon version using 'incus version' or 'lxc version' and restart the service if required. 5. Review /etc/cron.d/ and system logs on previously exposed multi-tenant hosts for any indicators of transient file creation or unauthorized image import attempts. References - Canonical LXD Security Advisory (GHSA-pjff-c2wc-f6jm) - Incus Security Advisory (GHSA-f6m5-xw2g-xc4x) - Incus 7.2 Release Announcement - National Vulnerability Database (NVD) Record for CVE-2026-48769 - CVE.org Authoritative Record for CVE-2026-48769 - Linux Containers Forum Release Announcement: Incus 7.2 - Canonical LXD GitHub Repository - Linux Containers Incus GitHub Repository --- Read the full report for GHSA-PJFF-C2WC-F6JM on our website for more details including interactive diagrams and full exploit analysis.
There is also workshop recently released by canonical that uses lxd under the hood canonical/workshop
なんかこっちのほうが翻訳しましたって出せる感じがして良い(?) なお現在のUbuntu Pro for WSLの翻訳率は58%ほどらしいから興味あったら参加してみよう👍️ github.com/canonical/ubuntu-pro-for-wsl/commit/c9…
Commitはこちらです (やはりWSLの翻訳でした) github.com/canonical/ubuntu-pro-for-wsl/commit/c9…
@YukiharuYABUKI LXDのほうは ubuntu.com からリンクされている github.com/canonical/lxd/security/advisories/GHSA… が404 Not Foundで見れないので詳細は不明です。が、Incus側は salsa.debian.org と github.com/lxc/incus/security/advisories/GHSA-xg7… を見ると、クライアント証明書の検証時に証明書チェーンをきちんと見ていなかったという脆弱性の修正も含まれていますね。
CVE-2026-112816 nvd.nist.gov 該当PR これか lxd#19426 - ピン留め方式の mTLS - サーバは、「先頭の証明書(leaf)」だけ署名検証する - なので、leafだけ信頼一覧と照合する必要があった - でも、クライアントが一緒に送った「leaf以外の未検証の証明書」も照合に使ってた - 先頭にオレオレ証明書、次以降に信頼された証明書をいれとけば攻撃成立する 私のMoQのSDKは自前QUICでTLS1.3相当の処理もある (AI開発) けど、相互認証は入れてなかったや。 仮に入れたら、こういう所は気をつけんとあかんねんな