CVE-2025-21739

scsi: ufs: core: Fix use-after free in init error and remove paths

High · published February 27, 2025

CVSS v3.1
7.8
EPSS
0%
Percentile
12.2
In the wild
Unconfirmed
What it is

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

scsi: ufs: core: Fix use-after free in init error and remove paths

devm_blk_crypto_profile_init() registers a cleanup handler to run when

the associated (platform-) device is being released. For UFS, the

crypto private data and pointers are stored as part of the ufs_hba's

data structure 'struct ufs_hba::crypto_profile'. This structure is

allocated as part of the underlying ufshcd and therefore Scsi_host

allocation.

During driver release or during error handling in ufshcd_pltfrm_init(),

this structure is released as part of ufshcd_dealloc_host() before the

(platform-) device associated with the crypto call above is released.

Once this device is released, the crypto cleanup code will run, using

the just-released 'struct ufs_hba::crypto_profile'. This causes a

use-after-free situation:

Call trace:

kfree+0x60/0x2d8 (P)

kvfree+0x44/0x60

blk_crypto_profile_destroy_callback+0x28/0x70

devm_action_release+0x1c/0x30

release_nodes+0x6c/0x108

devres_release_all+0x98/0x100

device_unbind_cleanup+0x20/0x70

really_probe+0x218/0x2d0

In other words, the initialisation code flow is:

platform-device probe

ufshcd_pltfrm_init()

ufshcd_alloc_host()

scsi_host_alloc()

allocation of struct ufs_hba

creation of scsi-host devices

devm_blk_crypto_profile_init()

devm registration of cleanup handler using platform-device

and during error handling of ufshcd_pltfrm_init() or during driver

removal:

ufshcd_dealloc_host()

scsi_host_put()

put_device(scsi-host)

release of struct ufs_hba

put_device(platform-device)

crypto cleanup handler

To fix this use-after free, change ufshcd_alloc_host() to register a

devres action to automatically cleanup the underlying SCSI device on

ufshcd destruction, without requiring explicit calls to

ufshcd_dealloc_host(). This way:

* the crypto profile and all other ufs_hba-owned resources are

destroyed before SCSI (as they've been registered after)

* a memleak is plugged in tc-dwc-g210-pci.c remove() as a

side-effect

* EXPORT_SYMBOL_GPL(ufshcd_dealloc_host) can be removed fully as

it's not needed anymore

* no future drivers using ufshcd_alloc_host() could ever forget

adding the cleanup

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00223 · 12.2th percentile
Published
2025-02-27T02:12Z
EPSS history
Timeline
  • 27 FEB 02:12Z
    scsi: ufs: core: Fix use-after free in init error and remove paths
    cvelistv5