]> git.baikalelectronics.ru Git - kernel.git/commit
mctp: prevent double key removal and unref
authorJeremy Kerr <jk@codeconstruct.com.au>
Wed, 12 Oct 2022 02:08:51 +0000 (10:08 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 12 Oct 2022 12:30:50 +0000 (13:30 +0100)
commitf1c30d6cd72e2d52ef777445d8a550abe708c140
treef65f1c8b1b23ce517fb173eb336fd3e3da6537d3
parente39bd9bf4dc9d95386b069ccbd0331f65ebceb63
mctp: prevent double key removal and unref

Currently, we have a bug where a simultaneous DROPTAG ioctl and socket
close may race, as we attempt to remove a key from lists twice, and
perform an unref for each removal operation. This may result in a uaf
when we attempt the second unref.

This change fixes the race by making __mctp_key_remove tolerant to being
called on a key that has already been removed from the socket/net lists,
and only performs the unref when we do the actual remove. We also need
to hold the list lock on the ioctl cleanup path.

This fix is based on a bug report and comprehensive analysis from
butt3rflyh4ck <butterflyhuangxx@gmail.com>, found via syzkaller.

Cc: stable@vger.kernel.org
Fixes: bf2078784326 ("mctp: Add SIOCMCTP{ALLOC,DROP}TAG ioctls for tag control")
Reported-by: butt3rflyh4ck <butterflyhuangxx@gmail.com>
Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mctp/af_mctp.c
net/mctp/route.c