Commit b0abcd6
smb: client: fix UAF in async decryption
Doing an async decryption (large read) crashes with a
slab-use-after-free way down in the crypto API.
Reproducer:
# mount.cifs -o ...,seal,esize=1 //srv/share /mnt
# dd if=/mnt/largefile of=/dev/null
...
[ 194.196391] ==================================================================
[ 194.196844] BUG: KASAN: slab-use-after-free in gf128mul_4k_lle+0xc1/0x110
[ 194.197269] Read of size 8 at addr ffff888112bd0448 by task kworker/u77:2/899
[ 194.197707]
[ 194.197818] CPU: 12 UID: 0 PID: 899 Comm: kworker/u77:2 Not tainted 6.11.0-lku-00028-gfca3ca14a17a-dirty torvalds#43
[ 194.198400] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.2-3-gd478f380-prebuilt.qemu.org 04/01/2014
[ 194.199046] Workqueue: smb3decryptd smb2_decrypt_offload [cifs]
[ 194.200032] Call Trace:
[ 194.200191] <TASK>
[ 194.200327] dump_stack_lvl+0x4e/0x70
[ 194.200558] ? gf128mul_4k_lle+0xc1/0x110
[ 194.200809] print_report+0x174/0x505
[ 194.201040] ? __pfx__raw_spin_lock_irqsave+0x10/0x10
[ 194.201352] ? srso_return_thunk+0x5/0x5f
[ 194.201604] ? __virt_addr_valid+0xdf/0x1c0
[ 194.201868] ? gf128mul_4k_lle+0xc1/0x110
[ 194.202128] kasan_report+0xc8/0x150
[ 194.202361] ? gf128mul_4k_lle+0xc1/0x110
[ 194.202616] gf128mul_4k_lle+0xc1/0x110
[ 194.202863] ghash_update+0x184/0x210
[ 194.203103] shash_ahash_update+0x184/0x2a0
[ 194.203377] ? __pfx_shash_ahash_update+0x10/0x10
[ 194.203651] ? srso_return_thunk+0x5/0x5f
[ 194.203877] ? crypto_gcm_init_common+0x1ba/0x340
[ 194.204142] gcm_hash_assoc_remain_continue+0x10a/0x140
[ 194.204434] crypt_message+0xec1/0x10a0 [cifs]
[ 194.206489] ? __pfx_crypt_message+0x10/0x10 [cifs]
[ 194.208507] ? srso_return_thunk+0x5/0x5f
[ 194.209205] ? srso_return_thunk+0x5/0x5f
[ 194.209925] ? srso_return_thunk+0x5/0x5f
[ 194.210443] ? srso_return_thunk+0x5/0x5f
[ 194.211037] decrypt_raw_data+0x15f/0x250 [cifs]
[ 194.212906] ? __pfx_decrypt_raw_data+0x10/0x10 [cifs]
[ 194.214670] ? srso_return_thunk+0x5/0x5f
[ 194.215193] smb2_decrypt_offload+0x12a/0x6c0 [cifs]
This is because TFM is being used in parallel.
Fix this by allocating a new AEAD TFM for async decryption, but keep
the existing one for synchronous READ cases (similar to what is done
in smb3_calc_signature()).
Also remove the calls to aead_request_set_callback() and
crypto_wait_req() since it's always going to be a synchronous operation.
Signed-off-by: Enzo Matsumiya <ematsumiya@suse.de>
Signed-off-by: Steve French <stfrench@microsoft.com>1 parent df9b455 commit b0abcd6
2 files changed
+34
-19
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4309 | 4309 | | |
4310 | 4310 | | |
4311 | 4311 | | |
4312 | | - | |
| 4312 | + | |
4313 | 4313 | | |
4314 | 4314 | | |
4315 | 4315 | | |
| |||
4320 | 4320 | | |
4321 | 4321 | | |
4322 | 4322 | | |
4323 | | - | |
4324 | | - | |
4325 | 4323 | | |
4326 | 4324 | | |
4327 | 4325 | | |
| |||
4333 | 4331 | | |
4334 | 4332 | | |
4335 | 4333 | | |
4336 | | - | |
4337 | | - | |
4338 | | - | |
4339 | | - | |
4340 | | - | |
4341 | | - | |
4342 | | - | |
4343 | | - | |
4344 | 4334 | | |
4345 | 4335 | | |
4346 | 4336 | | |
| |||
4380 | 4370 | | |
4381 | 4371 | | |
4382 | 4372 | | |
4383 | | - | |
4384 | | - | |
4385 | | - | |
4386 | | - | |
4387 | | - | |
| 4373 | + | |
4388 | 4374 | | |
4389 | 4375 | | |
4390 | 4376 | | |
| |||
4526 | 4512 | | |
4527 | 4513 | | |
4528 | 4514 | | |
4529 | | - | |
| 4515 | + | |
4530 | 4516 | | |
4531 | 4517 | | |
4532 | 4518 | | |
| |||
4551 | 4537 | | |
4552 | 4538 | | |
4553 | 4539 | | |
4554 | | - | |
| 4540 | + | |
4555 | 4541 | | |
| 4542 | + | |
4556 | 4543 | | |
4557 | 4544 | | |
4558 | 4545 | | |
| |||
4568 | 4555 | | |
4569 | 4556 | | |
4570 | 4557 | | |
4571 | | - | |
| 4558 | + | |
| 4559 | + | |
| 4560 | + | |
| 4561 | + | |
| 4562 | + | |
| 4563 | + | |
| 4564 | + | |
| 4565 | + | |
| 4566 | + | |
| 4567 | + | |
| 4568 | + | |
| 4569 | + | |
| 4570 | + | |
| 4571 | + | |
| 4572 | + | |
| 4573 | + | |
| 4574 | + | |
| 4575 | + | |
| 4576 | + | |
| 4577 | + | |
4572 | 4578 | | |
4573 | 4579 | | |
| 4580 | + | |
| 4581 | + | |
| 4582 | + | |
4574 | 4583 | | |
4575 | 4584 | | |
4576 | 4585 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1266 | 1266 | | |
1267 | 1267 | | |
1268 | 1268 | | |
| 1269 | + | |
| 1270 | + | |
| 1271 | + | |
| 1272 | + | |
| 1273 | + | |
| 1274 | + | |
1269 | 1275 | | |
1270 | 1276 | | |
1271 | 1277 | | |
| |||
0 commit comments