Thread (8 messages) flat view 8 messages, 3 authors, 2017-03-02

Re: net: use-after-free in neigh_timer_handler/sock_wfree

From: Cong Wang <hidden>
Date: 2017-03-01 23:11:45
Also in: lkml

On Wed, Mar 1, 2017 at 1:54 PM, Eric Dumazet [off-list ref] wrote:
On Wed, Mar 1, 2017 at 1:43 PM, Cong Wang [off-list ref] wrote:
quoted
quoted
This one looks very similar to a previous one:
https://groups.google.com/forum/#!topic/syzkaller/BhyN5OFd7sQ

Both happen on raw v6 sockets.

For me, it seems the sk refcnt is not correct, skb should still hold
a refcnt so it should not be freed before kfree_skb() in a timer
handler...
More precisely, after this commit:

commit 2b85a34e911bf483c27cfdd124aeb1605145dc80
Author: Eric Dumazet [off-list ref]
Date:   Thu Jun 11 02:55:43 2009 -0700

    net: No more expensive sock_hold()/sock_put() on each tx

we don't take (old) refcnt any more on TX path, sk_wmem_alloc
is the new refcnt. ;)
So the bug is that skb->truesize is mangled by reassembly unit,
while sbk->sk is tracking sk_wmem_alloc changes in order
to decide when it is safe to free sk.
That is my suspicion as well, skb->truesize is updated somewhere
but sk->sk_wmem_alloc isn't, so leads to this bug.
This is why we need to call skb_orphan(), as we did for IPv4 in
8282f27449bf15548

But I doubt skb_orphan() is the solution here, shouldn't we just
update sk->sk_wmem_alloc with skb->truesize changes?
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help