Commit d3c36a7
scsi: ufs: core: Fix use-after free in init error and remove paths
commit f8fb240 upstream.
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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>1 parent cdacd17 commit d3c36a7
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 | |
|---|---|---|---|
| |||
10292 | 10292 | | |
10293 | 10293 | | |
10294 | 10294 | | |
10295 | | - | |
10296 | | - | |
10297 | | - | |
10298 | | - | |
10299 | | - | |
10300 | | - | |
10301 | | - | |
10302 | | - | |
10303 | | - | |
10304 | | - | |
10305 | 10295 | | |
10306 | 10296 | | |
10307 | 10297 | | |
| |||
10320 | 10310 | | |
10321 | 10311 | | |
10322 | 10312 | | |
| 10313 | + | |
| 10314 | + | |
| 10315 | + | |
| 10316 | + | |
| 10317 | + | |
| 10318 | + | |
| 10319 | + | |
| 10320 | + | |
| 10321 | + | |
| 10322 | + | |
10323 | 10323 | | |
10324 | 10324 | | |
10325 | 10325 | | |
10326 | 10326 | | |
10327 | 10327 | | |
10328 | 10328 | | |
| 10329 | + | |
| 10330 | + | |
| 10331 | + | |
| 10332 | + | |
10329 | 10333 | | |
10330 | 10334 | | |
10331 | 10335 | | |
| |||
10347 | 10351 | | |
10348 | 10352 | | |
10349 | 10353 | | |
| 10354 | + | |
| 10355 | + | |
| 10356 | + | |
| 10357 | + | |
| 10358 | + | |
| 10359 | + | |
| 10360 | + | |
10350 | 10361 | | |
10351 | 10362 | | |
10352 | 10363 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
562 | 562 | | |
563 | 563 | | |
564 | 564 | | |
565 | | - | |
566 | 565 | | |
567 | 566 | | |
568 | 567 | | |
| |||
605 | 604 | | |
606 | 605 | | |
607 | 606 | | |
608 | | - | |
609 | 607 | | |
610 | 608 | | |
611 | 609 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
465 | 465 | | |
466 | 466 | | |
467 | 467 | | |
468 | | - | |
469 | | - | |
470 | | - | |
471 | | - | |
| 468 | + | |
| 469 | + | |
472 | 470 | | |
473 | 471 | | |
474 | | - | |
475 | | - | |
476 | | - | |
477 | | - | |
| 472 | + | |
| 473 | + | |
478 | 474 | | |
479 | 475 | | |
480 | 476 | | |
481 | 477 | | |
482 | | - | |
| 478 | + | |
483 | 479 | | |
484 | 480 | | |
485 | 481 | | |
| |||
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 | 514 | | |
519 | | - | |
520 | | - | |
521 | | - | |
522 | | - | |
523 | | - | |
524 | 515 | | |
525 | 516 | | |
526 | 517 | | |
| |||
534 | 525 | | |
535 | 526 | | |
536 | 527 | | |
537 | | - | |
538 | 528 | | |
539 | 529 | | |
540 | 530 | | |
| |||
| 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