All of lore.kernel.org
 help / color / mirror / Atom feed
From: Patrik Lantz <Patrik.Lantz@axis.com>
To: op-tee@lists.trustedfirmware.org
Subject: Re: drivers/tee double-free of page when optee_shm_register fails
Date: Tue, 14 Dec 2021 08:30:09 +0000	[thread overview]
Message-ID: <d9d213441d174cb7af55c7042677282a@axis.com> (raw)
In-Reply-To: < <CAFA6WYNNTr0O60ggowzqpJVso5cySO=peBTBTzVm9MzZy8b4ww@mail.gmail.com>>

[-- Attachment #1: Type: text/plain, Size: 2283 bytes --]

Hi,


I'm attaching a reproducer (only CA, there is no TA used in this case ) and crash log for reference.


Regards,

Patrik

________________________________
From: Sumit Garg <sumit.garg@linaro.org>
Sent: Tuesday, December 14, 2021 8:41:20 AM
To: Lars Persson
Cc: op-tee(a)lists.trustedfirmware.org; Patrik Lantz
Subject: Re: drivers/tee double-free of page when optee_shm_register fails

Hi Lars,

On Fri, 10 Dec 2021 at 20:23, Lars Persson <larper@axis.com> wrote:
>
> Hi
>
> Me and Patrik have been tracing a kernel memory corruption bug that is
> triggered when op-tee runs out of resources and returns an error from
> the OPTEE_MSG_CMD_REGISTER_SHM call. This is yet another fall-out from
> Patrik's fuzzing of the TEE subsystem.
>
> The symptoms would look like this when page debugging is enabled:
> BUG: Bad page state in process optee_example_h  pfn:46bb0
> page:(ptrval) refcount:-1 mapcount:0 mapping:00000000 index:0x0 pfn:0x46bb0
> flags: 0x0(zone=0)
>
> Our reproducer runs a loop with the TEE_IOC_SHM_ALLOC until memory runs
> out at the optee-os end (dynamic SHM enabled). The error is 100%
> reproducible with such a loop.

Can you share a simple reproducer test application (CA and TA)?

>
> We have traced this down to what seems to be a miss in the memory
> ownership contract during the call to OPTEE_MSG_CMD_REGISTER_SHM.
>
> When pool_op_alloc() detects that optee_shm_register() has failed, it
> will free the allocated page at the very end of the function.
> Unfortunately that page has already been freed because OP-TEE has sent a
> OPTEE_RPC_CMD_SHM_FREE for this shm object before returning from
> OPTEE_MSG_CMD_REGISTER_SHM. This is my conclusion based on prints added
> to the code.

I can't see any RPC free command from OP-TEE in case the
OPTEE_MSG_CMD_REGISTER_SHM fails. Have you compared kernel addresses
for SHM during OPTEE_MSG_CMD_REGISTER_SHM and OPTEE_RPC_CMD_SHM_FREE?

>
> I cannot write a patch for this because I am at a loss of who actually
> is supposed to trigger the free of the pages in this situation. Is there
> an API spec that makes this clear ?

It should only be the pool_op_alloc() API in case
OPTEE_MSG_CMD_REGISTER_SHM fails.

-Sumit

>
> BR,
>   Lars



[-- Attachment #2: crashlog.txt --]
[-- Type: text/plain, Size: 2347 bytes --]

==================================================================
BUG: KASAN: double-free or invalid-free in tee_shm_alloc (/mnt/build/optee-qemu/linux/drivers/tee/tee_shm.c:210) 

CPU: 0 PID: 310 Comm: optee_example_h Not tainted 5.14.0 #10
Hardware name: Generic DT based system
(unwind_backtrace) from show_stack (/mnt/build/optee-qemu/linux/arch/arm/kernel/traps.c:254) 
(show_stack) from dump_stack_lvl (/mnt/build/optee-qemu/linux/lib/dump_stack.c:106 (discriminator 1)) 
(dump_stack_lvl) from print_address_description.constprop.0 (/mnt/build/optee-qemu/linux/mm/kasan/report.c:234) 
(print_address_description.constprop.0) from kasan_report_invalid_free (/mnt/build/optee-qemu/linux/mm/kasan/report.c:359) 
(kasan_report_invalid_free) from kfree (/mnt/build/optee-qemu/linux/./include/linux/vmstat.h:523 /mnt/build/optee-qemu/linux/mm/slub.c:3248 /mnt/build/optee-qemu/linux/mm/slub.c:4264) 
(kfree) from tee_shm_alloc (/mnt/build/optee-qemu/linux/drivers/tee/tee_shm.c:210) 
(tee_shm_alloc) from tee_ioctl (/mnt/build/optee-qemu/linux/drivers/tee/tee_core.c:296 /mnt/build/optee-qemu/linux/drivers/tee/tee_core.c:862) 
(tee_ioctl) from sys_ioctl (/mnt/build/optee-qemu/linux/fs/ioctl.c:52 /mnt/build/optee-qemu/linux/fs/ioctl.c:1029 /mnt/build/optee-qemu/linux/fs/ioctl.c:1067 /mnt/build/optee-qemu/linux/fs/ioctl.c:1055) 
(sys_ioctl) from ret_fast_syscall (/mnt/build/optee-qemu/linux/arch/arm/kernel/entry-common.S:51) 
Exception stack(0x86293fa8 to 0x86293ff0)
3fa0:                   00000016 000001a0 00000003 c010a401 20000080 00000001
3fc0: 00000016 000001a0 0049151d 00000036 47ba12d0 47ba0e10 47ba12d0 6ecaec88
3fe0: 47ba0cd0 47ba0cc0 00490e69 66c74d72

The buggy address belongs to the page:
page:(ptrval) refcount:0 mapcount:0 mapping:(ptrval) index:0x0 pfn:0x4686b
aops:0x40 ino:0
flags: 0x0(zone=0)
raw: 00000000 c0888d84 b80654bc 82401200 00000000 80200020 ffffffff 00000000
page dumped because: kasan: bad access detected

Memory state around the buggy address:
8686af80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
8686b000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
>8686b080: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
^
8686b100: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
8686b180: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
==================================================================

       reply	other threads:[~2021-12-14  8:30 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] < <CAFA6WYNNTr0O60ggowzqpJVso5cySO=peBTBTzVm9MzZy8b4ww@mail.gmail.com>
2021-12-14  8:30 ` Patrik Lantz [this message]
2021-12-14  9:55   ` drivers/tee double-free of page when optee_shm_register fails Sumit Garg
     [not found] < <CAFA6WYPFjiOhTnyi-NFCMhiXdsQr7Ro_YzXY-20Gg4e57Y8tEA@mail.gmail.com>
2021-12-16  8:09 ` Patrik Lantz
     [not found] < <CAFA6WYObPg3gTh9Vas55ae7AhRHWHV7sLNq8=BPNYKqK2aXS8g@mail.gmail.com>
2021-12-14 11:25 ` Patrik Lantz
2021-12-15 10:27   ` Sumit Garg
2021-12-10 14:53 Lars Persson
2021-12-14  7:41 ` Sumit Garg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d9d213441d174cb7af55c7042677282a@axis.com \
    --to=patrik.lantz@axis.com \
    --cc=op-tee@lists.trustedfirmware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.