From: Jason Gunthorpe <jgg@ziepe.ca>
To: Guoqing Jiang <guoqing.jiang@linux.dev>
Cc: leon@kernel.org, pchelkin@ispras.ru,
penguin-kernel@i-love.sakura.ne.jp, linux-rdma@vger.kernel.org
Subject: Re: [PATCH for-rc] RDMA/core: Call dev_put after query_port in iw_query_port
Date: Fri, 19 May 2023 11:03:26 -0300 [thread overview]
Message-ID: <ZGeBrhW2S5ukL6PS@ziepe.ca> (raw)
In-Reply-To: <20230519031119.30103-1-guoqing.jiang@linux.dev>
On Fri, May 19, 2023 at 11:11:19AM +0800, Guoqing Jiang wrote:
> There is a UAF report by syzbot.
>
> BUG: KASAN: slab-use-after-free in siw_query_port+0x37b/0x3e0 drivers/infiniband/sw/siw/siw_verbs.c:177
> Read of size 4 at addr ffff888034efa0e8 by task kworker/1:4/24211
>
> CPU: 1 PID: 24211 Comm: kworker/1:4 Not tainted 6.4.0-rc1-syzkaller-00012-g16a8829130ca #0
> Hardware name: Google Compute Engine/Google Compute Engine, BIOS Google 04/14/2023
> Workqueue: infiniband ib_cache_event_task
> Call Trace:
> <TASK>
> __dump_stack lib/dump_stack.c:88 [inline]
> dump_stack_lvl+0xd9/0x150 lib/dump_stack.c:106
> print_address_description.constprop.0+0x2c/0x3c0 mm/kasan/report.c:351
> print_report mm/kasan/report.c:462 [inline]
> kasan_report+0x11c/0x130 mm/kasan/report.c:572
> siw_query_port+0x37b/0x3e0 drivers/infiniband/sw/siw/siw_verbs.c:177
> iw_query_port drivers/infiniband/core/device.c:2049 [inline]
> ib_query_port drivers/infiniband/core/device.c:2090 [inline]
> ib_query_port+0x3c4/0x8f0 drivers/infiniband/core/device.c:2082
> ib_cache_update.part.0+0xcf/0x920 drivers/infiniband/core/cache.c:1487
> ib_cache_update drivers/infiniband/core/cache.c:1561 [inline]
> ib_cache_event_task+0x1b1/0x270 drivers/infiniband/core/cache.c:1561
> process_one_work+0x99a/0x15e0 kernel/workqueue.c:2405
> worker_thread+0x67d/0x10c0 kernel/workqueue.c:2552
> kthread+0x344/0x440 kernel/kthread.c:379
> ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:308
> </TASK>
>
> It happened because netdev could be freed if the last reference
> is released, but drivers still dereference netdev in query_port.
> So let's guard query_port with dev_hold and dev_put.
>
> Reported-by: syzbot+79f283f1f4ccc6e8b624@syzkaller.appspotmail.com
> Closes: https://lore.kernel.org/lkml/0000000000001f992805fb79ce97@google.com/
> Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
> ---
> I guess another option could be call ib_device_get_netdev to get
> netdev in siw_query_port instead of dereference netdev directly.
> If so, then other drivers (irdma_query_port and ocrdma_query_port)
> may need to make relevant change as well.
Something is wrong in siw if it is UAF'ing it's own memory:
attr->max_mtu = ib_mtu_int_to_enum(sdev->netdev->mtu);
It needs to protect sedv->netdev somehow on its own.
Jason
next prev parent reply other threads:[~2023-05-19 14:03 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-19 3:11 [PATCH for-rc] RDMA/core: Call dev_put after query_port in iw_query_port Guoqing Jiang
2023-05-19 14:03 ` Jason Gunthorpe [this message]
2023-05-19 14:05 ` Chuck Lever III
2023-05-22 2:34 ` Guoqing Jiang
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=ZGeBrhW2S5ukL6PS@ziepe.ca \
--to=jgg@ziepe.ca \
--cc=guoqing.jiang@linux.dev \
--cc=leon@kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=pchelkin@ispras.ru \
--cc=penguin-kernel@i-love.sakura.ne.jp \
/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.