Incus image, backup, and object-storage host-boundary checks¶
Source: hourly offensive-security scan, 2026-06-26. Primary entries: GitHub Advisory Database GHSA-2q3f-q5pq-g8wv / CVE-2026-48749, GHSA-73hr-m85f-64v9 / CVE-2026-48750, GHSA-48q5-w887-33wv / CVE-2026-48751, GHSA-vxp5-584q-c479 / CVE-2026-48752, GHSA-ccjc-4qc3-jxqc / CVE-2026-48753, GHSA-v6mj-8pf4-hhw4 / CVE-2026-48755, and GHSA-f6m5-xw2g-xc4x / CVE-2026-48769. Adjacent nil-pointer Incus issues GHSA-4xg6-52mh-fpw8 / CVE-2026-48754 and GHSA-xhqx-mgh3-3h7q / CVE-2026-48756 were reviewed but are not promoted beyond grouping context because they are availability-only.
This cluster is durable for operators because it exposes repeatable container control-plane boundaries: untrusted image metadata, rootfs/templates/exec-output filesystem entries, backup descriptors, S3 multipart object keys, compression algorithm names, and restricted-project settings crossing into host file reads/writes or command execution.
What changed¶
| Advisory | Component | Boundary | Operator value |
|---|---|---|---|
| GHSA-2q3f-q5pq-g8wv / CVE-2026-48749 | Incus image import / rootfs handling | malicious image rootfs/ symlink handling could cross from image content into host file read/write | Add image-root symlink canaries to container-platform import tests; evidence should stop at disposable host marker files. |
| GHSA-73hr-m85f-64v9 / CVE-2026-48750 | Incus image execution-output handling | crafted image exec-output symlinks could redirect host-side writes | Test generated-output paths separately from rootfs extraction; prove with marker-only temp directories. |
| GHSA-vxp5-584q-c479 / CVE-2026-48752 | Incus image templates | image-controlled templates/ symlinks could become arbitrary host file read/write primitives | Treat template expansion as a host-filesystem sink, not just guest initialization metadata. |
| GHSA-48q5-w887-33wv / CVE-2026-48751 | Incus restricted projects | restricted-project assumptions could be bypassed into command execution | Validate project restrictions with a route/setting matrix and inert command markers in a throwaway project only. |
| GHSA-ccjc-4qc3-jxqc / CVE-2026-48753 | Incus S3-compatible multipart upload | object names or multipart state could traverse outside the intended storage root | Include S3/object-storage upload paths in filesystem-boundary reviews for container platforms. |
| GHSA-v6mj-8pf4-hhw4 / CVE-2026-48755 | Incus backup import/compression | backup compression algorithm selection could cross into argument injection, arbitrary file write, and command execution | Treat archive/backup metadata fields as command-line construction inputs; prove only with inert compressor names and temp output paths. |
| GHSA-f6m5-xw2g-xc4x / CVE-2026-48769 | Incus client image trust | trusted image hashes could still lead the client into arbitrary file writes | Client-side image handling belongs in scope when operators import images from registries, projects, or handoff artifacts. |
Operator triage¶
- Map every host-write sink before building canaries. Image import, template expansion, exec output, backup restore, S3 multipart upload, and client-side image unpacking may each normalize paths differently.
- Separate server, client, and project-boundary findings. Incus daemon host writes, local client writes, and restricted-project escapes have different evidence and authorization requirements.
- Prefer synthetic host markers. Use temp directories, unique marker filenames, and throwaway projects. The proof is path escape or inert command reachability, not reading sensitive files.
- Check symlinks in every image-controlled directory.
rootfs/,templates/, generated-output directories, backup metadata, and storage-driver staging directories should all have explicit symlink/canonicalization tests. - Record negative controls. Include patched Incus version, project restriction settings, rootless/rootful mode, storage backend, S3 API exposure, and whether imports came from image, backup, or client workflow.
Replayable validation boundaries¶
Image symlink and template harness¶
- Preconditions: disposable Incus lab host, throwaway project, no production containers, a temp host canary directory such as
/tmp/skillz-incus-canary/, and explicit approval to import crafted images. - Build or obtain only a minimal lab image whose
rootfs/,templates/, and output-related entries contain symlinks that point to the temp canary directory. - Import and launch the image through the exact path in scope: local image import, remote image server, project-scoped import, or client-side image handling.
- Evidence should be a table of attempted path, normalized host path, marker filename, operation type, Incus version, project settings, and fixed-version result.
- Do not point symlinks at
/etc,/root, service config, images owned by other tenants, cloud credentials, SSH keys, databases, or real container volumes.
Backup and compression metadata harness¶
- Preconditions: isolated lab instance, disposable backup archives, temp extraction/output roots, and inert marker strings for algorithm or option fields.
- Create paired backups where only the compression/metadata field or path-like field changes from a valid baseline to a harmless canary.
- Restore or inspect the backup in a controlled project and capture whether the canary reaches process arguments, output filenames, or host paths.
- Positive evidence is an argument-boundary log, marker file in a temp directory, or rejected patched result. Stop before command execution payloads, shell metacharacters that run real commands, or writes outside the canary root.
S3 multipart storage-root harness¶
- Preconditions: lab Incus object-storage/S3-compatible endpoint, disposable bucket or project, and an owned callback/storage backend if external services are used.
- Upload multipart objects with baseline names, normalized separator variants, and traversal-looking marker names that should remain confined to the storage root.
- Verify only marker object presence, filesystem path logs, or storage backend path decisions. Do not enumerate unrelated buckets, tenant objects, or backend credentials.
Restricted-project command-boundary harness¶
- Preconditions: a throwaway restricted project, non-admin test user, inert command marker such as printing a fixed string, and no host mounts or privileged devices outside scope.
- Build a setting matrix for the restricted project: allowed images, profiles, devices, security flags, storage pools, and API routes reachable by the test user.
- Attempt only the documented workflow needed to show whether project restrictions can be bypassed into a canary command or unauthorized host-affecting operation.
- Evidence should show request/route, project setting, expected denial, observed action, marker output, and patched denial.
August 30 follow-up: cross-project copy authorization bypasses¶
Two same-day advisories expose the same project-boundary class from a different angle: the copy destination is authorized, but the copy source is not.
- Instance copy — GHSA-c9f5-j9c3-mhrg / CVE-2026-55622, high, 7.7, Incus
< 7.2.0.cmd/incusd/instances.goauthorizesPOST /1.0/instancesagainst the target project; the copy path incmd/incusd/instances_post.gothen loads the source instance from the attacker-controlledreq.Source.Projectwithout checking whether the caller can view that source instance. An attacker who knows a project name and an instance name they cannot access copies the instance into a project they control and then reads what the original project hid — including secrets inside the instance. The copy must occur on the same server, but nothing stops the copied instance from moving to another server afterward. - Custom volume copy — GHSA-64f3-v33m-w89f / CVE-2026-55621, high, 7.7, Incus
v7 < 7.2.0(andv6 <= 6.23.0,<= 0.7.0). The storage-volume creation handler authorizes creation in the target project, then passes the attacker-controlledreq.Source.ProjectintoCreateCustomVolumeFromCopywith noallowPermission/CanViewcheck on the source volume.
Durable heuristic: for every copy/move/restore/migrate operation, enumerate the pair of authorization decisions (source read, destination write) and verify both. A handler that authorizes only the destination while resolving the source from request input is the finding. This is the mirror image of the restricted-project escapes above: those let a low-privilege project reach host primitives; these let a low-privilege project reach another project's data.
Replayable validation (lab only): isolated Incus lab, two projects, a restricted certificate pinned to projects: [default].
- Seed
secretsproject with a canary instance (or custom volume) containing a marker file; confirm the restricted certificate cannot list or view it (negative control). - As the restricted certificate, issue an instance copy with
target-project: default,source-project: secrets,source-instance: secret(advisory PoC shape via thePOST /1.0/instancescopy request). Same for the volume variant withstorage volume create ... --source-project secrets. - Positive on
< 7.2.0: the copy lands indefaultand the marker is readable — the boundary proof is source project denied, destination project owned. Stop at the marker; do not read real instance secrets, do not move the copy to a second server, do not target production. - Negative control on
7.2.0: the source read is checked and the copy is rejected with an entitlement error.
Reporting notes¶
- Lead with the precise boundary: image
rootfs/symlink to host file, imagetemplates/symlink to host file, exec-output symlink to host write, restricted project to command execution, multipart object key to storage-root traversal, backup compression metadata to command arguments, or trusted image hash to client file write. - Include Incus version, client/server split, storage backend, project restriction settings, import path, canary path, and negative control.
- Keep all artifacts synthetic and redacted. Do not publish payloads that overwrite host config, read secrets, escape into tenant data, or execute production commands.