Skip to content

Commit 4fa4aa9

Browse files
jenswi-linarosmb49
authored andcommitted
tee: add overflow check in register_shm_helper()
BugLink: https://bugs.launchpad.net/bugs/1990190 commit 573ae4f upstream. With special lengths supplied by user space, register_shm_helper() has an integer overflow when calculating the number of pages covered by a supplied user space memory region. This causes internal_get_user_pages_fast() a helper function of pin_user_pages_fast() to do a NULL pointer dereference: Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010 Modules linked in: CPU: 1 PID: 173 Comm: optee_example_a Not tainted 5.19.0 #11 Hardware name: QEMU QEMU Virtual Machine, BIOS 0.0.0 02/06/2015 pc : internal_get_user_pages_fast+0x474/0xa80 Call trace: internal_get_user_pages_fast+0x474/0xa80 pin_user_pages_fast+0x24/0x4c register_shm_helper+0x194/0x330 tee_shm_register_user_buf+0x78/0x120 tee_ioctl+0xd0/0x11a0 __arm64_sys_ioctl+0xa8/0xec invoke_syscall+0x48/0x114 Fix this by adding an an explicit call to access_ok() in tee_shm_register_user_buf() to catch an invalid user space address early. Fixes: 033ddf1 ("tee: add register user memory") Cc: stable@vger.kernel.org Reported-by: Nimish Mishra <neelam.nimish@gmail.com> Reported-by: Anirban Chakraborty <ch.anirban00727@gmail.com> Reported-by: Debdeep Mukhopadhyay <debdeep.mukhopadhyay@gmail.com> Suggested-by: Jerome Forissier <jerome.forissier@linaro.org> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> [JW: backport to stable-5.4 + update commit message] Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Kamal Mostafa <kamal@canonical.com> Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
1 parent 7f8a711 commit 4fa4aa9

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

drivers/tee/tee_core.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@ tee_ioctl_shm_register(struct tee_context *ctx,
182182
if (data.flags)
183183
return -EINVAL;
184184

185+
if (!access_ok((void __user *)(unsigned long)data.addr, data.length))
186+
return -EFAULT;
187+
185188
shm = tee_shm_register(ctx, data.addr, data.length,
186189
TEE_SHM_DMA_BUF | TEE_SHM_USER_MAPPED);
187190
if (IS_ERR(shm))

0 commit comments

Comments
 (0)