CVE-2026-23346
Medium · 5.5CVSS
5.5
EPSS
0.1%
Published
Mar 25, 2026
CISA due date
—
Cloudanix analysis
A mistake in how the Linux kernel handles certain memory operations on arm64 processors can let a regular user crash the whole computer.
- Exploitation
- Local Privilege
- Attacker needs
- Low Privilege
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- OS kernel
- Class
- Memory Corruption
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
The flaw in ioremap_prot() on arm64 passes a full user pgprot_t (including permission bits) when creating a kernel mapping, resulting in a PAN violation and kernel read fault during memcpy_fromio in paths such as environ_read.
Why it matters to the business
Local users can trigger a kernel crash that halts the system or container, causing denial of service and potential loss of availability for services running on affected arm64 Linux kernels.
How an attack unfolds
An attacker with local access invokes a read operation on a process environment file; the kernel path calls generic_access_phys which invokes ioremap_prot with a user-derived pgprot_t; on PAN-enabled systems the resulting kernel mapping is unreadable, triggering a fault during the subsequent memcpy.
How to fix it
Upgrade to a Linux kernel that contains the commit extracting only memory type attributes in ioremap_prot and adding the user-mapping assertion; apply the vendor-supplied stable update for the affected arm64 configuration.
How to confirm the fix worked
Confirm the kernel source contains the updated ioremap_prot implementation that masks pgprot_t to memory type bits only and verify that ioremap calls continue to succeed while the PAN fault no longer occurs on user-derived mappings.
Typical attack path
- Obtain local shell or container access on an arm64 Linux system with PAN enabled
- Trigger a read of /proc/<pid>/environ or similar path that reaches access_remote_vm
- Cause the kernel to execute __memcpy_fromio on the resulting faulty mapping
- Observe kernel oops and potential system panic or process termination
How to detect it
Search kernel logs for the exact panic strings 'Unable to handle kernel read from unreadable memory' combined with call traces containing __memcpy_fromio and generic_access_phys; review audit logs for unusual local reads of process environment files preceding the crash.
- Unable to handle kernel read from unreadable memory at virtual address
- __memcpy_fromio+0x80/0xf8
- generic_access_phys+0x20c/0x2b8
What your security team should do
- Prioritize patching arm64 Linux kernels to the fixed version within the normal change window
- Restrict local unprivileged access where feasible until patches are deployed
- Monitor for kernel oops reports referencing __memcpy_fromio or generic_access_phys
The record
In the Linux kernel, the following vulnerability has been resolved: arm64: io: Extract user memory type in ioremap_prot() The only caller of ioremap_prot() outside of the generic ioremap() implementation is generic_access_phys(), which passes a 'pgprot_t' value determined from the user mapping of the target 'pfn' being accessed by the kernel. On arm64, the 'pgprot_t' contains all of the non-address bits from the pte, including the permission controls, and so we end up returning a new user mapping from ioremap_prot() which faults when accessed from the kernel on systems with PAN: | Unable to handle kernel read from unreadable memory at virtual address ffff80008ea89000 | ... | Call trace: | __memcpy_fromio+0x80/0xf8 | generic_access_phys+0x20c/0x2b8 | __access_remote_vm+0x46c/0x5b8 | access_remote_vm+0x18/0x30 | environ_read+0x238/0x3e8 | vfs_read+0xe4/0x2b0 | ksys_read+0xcc/0x178 | __arm64_sys_read+0x4c/0x68 Extract only the memory type from the user 'pgprot_t' in ioremap_prot() and assert that we're being passed a user mapping, to protect us against any changes in future that may require additional handling. To avoid falsely flagging users of ioremap(), provide our own ioremap() macro which simply wraps __ioremap_prot().
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|