CVE-2026-45842
Medium · 5.5CVSS
5.5
EPSS
0.2%
Published
May 27, 2026
CISA due date
—
Cloudanix analysis
A local user or container with certain network permissions could crash an affected Linux system by abusing a rarely used PPP compression feature.
- Exploitation
- Local Privilege
- Attacker needs
- Low Privilege
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- OS kernel
- Class
- Denial of service
- Remediation
- Patch
- Effort
- Low
- Patch risk
- Low
What it actually does
This is a local denial-of-service vulnerability in the Linux kernel PPP/SLIP Van Jacobson header compression receive path. A user with the ability to obtain CAP_NET_ADMIN inside a user namespace can configure PPP header compression with zero receive slots via PPPIOCSMAXCID, causing the kernel to create a malformed SLHC state where the receive-state array is NULL. When a crafted or malformed inbound VJ-compressed or VJ-uncompressed PPP frame selects slot 0, the receive helper dereferences that NULL state pointer in softirq context, triggering a kernel oops/panic and potentially crashing the system. Confidentiality and integrity are not directly impacted; the primary impact is host availability.
Why it matters to the business
Successful exploitation can crash affected Linux systems, interrupting workloads, network services, containers, virtual machines, or embedded systems that allow local users or containers to create PPP interfaces or obtain network administration capability in a user namespace. The CVSS score is moderate, EPSS is currently low, it is not listed in CISA KEV, and no mature public exploitation is indicated, but the operational impact can still be high on multi-user Linux hosts, container platforms, CI runners, VPN/PPP appliances, or systems where unprivileged user namespaces are enabled.
How an attack unfolds
An attacker first needs local code execution on an affected Linux system or inside a context that can create an unprivileged user namespace and gain CAP_NET_ADMIN within that namespace. The attacker opens /dev/ppp and uses PPP control ioctls, specifically abusing PPPIOCSMAXCID with a value that sign-extends so the receive slot count becomes zero while transmit slots remain valid. This installs an SLHC compression context with no receive-state array. The attacker then causes the PPP receive path to process a VJ-compressed or VJ-uncompressed frame selecting slot 0. Because the receive helper assumes receive state exists, it dereferences a NULL rstate pointer in slhc_uncompress() or slhc_remember(), producing a kernel general protection fault or NULL pointer dereference in softirq handling. Depending on kernel panic/oops policy and workload, this can crash the host or destabilize networking.
How to fix it
Apply the vendor or distribution kernel update that includes the upstream fix to reject VJ receive packets when no receive-state array exists. No specific fixed package versions were provided in the input, so use the latest supported kernel build from the relevant Linux distribution or kernel vendor and verify that it contains the SLIP/SLHC fix for rejecting receive-side VJ packets on instances with zero receive slots. Where immediate patching is not possible, reduce exposure by disabling unprivileged user namespaces where operationally feasible, restricting access to /dev/ppp, preventing untrusted users or containers from obtaining CAP_NET_ADMIN, avoiding privileged containers or broad device passthrough, and unloading or blocking PPP/SLIP-related kernel modules if they are not required. Mitigations should be treated as temporary because they may not cover all legitimate local privilege contexts.
How to confirm the fix worked
Confirm remediation by verifying the running kernel version is at or above the vendor build containing the fix, not merely that a patched package is installed on disk. Review distribution advisories or kernel changelogs for references to the SLIP/SLHC fix that rejects VJ receive packets when rstate is absent. Validate exposure by checking whether unprivileged user namespaces are enabled, whether /dev/ppp exists and is accessible to untrusted users or containers, whether PPP/SLIP modules are loaded or available, and whether containers can run with CAP_NET_ADMIN or device access to /dev/ppp. If safe in a controlled lab only, a regression test can attempt the malformed PPPIOCSMAXCID configuration and verify the kernel rejects the receive path without an oops; do not run proof-of-crash tests on production systems.
Typical attack path
- Gain local execution on an affected Linux system, container, or namespace-capable environment.
- Create or enter a user namespace where CAP_NET_ADMIN is available, if permitted by system policy.
- Open /dev/ppp and configure a PPP channel using ioctl operations.
- Invoke PPPIOCSMAXCID with a crafted value such as 0xffff0000 so the receive slot count resolves to zero.
- Install the malformed SLHC/VJ compression receive state through the PPP configuration path.
- Deliver or trigger processing of a VJ-compressed or VJ-uncompressed PPP frame that selects receive slot 0.
- Cause the kernel PPP/SLIP receive path to dereference a NULL receive-state pointer.
- Trigger a kernel oops, panic, or network subsystem crash, resulting in denial of service.
How to detect it
Look for evidence of prior exploitation in kernel logs, system journals, crash dumps, and container/audit telemetry. Relevant log sources include dmesg, /var/log/kern.log, /var/log/messages, journalctl -k, kdump/vmcore analysis, auditd logs for /dev/ppp access, container runtime logs showing CAP_NET_ADMIN or privileged containers, and syscall/ioctl traces if collected by EDR. Indicators include kernel oops or panic messages mentioning NULL pointer dereference, general protection fault, KASAN null-ptr-deref, slhc_uncompress, slhc_remember, ppp_receive_nonmp_frame, ppp_input, ppp_async_process, tasklet_action_common, or ksoftirqd. Also investigate suspicious creation or use of PPP devices by unexpected users, containers, build jobs, or processes, especially shortly before a host crash. Because the vulnerability causes a crash rather than durable file modification, absence of logs after reboot does not prove non-exploitation; use crash dumps and centralized log forwarding where available.
- slhc_uncompress
- slhc_remember
- ppp_receive_nonmp_frame
- ppp_input
- ppp_async_process
- tasklet_action_common
- run_ksoftirqd
- KASAN: null-ptr-deref
- Oops: general protection fault
- NULL pointer dereference
- /dev/ppp
- PPPIOCSMAXCID
- 0xffff0000
- drivers/net/slip/slhc.c
- drivers/net/ppp/ppp_generic.c
- drivers/net/ppp/ppp_async.c
- sls_i_error
- slhc_toss
What your security team should do
- Prioritize patching Linux hosts that allow local users, shared shell access, container workloads, CI jobs, or untrusted workloads with namespace features enabled.
- Inventory systems with PPP, SLIP, /dev/ppp, CAP_NET_ADMIN-capable containers, privileged containers, or unprivileged user namespaces enabled.
- Apply the latest vendor-supported kernel update containing the SLHC receive-state validation fix and reboot into the patched kernel.
- Temporarily restrict /dev/ppp access and remove CAP_NET_ADMIN from untrusted containers or workloads until patching is complete.
- Consider disabling unprivileged user namespaces on systems that do not require them, especially multi-tenant servers and build runners.
- Monitor kernel logs for PPP/SLIP crashes, NULL pointer dereferences, and stack traces involving slhc_uncompress, slhc_remember, or ppp_receive_nonmp_frame.
- Ensure kernel panic/oops handling, crash dump collection, and host auto-recovery controls are configured so availability incidents can be investigated and restored quickly.
- Because EPSS is low and there is no KEV listing or known mature exploit in the supplied data, treat this as a targeted local DoS risk rather than an internet-scale emergency, but patch promptly on exposed multi-user or containerized systems.
The record
In the Linux kernel, the following vulnerability has been resolved: slip: reject VJ receive packets on instances with no rstate array slhc_init() accepts rslots == 0 as a valid configuration, with the documented meaning of 'no receive compression'. In that case the allocation loop in slhc_init() is skipped, so comp->rstate stays NULL and comp->rslot_limit stays 0 (from the kzalloc of struct slcompress). The receive helpers do not defend against that configuration. slhc_uncompress() dereferences comp->rstate[x] when the VJ header carries an explicit connection ID, and slhc_remember() later assigns cs = &comp->rstate[...] after only comparing the packet's slot number to comp->rslot_limit. Because rslot_limit is 0, slot 0 passes the range check, and the code dereferences a NULL rstate. The configuration is reachable in-tree through PPP. PPPIOCSMAXCID stores its argument in a signed int, and (val >> 16) uses arithmetic shift. Passing 0xffff0000 therefore sign-extends to -1, so val2 + 1 is 0 and ppp_generic.c ends up calling slhc_init(0, 1). Because /dev/ppp open is gated by ns_capable(CAP_NET_ADMIN), the whole path is reachable from an unprivileged user namespace. Once the malformed VJ state is installed, any inbound VJ-compressed or VJ-uncompressed frame that selects slot 0 crashes the kernel in softirq context: Oops: general protection fault, probably for non-canonical address 0xdffffc0000000000: 0000 [#1] SMP KASAN NOPTI KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] RIP: 0010:slhc_uncompress (drivers/net/slip/slhc.c:519) Call Trace: <TASK> ppp_receive_nonmp_frame (drivers/net/ppp/ppp_generic.c:2466) ppp_input (drivers/net/ppp/ppp_generic.c:2359) ppp_async_process (drivers/net/ppp/ppp_async.c:492) tasklet_action_common (kernel/softirq.c:926) handle_softirqs (kernel/softirq.c:623) run_ksoftirqd (kernel/softirq.c:1055) smpboot_thread_fn (kernel/smpboot.c:160) kthread (kernel/kthread.c:436) ret_from_fork (arch/x86/kernel/process.c:164) </TASK> Reject the receive side on such instances instead of touching rstate. slhc_uncompress() falls through to its existing 'bad' label, which bumps sls_i_error and enters the toss state. slhc_remember() mirrors that with an explicit sls_i_error increment followed by slhc_toss(); the sls_i_runt counter is not used here because a missing rstate is an internal configuration state, not a runt packet. The transmit path is unaffected: the only in-tree caller that picks rslots from userspace (ppp_generic.c) still supplies tslots >= 1, and slip.c always calls slhc_init(16, 16), so comp->tstate remains valid and slhc_compress() continues to work.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| openSUSE:Leap 16.0 | dtb-aarch64 | 0 | 6.12.0-160000.35.1 |
| openSUSE:Leap 16.0 | kernel-64kb | 0 | 6.12.0-160000.35.1 |
| openSUSE:Leap 16.0 | kernel-azure | 0 | 6.12.0-160000.35.1 |
| openSUSE:Leap 16.0 | kernel-default | 0 | 6.12.0-160000.35.1 |
| openSUSE:Leap 16.0 | kernel-default-base | 0 | 6.12.0-160000.35.1.160000.2.16 |
| openSUSE:Leap 16.0 | kernel-docs | 0 | 6.12.0-160000.35.1 |
| openSUSE:Leap 16.0 | kernel-kvmsmall | 0 | 6.12.0-160000.35.1 |
| openSUSE:Leap 16.0 | kernel-obs-build | 0 | 6.12.0-160000.35.1 |
| openSUSE:Leap 16.0 | kernel-obs-qa | 0 | 6.12.0-160000.35.1 |
| openSUSE:Leap 16.0 | kernel-rt | 0 | 6.12.0-160000.35.1 |
| openSUSE:Leap 16.0 | kernel-source | 0 | 6.12.0-160000.35.1 |
| openSUSE:Leap 16.0 | kernel-syms | 0 | 6.12.0-160000.35.1 |
| openSUSE:Leap 16.0 | kernel-zfcpdump | 0 | 6.12.0-160000.35.1 |
| openSUSE:Tumbleweed | kernel-source | 0 | 7.0.11-1.1 |
Related vulnerabilities
- CVE-2026-46317 In the Linux kernel, the following vulnerability has been resolved: KVM: arm64: Reassign… Also affects dtb-aarch64
- CVE-2026-46316 In the Linux kernel, the following vulnerability has been resolved: KVM: arm64: vgic-its… Also affects dtb-aarch64
- CVE-2026-46181 In the Linux kernel, the following vulnerability has been resolved: RDMA/mlx4: Fix… Also affects dtb-aarch64
- CVE-2026-46176 In the Linux kernel, the following vulnerability has been resolved: RDMA/mlx5: Fix error… Also affects dtb-aarch64
- CVE-2026-46159 In the Linux kernel, the following vulnerability has been resolved: btrfs: fix… Also affects dtb-aarch64
- CVE-2026-46114 In the Linux kernel, the following vulnerability has been resolved: RDMA/rxe: Reject… Also affects dtb-aarch64
- CVE-2026-46090 In the Linux kernel, the following vulnerability has been resolved: ALSA: aloop: Fix peer… Also affects dtb-aarch64
- CVE-2026-46094 In the Linux kernel, the following vulnerability has been resolved: ext4: fix bounds… Also affects dtb-aarch64