CVE-2026-89825 PUBLISHED

drm/panthor: fix firmware control interface bounds checks

Assigner: Linux
Reserved: 11.09.2026 Published: 16.09.2026 Updated: 16.09.2026

In the Linux kernel, the following vulnerability has been resolved:

drm/panthor: fix firmware control interface bounds checks

panthor_init_cs_iface() and panthor_init_csg_iface() validate firmware control interface offsets with 32-bit arithmetic and the size of the host wrapper structures. The offsets are derived from firmware-provided strides, so the arithmetic can wrap before the bounds check, and the host wrapper size is not the size of the firmware control interface being mapped.

Use 64-bit arithmetic for the computed offsets and validate against the actual firmware control interface structure sizes with subtraction-based bounds checks. Also validate that the shared section is large enough for the global control interface before using it.

Metrics

CVSS Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS Score: 7.8

AV:L - The 32-bit stride overflow is reached only on the local panthor probe path (panthor_probe → panthor_device_init → panthor_fw_init → panthor_fw_start → panthor_fw_init_ifaces → panthor_init_csg_iface/panthor_init_cs_iface) when mapping firmware-provided group_stride/stream_stride from mali_csffw.bin; no network, Bluetooth, or USB handler feeds those fields. AC:L - Firmware fully controls group_stride, stream_stride, and group_num (MIN_CSGS is 3, so csg_idx>=1 always runs). A crafted stride that places the u32 offset near 2^32 makes offset+sizeof wrap to a small value and pass the bounds check deterministically, with no race or attacker-uncontrollable timing. PR:L - The parser applies no capability check to firmware contents. On Mali CSF Android phones, Chromebooks, and embedded boards, mali_csffw.bin commonly lives on vendor/firmware partitions writable by local non-root system or vendor service accounts, which is sufficient to plant the crafted blob before driver probe. UI:N - Once the crafted firmware is in place, panthor_fw_init_ifaces() runs automatically at driver probe and caches the resulting interface pointers; no separate victim action such as opening a file, mounting a filesystem, or using /dev/dri is required to trigger the overflow. S:U - The bug corrupts kernel memory past the firmware shared-section vmap and can enable local privilege escalation within the host kernel; it does not cross a VM, IOMMU, or sandbox boundary such as a KVM guest-to-host escape. C:H - A wrapped u32 iface_offset near 2^32 yields kmap plus a ~4GiB out-of-bounds control pointer; the kernel then reads panthor_fw_control_iface fields (input_va, output_va, stream_num, stream_stride, features) from that address, disclosing kernel memory rather than a few bounded bytes. I:H - Those OOB control pointers are cached for the device lifetime and consumed by scheduler, job-IRQ, and GROUP_CREATE paths that write panthor_fw_input_iface structures and allocate suspend buffers from control->suspend_size, enabling out-of-bounds kernel writes and control-flow hijacking. A:H - Dereferencing kmap plus a wrapped near-4GiB offset can immediately oops or panic if the region is unmapped, and a corrupted firmware interface leaves the Mali GPU unusable; the same path is hit on every probe or firmware boot until the blob is removed.

Product Status

Vendor Linux
Product Linux
Versions Default: unaffected
  • affected from 2718d91816eeed03c09c8abe872e45f59078768c to 33ae55809aee9b4dca1d00cdee35b527f2bf8626 (excl.)
  • affected from 2718d91816eeed03c09c8abe872e45f59078768c to 80c9528661c774f899281c9a72011208ff39929e (excl.)
  • affected from 2718d91816eeed03c09c8abe872e45f59078768c to 3e5c7cddc0073eef6f9bb373189b11a969f1f6f6 (excl.)
  • affected from 2718d91816eeed03c09c8abe872e45f59078768c to 6a47f9fd2d970674ed9dedc52fc7ab76fd015785 (excl.)
Vendor Linux
Product Linux
Versions Default: affected
  • Version 6.10 is affected
  • unaffected from 0 to 6.10 (excl.)
  • unaffected from 6.12.110 to 6.12.* (incl.)
  • unaffected from 6.18.51 to 6.18.* (incl.)
  • unaffected from 7.2.5 to 7.2.* (incl.)
  • unaffected from 7.3-rc1 to * (incl.)

References