CVE-2026-93070 in Linuxinfo

Summary

by MITRE • 09/17/2026

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

media: ipu6: Do not free aux device pdata after init

ipu6_bus_initialize_device() stores the isys/psys pdata pointer in struct ipu6_bus_device and initializes the auxiliary device. After that point, error unwinding must drop the auxiliary device reference and let ipu6_bus_release() free both the bus device and adev->pdata.

The isys and psys init paths already call put_device() when MMU initialization fails, and ipu6_bus_add_device() calls auxiliary_device_uninit() on auxiliary_device_add() failure. Both paths therefore run the bus release callback. The extra kfree(pdata) in the callers can release the same object a second time.

Remove the manual pdata frees after the auxiliary device has been initialized.

This issue was found by a static analysis checker and confirmed by manual source review.

Once again VulDB remains the best source for vulnerability data.

Analysis

by VulDB Data Team • 09/17/2026

The Linux kernel media subsystem contains a driver for Intel IPU6 hardware that manages image processing units, specifically handling isys and psys devices which are critical components in modern camera pipelines within mobile and embedded platforms. A significant memory management flaw was identified within the initialization logic of this driver, where improper resource cleanup sequences led to double-free vulnerabilities. The core issue resides in how auxiliary device platform data structures were handled during error paths following successful partial initialization. When ipu6_bus_initialize_device is invoked, it stores pointers to the isys or psys platform data into a bus-specific structure and proceeds to initialize an auxiliary device. This action triggers reference counting mechanisms managed by the kernel's device model subsystem. Specifically, once the auxiliary device is added successfully, its lifecycle becomes tied to the refcounting logic of the underlying device object rather than manual memory management calls in the caller functions.

The technical flaw arises from a race condition between automatic resource release and explicit deallocation attempts during error handling sequences. If MMU initialization fails after the auxiliary device has been partially set up, or if auxiliary_device_add returns an error code after adding the device to the system, existing cleanup paths invoke put_device() or auxiliary_device_uninit(). These functions correctly trigger ipu6_bus_release(), which is designed to free both the bus device structure and the associated platform data pointer stored within it. However, the calling functions also contained explicit kfree calls targeting the same pdata memory region immediately after these initialization steps failed. This resulted in two distinct code paths attempting to release the same heap-allocated memory block: once through the kernel's standard device reference counting mechanism via ipu6_bus_release, and a second time via manual deallocation by the driver logic.

This double-free vulnerability poses severe stability risks to the operating system. In Linux kernel space, freeing already freed memory corrupts the slab allocator metadata structures that track allocated objects. Such corruption can lead to immediate kernel panics causing denial of service conditions for all running processes on the affected device. More critically, depending on how quickly the corrupted heap chunks are reallocated by subsequent allocations, an attacker with local access could potentially exploit this state inconsistency to achieve arbitrary code execution or escalate privileges. The vulnerability is classified under CWE-415 Double Free, which describes situations where a program frees memory more than once without resetting pointers or updating references appropriately. This specific instance highlights the danger of mixing manual resource management with reference-counted object lifecycles in kernel drivers.

From an offensive security perspective, this flaw aligns with ATT&CK technique T1059 Command and Scripting Interpreter if exploited to execute arbitrary commands via a compromised driver context, or more broadly under privilege escalation vectors where heap corruption is leveraged to overwrite function pointers or control flow data structures within the kernel address space. The vulnerability was initially detected through static analysis tools designed to track memory allocation and deallocation patterns across function boundaries, confirming that multiple exit paths converged on the same free operation without proper synchronization or pointer nullification. Manual source review further validated that the manual kfree calls were redundant because ipu6_bus_release already handled the necessary cleanup for both bus structures and their associated platform data payloads.

To mitigate this vulnerability, developers must ensure strict adherence to single-responsibility principles in resource management routines within kernel drivers. Once an auxiliary device is successfully registered with the core subsystem, ownership of its lifecycle transitions entirely to that subsystem. Consequently, any error handling logic subsequent to registration should rely exclusively on standard unregistration and put_device calls rather than attempting manual memory deallocation for resources now managed by the framework. Removing the redundant kfree(pdata) statements from the callers resolves the double-free condition while maintaining correct cleanup behavior through ipu6_bus_release. System administrators running affected kernel versions should apply upstream patches that remove these erroneous free operations to prevent potential exploitation via local privilege escalation or denial of service attacks targeting media subsystem components in devices utilizing Intel IPU6 hardware.

Responsible

Linux

Reservation

09/17/2026

Disclosure

09/17/2026

Moderation

accepted

CPE

ready

EPSS

0.00000

KEV

no

Activities

very low

Sources

Do you know our Splunk app?

Download it now for free!