From: Michael Scott <michael@opensourcefoundries.com>
To: Alexander Aring <aring@mojatatu.com>
Cc: Jukka Rissanen <jukka.rissanen@linux.intel.com>,
"David S. Miller" <davem@davemloft.net>,
linux-bluetooth@vger.kernel.org, linux-wpan@vger.kernel.org,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] 6lowpan: iphc: reset mac_header after decompress to fix panic
Date: Mon, 2 Jul 2018 12:45:41 -0700 [thread overview]
Message-ID: <516fbc65-cc4b-8016-de5a-e2240b779d15@opensourcefoundries.com> (raw)
In-Reply-To: <20180702185438.dqqjg6k45iefj5is@x220t>
Hello Alexander,
On 07/02/2018 11:54 AM, Alexander Aring wrote:
> Hi,
>
> On Tue, Jun 19, 2018 at 04:44:06PM -0700, Michael Scott wrote:
>> After decompression of 6lowpan socket data, an IPv6 header is inserted
>> before the existing socket payload. After this, we reset the
>> network_header value of the skb to account for the difference in payload
>> size from prior to decompression + the addition of the IPv6 header.
>>
>> However, we fail to reset the mac_header value.
>>
>> Leaving the mac_header value untouched here, can cause a calculation
>> error in net/packet/af_packet.c packet_rcv() function when an
>> AF_PACKET socket is opened in SOCK_RAW mode for use on a 6lowpan
>> interface.
>>
>> On line 2088, the data pointer is moved backward by the value returned
>> from skb_mac_header(). If skb->data is adjusted so that it is before
>> the skb->head pointer (which can happen when an old value of mac_header
>> is left in place) the kernel generates a panic in net/core/skbuff.c
>> line 1717.
>>
>> This panic can be generated by BLE 6lowpan interfaces (such as bt0) and
>> 802.15.4 interfaces (such as lowpan0) as they both use the same 6lowpan
>> sources for compression and decompression.
>>
>> Signed-off-by: Michael Scott <michael@opensourcefoundries.com>
>> ---
>> net/6lowpan/iphc.c | 1 +
>> 1 file changed, 1 insertion(+)
>>
>> diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
>> index 6b1042e21656..52fad5dad9f7 100644
>> --- a/net/6lowpan/iphc.c
>> +++ b/net/6lowpan/iphc.c
>> @@ -770,6 +770,7 @@ int lowpan_header_decompress(struct sk_buff *skb, const struct net_device *dev,
>> hdr.hop_limit, &hdr.daddr);
>>
>> skb_push(skb, sizeof(hdr));
>> + skb_reset_mac_header(skb);
>> skb_reset_network_header(skb);
>> skb_copy_to_linear_data(skb, &hdr, sizeof(hdr));
>>
> I think it's good to make that if the mac_header gets a dangled pointer.
> But we don't have a mac header at this point anymore...
>
> There exists also some functionality that the MAC header is not set, I
> suppose this can be usefuly for tun like interfaces e.g. RAW IP what we
> have here.
>
> skb_mac_header_was_set
>
> which does:
>
> return skb->mac_header != (typeof(skb->mac_header))~0U;
>
> maybe we can set it as (typeof(skb->mac_header))~0U and then everything
> will run as far the kernel will not crash anymore.
>
> Question is for me: which upper layer wants access MAC header here on
> receive path?
> It cannot parsed anyhow because so far I know no upper layer can parse
> at the moment 802.15.4 frames (which is a complex format). Maybe over
> some header_ops callback?
I was testing a C program which performs NAT64 handling on packets
destined to a certain IPv6 subnet (64:ff9b::). To do this, the
application opens a RAW socket like this: sniff_sock = socket(PF_PACKET,
SOCK_RAW, htons(ETH_P_ALL)); It then sets promiscuous mode and enters a
looping call of:
length = recv(sniff_sock, buffer, PACKET_BUFFER, MSG_TRUNC); My host PC
kernel would then promptly crash on me. (I'm going to purposely avoid
the obvious point of: this probably isn't the best way to parse packets
for NAT64 translation as you will get every single packet incoming or
outgoing on the host.) Turns out, testing the program on an 802.15.4
6lowpan interface exposed some of the issues which this mailing list
(but not myself) is well aware of (no L2 data in the RAW packets) and
also led me to debugging this patch to stop the kernel crash. TL;DR: To
summarize, any PF_PACKET SOCK_RAW socket which recv()'s IPv6 data from a
6lowpan node will cause this kernel crash eventually (checked on kernel
4.15, 4.16, 4.17 and 4.18-rc1). - Mike
>
> - Alex
next prev parent reply other threads:[~2018-07-02 19:45 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-19 23:44 [PATCH] 6lowpan: iphc: reset mac_header after decompress to fix panic Michael Scott
2018-07-02 18:54 ` Alexander Aring
2018-07-02 19:45 ` Michael Scott [this message]
2018-07-02 20:43 ` Alexander Aring
2018-07-02 21:31 ` Alexander Aring
2018-07-03 13:48 ` Alexander Aring
2018-07-05 11:34 ` Stefan Schmidt
2018-07-05 11:42 ` Jukka Rissanen
2018-07-05 11:59 ` Stefan Schmidt
2018-07-06 10:46 ` Marcel Holtmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=516fbc65-cc4b-8016-de5a-e2240b779d15@opensourcefoundries.com \
--to=michael@opensourcefoundries.com \
--cc=aring@mojatatu.com \
--cc=davem@davemloft.net \
--cc=jukka.rissanen@linux.intel.com \
--cc=linux-bluetooth@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-wpan@vger.kernel.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).