public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@elte.hu>
To: Patrick McHardy <kaber@trash.net>
Cc: linux-kernel@vger.kernel.org, Andrew Morton <akpm@osdl.org>,
	coreteam@netfilter.org, "David S. Miller" <davem@davemloft.net>,
	Herbert Xu <herbert@gondor.apana.org.au>
Subject: Re: [netfilter-core] Re: [lockup] 2.6.17-rc3: netfilter/sctp: lockup in	sctp_new(), do_basic_checks()
Date: Tue, 2 May 2006 16:16:21 +0200	[thread overview]
Message-ID: <20060502141621.GA32284@elte.hu> (raw)
In-Reply-To: <4457654A.9040200@trash.net>


* Patrick McHardy <kaber@trash.net> wrote:

> I did a couple of minutes ago. Here it is again in case my last mail 
> won't show up.

> -	(sch = skb_header_pointer(skb, offset, sizeof(_sch), &_sch));	\
> -	offset += (htons(sch->length) + 3) & ~3, count++)
> +	(sch = skb_header_pointer(skb, offset, sizeof(_sch), &_sch)) &&  \
> +	sch->length; offset += (htons(sch->length) + 3) & ~3, count++)

but this makes do_basic_checks() not fail, and the clearly bogus packet 
is passed further down. The reason i have put it inside the loop is to 
be able to return 1 for the early checks. How about the fix below? It 
should be cleaner and it will also return 1 if the initial offset is 
oversized.

	Ingo

----
From: Ingo Molnar <mingo@elte.hu>

fix infinite loop in the SCTP-netfilter code: check SCTP chunk size to 
guarantee progress of for_each_sctp_chunk(). (all other uses of 
for_each_sctp_chunk() are preceded by do_basic_checks(), so this fix 
should be complete.)

Signed-off-by: Ingo Molnar <mingo@elte.hu>

---
 net/ipv4/netfilter/ip_conntrack_proto_sctp.c |   16 +++++++++++++---
 1 files changed, 13 insertions(+), 3 deletions(-)

Index: linux/net/ipv4/netfilter/ip_conntrack_proto_sctp.c
===================================================================
--- linux.orig/net/ipv4/netfilter/ip_conntrack_proto_sctp.c
+++ linux/net/ipv4/netfilter/ip_conntrack_proto_sctp.c
@@ -224,6 +224,13 @@ static int do_basic_checks(struct ip_con
 	DEBUGP(__FUNCTION__);
 	DEBUGP("\n");
 
+	/*
+	 * Dont trust the initial offset:
+	 */
+	offset = skb->nh.iph->ihl * 4 + sizeof(sctp_sctphdr_t);
+	if (offset >= skb->len)
+		return 1;
+
 	flag = 0;
 
 	for_each_sctp_chunk (skb, sch, _sch, offset, count) {
@@ -235,12 +242,15 @@ static int do_basic_checks(struct ip_con
 			flag = 1;
 		}
 
-		/* Cookie Ack/Echo chunks not the first OR 
-		   Init / Init Ack / Shutdown compl chunks not the only chunks */
+		/*
+		 * Cookie Ack/Echo chunks not the first OR 
+		 * Init / Init Ack / Shutdown compl chunks not the only chunks
+		 * OR zero-length.
+		 */
 		if ((sch->type == SCTP_CID_COOKIE_ACK 
 			|| sch->type == SCTP_CID_COOKIE_ECHO
 			|| flag)
-		     && count !=0 ) {
+		     && count !=0 || !sched->length) {
 			DEBUGP("Basic checks failed\n");
 			return 1;
 		}

  reply	other threads:[~2006-05-02 14:11 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-05-02 11:34 [lockup] 2.6.17-rc3: netfilter/sctp: lockup in sctp_new(), do_basic_checks() Ingo Molnar
2006-05-02 13:40 ` Ingo Molnar
2006-05-02 13:45   ` Ingo Molnar
2006-05-02 13:54   ` [netfilter-core] " Patrick McHardy
2006-05-02 14:01     ` Ingo Molnar
2006-05-02 13:57       ` Patrick McHardy
2006-05-02 14:16         ` Ingo Molnar [this message]
2006-05-02 14:24           ` Ingo Molnar
2006-05-02 14:29           ` Patrick McHardy
2006-05-02 14:38             ` Ingo Molnar
2006-05-02 14:35               ` Patrick McHardy
2006-05-02 14:42               ` Ingo Molnar
2006-05-02 14:40                 ` Patrick McHardy
2006-05-02 13:45 ` [netfilter-core] " Patrick McHardy
2006-05-02 15:34 ` Marcel Holtmann
2006-05-02 15:55   ` [netfilter-core] " 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=20060502141621.GA32284@elte.hu \
    --to=mingo@elte.hu \
    --cc=akpm@osdl.org \
    --cc=coreteam@netfilter.org \
    --cc=davem@davemloft.net \
    --cc=herbert@gondor.apana.org.au \
    --cc=kaber@trash.net \
    --cc=linux-kernel@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