Summary
(*backend).CreateInstanceFromBackup in internal/server/storage/backend.go contains a nil-pointer dereference that an authenticated user with permission to create instances in any project can trigger remotely by uploading a crafted backup tarball. The Incus daemon panics and the process crashes, causing denial of service to every project on that cluster member.
This is a sibling of GHSA-fwj8-62r8-8p8m, GHSA-r7w7-mmxr-47r9, and GHSA-x5r6-jr56-89pv (all assigned 2026-05-04). Those patches added guards on adjacent fields of the same backup/config.Config struct; the Volume field on the instance-import path was missed.
Vulnerable code
internal/server/storage/backend.go (current main, commit 1513600):
// Lines 763-767 — properly guarded:
var volumeConfig map[string]string
if srcBackup.Config != nil && srcBackup.Config.Volume != nil {
volumeConfig = srcBackup.Config.Volume.Config
}
// ... a few lines later ...
// Line 795 — unguarded, dereferences Config.Volume directly:
if srcBackup.Config.Volume.Config["block.type"] == drivers.BlockVolumeTypeQcow2 {
The caller createFromBackup in cmd/incusd/instances_post.go only verifies that Config and Config.Container are non-nil:
// instances_post.go:854
if bInfo.Config == nil || bInfo.Config.Container == nil {
return response.BadRequest(errors.New("Backup file is missing required information"))
}
Volume is not checked. The Volume field on internal/server/backup/config.Config has type *api.StorageVolume with , so omitting from a crafted decodes to . The subsequent unguarded deref on line 795 panics.