Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 8 Jan 2001 21:40:26 -0800
From:      Don Lewis <Don.Lewis@tsc.tdk.com>
To:        Mike Silbersack <silby@silby.com>, Umesh Krishnaswamy <umesh@juniper.net>
Cc:        <freebsd-security@FreeBSD.ORG>
Subject:   Re: Spoofing multicast addresses
Message-ID:  <200101090540.VAA15528@salsa.gv.tsc.tdk.com>
In-Reply-To: <Pine.BSF.4.31.0101082237330.11619-100000@achilles.silby.com>
References:   <Pine.BSF.4.31.0101082237330.11619-100000@achilles.silby.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Jan 8, 10:39pm, Mike Silbersack wrote:
} Subject: Re: Spoofing multicast addresses
} 
} On Mon, 8 Jan 2001, Umesh Krishnaswamy wrote:
} 
} > Hi Folks,
} >
} > I was looking at the code for tcp_drop(). If there is a SYN flood attack,
} > tcp_drop is called to drop the connection on a listen queue overflow. tcp_drop
} > in turn sends an RST packet if it is in the SYN_RCVD state. If the attacker
} > spoofs multicast IP addresses, then there will be a flood of RST packets being
} > sent out by the machine.
} >
} > I am unclear on the RFCs, but shouldn't the tcp_drop code check if the src
} > address is multicast, if so drop without RST. Or maybe, even before that,
} > tcp_input should not accept SYN packets from multicast IP addresses.
} >
} > Thanks.
} > Umesh.
} 
} The check is done when the SYN is received, hence such a situation as you
} describe should not be able to occur.
} 
} >From tcp_input.c:
} 
} 
}                 /*
}                  * RFC1122 4.2.3.10, p. 104: discard bcast/mcast SYN
}                  * in_broadcast() should never return true on a received
}                  * packet with M_BCAST not set.
}                  *
}                  * Packets with a multicast source address should also
}                  * be discarded.
}                  */
}                 if (m->m_flags & (M_BCAST|M_MCAST))
}                         goto drop;

That's the destination address check.  You left out the following:

#ifdef INET6
                if (isipv6) {
                        if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst) ||
                            IN6_IS_ADDR_MULTICAST(&ip6->ip6_src))
                                goto drop;
                } else 
#endif
                if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr)) ||
                    IN_MULTICAST(ntohl(ip->ip_src.s_addr)) ||
                    ip->ip_src.s_addr == htonl(INADDR_BROADCAST))
                        goto drop;

This is where it needs to be checked, otherwise the initial
SYN-ACK response would be sent to the multicast address.

This implementation isn't totally bulletproof, since it doesn't
check for local broadcast source addresses.  In a hostile
environment you'll probably want to explicity filter them with your
favorite packet filter.


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-security" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200101090540.VAA15528>