Skip to content

Commit ae8006b

Browse files
sean-jcopsiff
authored andcommitted
crypto: ccp: Don't attempt to copy CSR to userspace if PSP command failed
commit abe4a6d6f606113251868c2c4a06ba904bb41eed upstream. When retrieving the PEK CSR, don't attempt to copy the blob to userspace if the firmware command failed. If the failure was due to an invalid length, i.e. the userspace buffer+length was too small, copying the number of bytes _firmware_ requires will overflow the kernel-allocated buffer and leak data to userspace. BUG: KASAN: slab-out-of-bounds in instrument_copy_to_user ../include/linux/instrumented.h:129 [inline] BUG: KASAN: slab-out-of-bounds in _inline_copy_to_user ../include/linux/uaccess.h:205 [inline] BUG: KASAN: slab-out-of-bounds in _copy_to_user+0x66/0xa0 ../lib/usercopy.c:26 Read of size 2084 at addr ffff898144612e20 by task syz.9.219/21405 CPU: 14 UID: 0 PID: 21405 Comm: syz.9.219 Tainted: G U O 7.0.0-smp-DEV deepin-community#28 PREEMPTLAZY Tainted: [U]=USER, [O]=OOT_MODULE Hardware name: Google, Inc. Arcadia_IT_80/Arcadia_IT_80, BIOS 12.62.0-0 11/19/2025 Call Trace: <TASK> dump_stack_lvl+0xc5/0x110 ../lib/dump_stack.c:120 print_address_description ../mm/kasan/report.c:378 [inline] print_report+0xbc/0x260 ../mm/kasan/report.c:482 kasan_report+0xa2/0xe0 ../mm/kasan/report.c:595 check_region_inline ../mm/kasan/generic.c:-1 [inline] kasan_check_range+0x264/0x2c0 ../mm/kasan/generic.c:200 instrument_copy_to_user ../include/linux/instrumented.h:129 [inline] _inline_copy_to_user ../include/linux/uaccess.h:205 [inline] _copy_to_user+0x66/0xa0 ../lib/usercopy.c:26 copy_to_user ../include/linux/uaccess.h:236 [inline] sev_ioctl_do_pek_csr+0x31f/0x590 ../drivers/crypto/ccp/sev-dev.c:1872 sev_ioctl+0x3a4/0x490 ../drivers/crypto/ccp/sev-dev.c:2562 vfs_ioctl ../fs/ioctl.c:51 [inline] __do_sys_ioctl ../fs/ioctl.c:597 [inline] __se_sys_ioctl+0x11d/0x1b0 ../fs/ioctl.c:583 do_syscall_x64 ../arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xe0/0x800 ../arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x76/0x7e </TASK> WARN if the driver says the command succeeded, but the firmware error code says otherwise, as __sev_do_cmd_locked() is expected to return -EIO on any firwmware error. Reported-by: Alexander Potapenko <glider@google.com> Reported-by: Sebastian Alba Vives <sebasjosue84@gmail.com> Fixes: e799035 ("crypto: ccp: Implement SEV_PEK_CSR ioctl command") Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> (cherry picked from commit 111dcc6d0f016076745824a787d25609d0022f4c) Signed-off-by: Wentao Guan <guanwentao@uniontech.com>
1 parent d27a20f commit ae8006b

1 file changed

Lines changed: 7 additions & 1 deletion

File tree

drivers/crypto/ccp/sev-dev.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1878,14 +1878,20 @@ static int sev_ioctl_do_pek_csr(struct sev_issue_cmd *argp, bool writable)
18781878

18791879
ret = __sev_do_cmd_locked(SEV_CMD_PEK_CSR, &data, &argp->error);
18801880

1881-
/* If we query the CSR length, FW responded with expected data. */
1881+
/*
1882+
* Firmware will returns the length of the CSR blob (either the minimum
1883+
* required length or the actual length written), return it to the user.
1884+
*/
18821885
input.length = data.len;
18831886

18841887
if (copy_to_user((void __user *)argp->data, &input, sizeof(input))) {
18851888
ret = -EFAULT;
18861889
goto e_free_blob;
18871890
}
18881891

1892+
if (ret || WARN_ON_ONCE(argp->error))
1893+
goto e_free_blob;
1894+
18891895
if (blob) {
18901896
if (copy_to_user(input_address, blob, input.length))
18911897
ret = -EFAULT;

0 commit comments

Comments
 (0)