Commit 0809fb8
smb: client: fix UAF in async decryption
[ Upstream commit b0abcd6 ]
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 #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>
Signed-off-by: Sasha Levin <sashal@kernel.org>1 parent f7fb5dd commit 0809fb8
2 files changed
+34
-19
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4250 | 4250 | | |
4251 | 4251 | | |
4252 | 4252 | | |
4253 | | - | |
| 4253 | + | |
4254 | 4254 | | |
4255 | 4255 | | |
4256 | 4256 | | |
| |||
4261 | 4261 | | |
4262 | 4262 | | |
4263 | 4263 | | |
4264 | | - | |
4265 | | - | |
4266 | 4264 | | |
4267 | 4265 | | |
4268 | 4266 | | |
| |||
4274 | 4272 | | |
4275 | 4273 | | |
4276 | 4274 | | |
4277 | | - | |
4278 | | - | |
4279 | | - | |
4280 | | - | |
4281 | | - | |
4282 | | - | |
4283 | | - | |
4284 | | - | |
4285 | 4275 | | |
4286 | 4276 | | |
4287 | 4277 | | |
| |||
4321 | 4311 | | |
4322 | 4312 | | |
4323 | 4313 | | |
4324 | | - | |
4325 | | - | |
4326 | | - | |
4327 | | - | |
4328 | | - | |
| 4314 | + | |
4329 | 4315 | | |
4330 | 4316 | | |
4331 | 4317 | | |
| |||
4432 | 4418 | | |
4433 | 4419 | | |
4434 | 4420 | | |
4435 | | - | |
| 4421 | + | |
4436 | 4422 | | |
4437 | 4423 | | |
4438 | 4424 | | |
| |||
4457 | 4443 | | |
4458 | 4444 | | |
4459 | 4445 | | |
4460 | | - | |
| 4446 | + | |
4461 | 4447 | | |
| 4448 | + | |
4462 | 4449 | | |
4463 | 4450 | | |
4464 | 4451 | | |
| |||
4475 | 4462 | | |
4476 | 4463 | | |
4477 | 4464 | | |
4478 | | - | |
| 4465 | + | |
| 4466 | + | |
| 4467 | + | |
| 4468 | + | |
| 4469 | + | |
| 4470 | + | |
| 4471 | + | |
| 4472 | + | |
| 4473 | + | |
| 4474 | + | |
| 4475 | + | |
| 4476 | + | |
| 4477 | + | |
| 4478 | + | |
| 4479 | + | |
| 4480 | + | |
| 4481 | + | |
| 4482 | + | |
| 4483 | + | |
| 4484 | + | |
4479 | 4485 | | |
4480 | 4486 | | |
| 4487 | + | |
| 4488 | + | |
| 4489 | + | |
4481 | 4490 | | |
4482 | 4491 | | |
4483 | 4492 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1263 | 1263 | | |
1264 | 1264 | | |
1265 | 1265 | | |
| 1266 | + | |
| 1267 | + | |
| 1268 | + | |
| 1269 | + | |
| 1270 | + | |
| 1271 | + | |
1266 | 1272 | | |
1267 | 1273 | | |
1268 | 1274 | | |
| |||
0 commit comments