Commit f8fb240
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: [email protected]
Signed-off-by: André Draszik <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Reviewed-by: Bean Huo <[email protected]>
Reviewed-by: Manivannan Sadhasivam <[email protected]>
Acked-by: Eric Biggers <[email protected]>
Signed-off-by: Martin K. Petersen <[email protected]>1 parent 9ff7c38 commit f8fb240
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 | |
|---|---|---|---|
| |||
10226 | 10226 | | |
10227 | 10227 | | |
10228 | 10228 | | |
10229 | | - | |
10230 | | - | |
10231 | | - | |
10232 | | - | |
10233 | | - | |
10234 | | - | |
10235 | | - | |
10236 | | - | |
10237 | | - | |
10238 | | - | |
10239 | 10229 | | |
10240 | 10230 | | |
10241 | 10231 | | |
| |||
10254 | 10244 | | |
10255 | 10245 | | |
10256 | 10246 | | |
| 10247 | + | |
| 10248 | + | |
| 10249 | + | |
| 10250 | + | |
| 10251 | + | |
| 10252 | + | |
| 10253 | + | |
| 10254 | + | |
| 10255 | + | |
| 10256 | + | |
10257 | 10257 | | |
10258 | 10258 | | |
10259 | 10259 | | |
10260 | 10260 | | |
10261 | 10261 | | |
10262 | 10262 | | |
| 10263 | + | |
| 10264 | + | |
| 10265 | + | |
| 10266 | + | |
10263 | 10267 | | |
10264 | 10268 | | |
10265 | 10269 | | |
| |||
10281 | 10285 | | |
10282 | 10286 | | |
10283 | 10287 | | |
| 10288 | + | |
| 10289 | + | |
| 10290 | + | |
| 10291 | + | |
| 10292 | + | |
| 10293 | + | |
| 10294 | + | |
10284 | 10295 | | |
10285 | 10296 | | |
10286 | 10297 | | |
| |||
| 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 | |
|---|---|---|---|
| |||
1309 | 1309 | | |
1310 | 1310 | | |
1311 | 1311 | | |
1312 | | - | |
1313 | 1312 | | |
1314 | 1313 | | |
1315 | 1314 | | |
| |||
0 commit comments