Date: Tue, 25 Jan 2000 11:34:14 -0700 From: Brett Glass <brett@lariat.org> To: Warner Losh <imp@village.org> Cc: security@FreeBSD.ORG Subject: Re: Merged patches Message-ID: <4.2.2.20000125110039.01a517c0@localhost> In-Reply-To: <200001251722.KAA04527@harmony.village.org> References: <Your message of "Tue, 25 Jan 2000 10:09:32 MST." <4.2.2.20000125095042.01a5aba0@localhost> <4.2.2.20000125095042.01a5aba0@localhost>
next in thread | previous in thread | raw e-mail | index | archive | help
At 10:22 AM 1/25/2000 , Warner Losh wrote:
>By what code paths is this possible? Please be specific.
I'd be glad to submit a patch for this. Here's the
rationale: Go to the /sys/netinet directory and execute
the command
grep IN_MULTICAST *
You'll see lots and LOTS of tests of the source addresses
of packets to see if they're multicast addresses. But
the tests are scattered all over; there's no central
location where the test occurs, and it's not used
to prevent packets from entering the TCP portion of
the stack (at least until things are patched).
There's a strong argument for conducting a single test
for a multicast source address and setting a M_SRC_MCAST
flag. I'd want others' opinion on where the best place is
to do this, but it should certainly be done before the
IP layer has a chance to do any of the individual tests
we see in that grep.
>: Also, in at least one place (maybe more), the code does
>: multiple tests of the TCP option flags in succession.
>: Several tests of this kind should generally be merged
>: into a switch for speed (the many conditional jumps
>: cause pipeline stalls on many processors, especially
>: older ones) and readability.
>
>It does? If so, it certainly doesn't ADD them.
It's a cumulative effect. In the diff, for example,
I see:
@ -999,7 +995,7 @@
if (thflags & TH_RST)
goto drop;
if (thflags & TH_ACK)
- goto dropwithreset;
+ goto maybedropwithreset;
if ((thflags & TH_SYN) == 0)
goto drop;
if (th->th_dport == th->th_sport) {
which means that the tests are starting to pile up.
IIRC there were a few other places where the tests
were either stacked or might as well have been (they
were interspersed with other code).
>: In short, I'd only go with this patch as-is if my
>: purpose were to minimize the changes made before
>: release. If this were the goal, I'd go back to the
>: code immediately thereafter and try to tackle some
>: of the inefficiencies and holes in this key input
>: path more aggressively.
>
>Yes. That's exactly the goal.
In that case, you're doing the right thing. I'd
ultimately like to see (and would be willing to take
time to participate in) a code review of the entire
file, though. This is SUCH an important routine....
It deserves the best optimization that can be done.
>Like I said in my initial mail, I may remove the ICMP_BANDLIM option
>as an option, but bump the rate limiter to 1000. But that's about as
>far as I'd be willing to go at this time.
I'll bet Matt will say that any deviation from protocol
should be optional. ;-)
I'd sure like to see rate limiting on RSTs separated from rate limiting
on ICMP, though. After all, the ICMP packets are a side effect of
the DoS we're discussing here; they occur AFTER we generate too many
RSTs. The fact that some RSTs were dropped when you turned on ICMP_BANDLIM
in the original code seems to me to be somewhat of a lucky accident.
--Brett
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?4.2.2.20000125110039.01a517c0>
