lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <4c3486e8.26e6.18353b0a836.Coremail.windhl@126.com>
Date:   Mon, 19 Sep 2022 11:00:29 +0800 (CST)
From:   "Liang He" <windhl@....com>
To:     "David Ahern" <dsahern@...nel.org>
Cc:     davem@...emloft.net, yoshfuji@...ux-ipv6.org, edumazet@...gle.com,
        kuba@...nel.org, pabeni@...hat.com, netdev@...r.kernel.org
Subject: Re:Re: [PATCH] ipv4: ping: Fix potential use-after-free bug



At 2022-09-18 23:30:21, "David Ahern" <dsahern@...nel.org> wrote:
>On 9/16/22 4:07 AM, Liang He wrote:
>> In ping_unhash(), we should move sock_put(sk) after any possible
>> access point as the put function may free the object.
>
>unhash handlers are called from sk_common_release which still has a
>reference on the sock, so not really going to hit a UAF.
>

Thanks for this valuable lesson.

>I do agree that it does not read correctly to 'put' a reference then
>continue using the object. ie., the put should be moved to the end like
>you have here. This is more of a tidiness exercise than a need to
>backport to stable kernels.
>

OK, thanks.

>> 
>> Fixes: c319b4d76b9e ("net: ipv4: add IPPROTO_ICMP socket kind")
>> Signed-off-by: Liang He <windhl@....com>
>> ---
>> 
>>  I have found other places containing similar code patterns.
>> 
>>  net/ipv4/ping.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>> 
>> diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
>> index b83c2bd9d722..f90c86d37ffc 100644
>> --- a/net/ipv4/ping.c
>> +++ b/net/ipv4/ping.c
>> @@ -157,10 +157,10 @@ void ping_unhash(struct sock *sk)
>>  	spin_lock(&ping_table.lock);
>>  	if (sk_hashed(sk)) {
>>  		hlist_nulls_del_init_rcu(&sk->sk_nulls_node);
>> -		sock_put(sk);
>>  		isk->inet_num = 0;
>>  		isk->inet_sport = 0;
>>  		sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
>> +		sock_put(sk);
>>  	}
>>  	spin_unlock(&ping_table.lock);
>>  }

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ