From: Patrick McHardy <kaber@trash.net>
To: David Miller <davem@davemloft.net>
Cc: davej@redhat.com, netdev@vger.kernel.org,
netfilter-devel@vger.kernel.org, pablo@netfilter.org
Subject: Re: [PATCH] Use unsigned variables for packet lengths in ip[6]_queue.
Date: Tue, 07 Jun 2011 14:59:08 +0200 [thread overview]
Message-ID: <4DEE209C.2010104@trash.net> (raw)
In-Reply-To: <20110602.135742.1323883827030625599.davem@davemloft.net>
[-- Attachment #1: Type: text/plain, Size: 2230 bytes --]
On 02.06.2011 22:57, David Miller wrote:
> From: Dave Jones <davej@redhat.com>
> Date: Fri, 27 May 2011 20:36:51 -0400
>
>> On Tue, Apr 19, 2011 at 08:41:05PM -0700, David Miller wrote:
>> > From: Dave Jones <davej@redhat.com>
>> > Date: Tue, 19 Apr 2011 21:42:22 -0400
>> >
>> > > Not catastrophic, but ipqueue seems to be too trusting of what it gets
>> > > passed from userspace, and passes it on down to the page allocator,
>> > > where it will spew warnings if the page order is too high.
>> > >
>> > > __ipq_rcv_skb has several checks for lengths too small, but doesn't
>> > > seem to have any for oversized ones. I'm not sure what the maximum
>> > > we should check for is. I'll code up a diff if anyone has any ideas
>> > > on a sane maximum.
>> >
>> > Maybe the thing to do is to simply pass __GFP_NOWARN to nlmsg_new()
>> > in netlink_ack()?
>> >
>> > Anyone else have a better idea?
>>
>> So I went back to this today, and found something that doesn't look right.
>> After adding some instrumentation, and re-running my tests, I found that
>> the reason we were blowing up with enormous allocations was that we
>> were passing down a nlmsglen's like -1061109568
>>
>> Is there any reason for that to be signed ?
>> The nlmsg_len entry of nlmsghdr is a u32, so I'm assuming this is a bug.
>>
>> With the patch below, I haven't been able to reproduce the problem, but
>> I don't know if I've inadvertantly broken some other behaviour somewhere
>> deeper in netlink where this is valid.
This is fine, but I'm wondering whether this can really fix the problem
you've been seeing. Before the packet is reallocated, the length of
nlmsglen - NLMSGLEN(0) - sizeof(struct ipq_peer_msg) is compared to
ipq_peer_msg->data_len, so both values need to be wrong.
ipq_peer_msg->data_len is a size_t, so it's unsigned.
I think what we should additionally do is verify that data_len < 65535
since that's the maximum size of an IP packet.
Using __GFP_NOWARN also makes sense in my opinion since ip_queue
prints a warning anyways and we return an errno code to userspace.
On second thought, we could also simply use GFP_KERNEL, AFAICS
packet reinjection does not happen in atomic context. I'll give
that a try.
[-- Attachment #2: x --]
[-- Type: text/plain, Size: 920 bytes --]
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c
index f7f9bd7..8ded42d 100644
--- a/net/ipv4/netfilter/ip_queue.c
+++ b/net/ipv4/netfilter/ip_queue.c
@@ -279,6 +279,9 @@ ipq_mangle_ipv4(ipq_verdict_msg_t *v, struct nf_queue_entry *e)
if (v->data_len < sizeof(*user_iph))
return 0;
+ if (v->data_len > 65535)
+ return -EMSGSIZE;
+
diff = v->data_len - e->skb->len;
if (diff < 0) {
if (pskb_trim(e->skb, v->data_len))
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c
index 065fe40..4ea6a9d 100644
--- a/net/ipv6/netfilter/ip6_queue.c
+++ b/net/ipv6/netfilter/ip6_queue.c
@@ -279,6 +279,9 @@ ipq_mangle_ipv6(ipq_verdict_msg_t *v, struct nf_queue_entry *e)
if (v->data_len < sizeof(*user_iph))
return 0;
+ if (v->data_len > 65535)
+ return -EMSGSIZE;
+
diff = v->data_len - e->skb->len;
if (diff < 0) {
if (pskb_trim(e->skb, v->data_len))
next prev parent reply other threads:[~2011-06-07 12:59 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-20 1:42 ipqueue allocation failure Dave Jones
2011-04-20 3:41 ` David Miller
2011-04-20 5:27 ` Eric Dumazet
2011-05-28 0:36 ` [PATCH] Use unsigned variables for packet lengths in ip[6]_queue Dave Jones
2011-06-02 19:24 ` Dave Jones
2011-06-02 20:57 ` David Miller
2011-06-07 12:59 ` Patrick McHardy [this message]
2011-06-07 14:19 ` Patrick McHardy
2011-06-07 14:39 ` Dave Jones
2011-06-07 15:19 ` Patrick McHardy
2011-06-03 10:07 ` Pablo Neira Ayuso
2011-04-21 15:13 ` ipqueue allocation failure Patrick McHardy
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=4DEE209C.2010104@trash.net \
--to=kaber@trash.net \
--cc=davej@redhat.com \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=pablo@netfilter.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).