]> git.baikalelectronics.ru Git - kernel.git/commit
af-unix: fix use-after-free with concurrent readers while splicing
authorHannes Frederic Sowa <hannes@stressinduktion.org>
Tue, 10 Nov 2015 15:23:15 +0000 (16:23 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sun, 15 Nov 2015 18:16:34 +0000 (13:16 -0500)
commit95a726af9fba8eea49a4a002c24a9413d62da46e
tree38dbb1ef110ad0c1edfa88e331051d328adc6197
parentfaf4a8eb8c14f95864bf01235ae1b7a08d565283
af-unix: fix use-after-free with concurrent readers while splicing

During splicing an af-unix socket to a pipe we have to drop all
af-unix socket locks. While doing so we allow another reader to enter
unix_stream_read_generic which can read, copy and finally free another
skb. If exactly this skb is just in process of being spliced we get a
use-after-free report by kasan.

First, we must make sure to not have a free while the skb is used during
the splice operation. We simply increment its use counter before unlocking
the reader lock.

Stream sockets have the nice characteristic that we don't care about
zero length writes and they never reach the peer socket's queue. That
said, we can take the UNIXCB.consumed field as the indicator if the
skb was already freed from the socket's receive queue. If the skb was
fully consumed after we locked the reader side again we know it has been
dropped by a second reader. We indicate a short read to user space and
abort the current splice operation.

This bug has been found with syzkaller
(http://github.com/google/syzkaller) by Dmitry Vyukov.

Fixes: 48a17f1ff89b ("net: af_unix: implement splice for stream af_unix sockets")
Reported-by: Dmitry Vyukov <dvyukov@google.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/unix/af_unix.c