Commit 1db8d08
committed
scsi: ufs: core: Fix use-after free in init error and remove paths
JIRA: https://issues.redhat.com/browse/RHEL-84800
CVE: CVE-2025-21739
commit f8fb240
Author: André Draszik <andre.draszik@linaro.org>
Date: Fri Jan 24 15:09:00 2025 +0000
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
Fixes: cb77cb5 ("blk-crypto: rename blk_keyslot_manager to blk_crypto_profile")
Fixes: d76d9d7 ("scsi: ufs: use devm_blk_ksm_init()")
Cc: stable@vger.kernel.org
Signed-off-by: André Draszik <andre.draszik@linaro.org>
Link: https://lore.kernel.org/r/20250124-ufshcd-fix-v4-1-c5d0144aae59@linaro.org
Reviewed-by: Bean Huo <beanhuo@micron.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Acked-by: Eric Biggers <ebiggers@kernel.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Jared Kangas <jkangas@redhat.com>1 parent 4273cca commit 1db8d08
File tree
4 files changed
+30
-32
lines changed- drivers/ufs
- core
- host
- include/ufs
4 files changed
+30
-32
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10293 | 10293 | | |
10294 | 10294 | | |
10295 | 10295 | | |
10296 | | - | |
10297 | | - | |
10298 | | - | |
10299 | | - | |
10300 | | - | |
10301 | | - | |
10302 | | - | |
10303 | | - | |
10304 | | - | |
10305 | | - | |
10306 | 10296 | | |
10307 | 10297 | | |
10308 | 10298 | | |
| |||
10319 | 10309 | | |
10320 | 10310 | | |
10321 | 10311 | | |
| 10312 | + | |
| 10313 | + | |
| 10314 | + | |
| 10315 | + | |
| 10316 | + | |
| 10317 | + | |
| 10318 | + | |
| 10319 | + | |
| 10320 | + | |
| 10321 | + | |
10322 | 10322 | | |
10323 | 10323 | | |
10324 | 10324 | | |
10325 | 10325 | | |
10326 | 10326 | | |
10327 | 10327 | | |
| 10328 | + | |
| 10329 | + | |
| 10330 | + | |
| 10331 | + | |
10328 | 10332 | | |
10329 | 10333 | | |
10330 | 10334 | | |
| |||
10346 | 10350 | | |
10347 | 10351 | | |
10348 | 10352 | | |
| 10353 | + | |
| 10354 | + | |
| 10355 | + | |
| 10356 | + | |
| 10357 | + | |
| 10358 | + | |
| 10359 | + | |
10349 | 10360 | | |
10350 | 10361 | | |
10351 | 10362 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
516 | 516 | | |
517 | 517 | | |
518 | 518 | | |
519 | | - | |
520 | 519 | | |
521 | 520 | | |
522 | 521 | | |
| |||
561 | 560 | | |
562 | 561 | | |
563 | 562 | | |
564 | | - | |
565 | 563 | | |
566 | 564 | | |
567 | 565 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
464 | 464 | | |
465 | 465 | | |
466 | 466 | | |
467 | | - | |
468 | | - | |
469 | | - | |
470 | | - | |
| 467 | + | |
| 468 | + | |
471 | 469 | | |
472 | 470 | | |
473 | | - | |
474 | | - | |
475 | | - | |
476 | | - | |
| 471 | + | |
| 472 | + | |
477 | 473 | | |
478 | 474 | | |
479 | 475 | | |
480 | 476 | | |
481 | | - | |
| 477 | + | |
482 | 478 | | |
483 | 479 | | |
484 | 480 | | |
| |||
487 | 483 | | |
488 | 484 | | |
489 | 485 | | |
490 | | - | |
| 486 | + | |
491 | 487 | | |
492 | 488 | | |
493 | 489 | | |
494 | 490 | | |
495 | 491 | | |
496 | | - | |
| 492 | + | |
497 | 493 | | |
498 | 494 | | |
499 | 495 | | |
500 | 496 | | |
501 | 497 | | |
502 | 498 | | |
503 | 499 | | |
504 | | - | |
| 500 | + | |
505 | 501 | | |
506 | 502 | | |
507 | 503 | | |
508 | 504 | | |
509 | 505 | | |
510 | 506 | | |
511 | | - | |
| 507 | + | |
512 | 508 | | |
513 | 509 | | |
514 | 510 | | |
515 | 511 | | |
516 | 512 | | |
517 | 513 | | |
518 | | - | |
519 | | - | |
520 | | - | |
521 | | - | |
522 | | - | |
523 | 514 | | |
524 | 515 | | |
525 | 516 | | |
| |||
533 | 524 | | |
534 | 525 | | |
535 | 526 | | |
536 | | - | |
537 | 527 | | |
538 | 528 | | |
539 | 529 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1297 | 1297 | | |
1298 | 1298 | | |
1299 | 1299 | | |
1300 | | - | |
1301 | 1300 | | |
1302 | 1301 | | |
1303 | 1302 | | |
| |||
0 commit comments