Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1680658 > unrolled thread

'skb' buffer address information leakage

Started byDison River <pwn2river@gmail.com>
First post2017-07-04 07:20 +0200
Last post2017-07-04 20:20 +0200
Articles 4 — 4 participants

Back to article view | Back to linux.kernel


Contents

  'skb' buffer address information leakage Dison River <pwn2river@gmail.com> - 2017-07-04 07:20 +0200
    Re: 'skb' buffer address information leakage Jakub Kicinski <jakub.kicinski@netronome.com> - 2017-07-04 07:30 +0200
    Re: 'skb' buffer address information leakage Greg KH <greg@kroah.com> - 2017-07-04 09:50 +0200
    Re: 'skb' buffer address information leakage Stephen Hemminger <stephen@networkplumber.org> - 2017-07-04 20:20 +0200

#1680658 — 'skb' buffer address information leakage

FromDison River <pwn2river@gmail.com>
Date2017-07-04 07:20 +0200
Subject'skb' buffer address information leakage
Message-ID<tZopI-3Hm-9@gated-at.bofh.it>
Hi all:
I'd found several address leaks of "skb" buffer.When i have a
arbitrary address write vulnerability in kernel(enabled kASLR),I can
use skb's address find sk_destruct's address and overwrite it. And
then,invoke close(sock_fd) function can trigger the
shellcode(sk_destruct func).

In kernel 4.12-rc7
drivers/net/irda/vlsi_ir.c:326           seq_printf(seq, "skb=%p
data=%p hw=%p\n", rd->skb, rd->buf, rd->hw);
drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c:167
         seq_printf(file, " frag=%p", skb);
drivers/net/wireless/ath/wil6210/debugfs.c:926           seq_printf(s,
"  SKB = 0x%p\n", skb);

Thanks.

[toc] | [next] | [standalone]


#1680661

FromJakub Kicinski <jakub.kicinski@netronome.com>
Date2017-07-04 07:30 +0200
Message-ID<tZozn-3Ky-1@gated-at.bofh.it>
In reply to#1680658
On Tue, 4 Jul 2017 13:12:18 +0800, Dison River wrote:
> drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c:167
>          seq_printf(file, " frag=%p", skb);

FWIW that's actually not a skb pointer.  The structure is defined like
this:

struct nfp_net_tx_buf {
        union { 
                struct sk_buff *skb;
                void *frag;
        };
        dma_addr_t dma_addr;
        short int fidx;
        u16 pkt_cnt;
        u32 real_len;
};

So the line in question is actually reading the frag pointer, I just
reused the skb variable, because this has to be read via READ_ONCE()
and NULL-checked so I thought that doing it separately for skb and
frag is a waste of LOC especially in debug code.  I will queue up a
clean up for after the merge window.

Thanks!

[toc] | [prev] | [next] | [standalone]


#1680728

FromGreg KH <greg@kroah.com>
Date2017-07-04 09:50 +0200
Message-ID<tZqKS-5ky-7@gated-at.bofh.it>
In reply to#1680658
On Tue, Jul 04, 2017 at 01:12:18PM +0800, Dison River wrote:
> Hi all:
> I'd found several address leaks of "skb" buffer.When i have a
> arbitrary address write vulnerability in kernel(enabled kASLR),I can
> use skb's address find sk_destruct's address and overwrite it. And
> then,invoke close(sock_fd) function can trigger the
> shellcode(sk_destruct func).
> 
> In kernel 4.12-rc7
> drivers/net/irda/vlsi_ir.c:326           seq_printf(seq, "skb=%p
> data=%p hw=%p\n", rd->skb, rd->buf, rd->hw);

Irda doesn't even work, and will crash, so it's a bit hard to see this
as a "leakage" :)

I'm going to be ripping irda out soon anyway, so this isn't a real
issue.

> drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c:167
>          seq_printf(file, " frag=%p", skb);
> drivers/net/wireless/ath/wil6210/debugfs.c:926           seq_printf(s,
> "  SKB = 0x%p\n", skb);


debugfs is by nature, root-only access, so the potential for issues here
is lower than "any user can get this info".  That being said, patches
for these are always appreciated.

I also need to respin my "turn %p pointers off" patchset to prevent
future stuff like this from happening.  I want to get to that after
4.13-rc1 is out.

thanks,

greg k-h

[toc] | [prev] | [next] | [standalone]


#1681115

FromStephen Hemminger <stephen@networkplumber.org>
Date2017-07-04 20:20 +0200
Message-ID<tZAAx-3tZ-5@gated-at.bofh.it>
In reply to#1680658
On Tue, 4 Jul 2017 13:12:18 +0800
Dison River <pwn2river@gmail.com> wrote:

> Hi all:
> I'd found several address leaks of "skb" buffer.When i have a
> arbitrary address write vulnerability in kernel(enabled kASLR),I can
> use skb's address find sk_destruct's address and overwrite it. And
> then,invoke close(sock_fd) function can trigger the
> shellcode(sk_destruct func).
> 
> In kernel 4.12-rc7
> drivers/net/irda/vlsi_ir.c:326           seq_printf(seq, "skb=%p
> data=%p hw=%p\n", rd->skb, rd->buf, rd->hw);
> drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c:167
>          seq_printf(file, " frag=%p", skb);
> drivers/net/wireless/ath/wil6210/debugfs.c:926           seq_printf(s,
> "  SKB = 0x%p\n", skb);
> 
> Thanks.

Debugfs support is optional with Netronome. If concerned about security,
then it should be disabled.

The WIIL6210 driver debugfs has other worse address leaks.
The whole debugfs support in this driver should be made optional
(or removed).

The VLSI /oroc interface likewise should just be removed (or made
optional). Most distributions do not build IRDA anymore anyway.

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web