Date: Thu, 19 Sep 1996 01:10:53 -0700 From: FreeBSD Security Officer <security-officer@freebsd.org> To: freebsd-security-notifications@freebsd.org Cc: security@freebsd.org Message-ID: <199609190810.BAA15858@precipice.shockwave.com>
next in thread | raw e-mail | index | archive | help
-----BEGIN PGP SIGNED MESSAGE-----
DRAFT
DRAFT Wed Sep 18 23:22:44 PDT 1996
DRAFT
DRAFT Distribution unlimited, however there are likely to be errors or
DRAFT ommissions in this text. This will be incorporated into a formal
DRAFT FreeBSD Security Advisory as soon as this document has been reviewed
DRAFT and more experience with the system tuning parameters is available.
DRAFT -- pst 18sep96
DRAFT
"Some comments from the FreeBSD Security Officer
regarding recent SYN flooding attacks."
Paul Traina
FreeBSD, Inc.
courtesy of
Juniper Networks, Inc.
How to detect and tune FreeBSD systems to resist SYN flooding attacks.
----------------------------------------------------------------------
(1) How do I know if I'm under attack?
The attack will cause one of the TCP statistics counters in FreeBSD
to increment. Under normal circumstances, this counter will rarely,
if ever, increment, however if connection queues are being overflowed,
we will register this event.
% netstat -s | grep "listen queue overflows"
0 listen queue overflows
If this value is growing rapidly over time, you may be under
at that moment.
If you suspect you are a likely target, we suggest that you
write a script to periodicly check this counter and notify the
appropriate folks if you see it rise rapidly over several polling
periods.
(2) How do I make my FreeBSD system invulnerable to this attack?
The only sure way to stop the attack is to turn off the services that
the attacker is attempting to thwart. Clearly, there are some services
that can easily be eliminated (e.g. the echo and discard services),
but this "cure" is worse than the disease if your service is fundamental
to your endeavors (such as a HTTP server or SMTP server).
There is no sure way of stopping the SYN flood attack. The packets
that are sent appear to be legitimate connection attempts, and as
such, any filter put in place on the destination host designed to
eliminate these requests would deny desired services.
An attacker with a high-bandwidth path to a target host is virtually
unstoppable. We can tune the system to make it resistant to the SYN
flood attack, but a suitably malicious character with significant
resources can cause denial of service attacks several ways (including
tricking the system administrator to inadvertently mis-tune their system
so that legitimate connection attempts now fail).
(3) What can I do about this attack?
First off, there is a bug in the BSD TCP implementation that
causes the system to hold onto resources longer than it should.
Specificly, under some circumstances, the system will hold onto
half-open connections for up to 12 minutes, instead of the anticipated
75 seconds. This bug is documented in Stevens volume 3.
The first thing anyone should do is apply the provided patches to
your FreeBSD system to eliminate this bug.
In addition to fixing this TCP implementation bug, we have added
the ability to tune the kernel on the fly, should an attack be
discovered in progress.
We do not recommend tuning the kernel under normal circumstances.
The default values are perfectly reasonable.
The variables are modified using the sysctl(1) program.
kern.somaxconn - maximum number of entries allowable
in the listen queue per socket
kern.sominqueue - minimum configurable queue length
(override the value passed to the
kernel in the listen() system call)
net.inet.tcp.keepinit - maximum time to wait for connection
to move to established state
You need to be reasonably intelligent when setting these values.
You're "tuning" your system. When a system is under attack, the
nature of the service you are providing and the aggressiveness of
the attack dictate the settings of these parameters. Remember,
it's possible to mis-tune your system so that you will deny
legitimate connection attempts, which means you're doing your
attacker's job.
net.inet.tcp.keepinit
The net.inet.tcp.keepinit variable controls the time the system will
wait for a SYN ACK before tossing away a connection. Since the SYN
flood attack relies on filling up a connection queue until the entries
in the queue are aged out, reducing the time an entry may remain in
the queue will effectively strengthen your system. The default value
of 75 seconds was chosen as a "worst case" where a connection attempt
was started over a high delay link and an acknowledgment or two were
lost along the way, causing one or both sides to retransmit.
Common wisdom today is that this timer may be set as low as 15 seconds
without significantly affecting most legitimate connection attempts.
If you set this timer too short, only "nearby" hosts with highly
reliable links will be able to connect to your services.
kern.somaxconn
The kern.somaxconn variable is a high-water limit on the maximum
number of pending connections a server may request. When a server
is started under BSD, it will request a maximum number of pending
connections. Most servers request "0" which means use the system
maximum (which is controlled by kern.somaxconn). The default value
under FreeBSD is 128 connections. This means that unless a server
requests otherwise, we'll allow up to 128 "pending" connections
on a given tcp port (plus a little fudge factor).
By increasing the maximum length of the connection queue, you
allow more half-open connections to remain active (until they are
expired). Remember though, that each half-open connection requires
the system to maintain some state. If you set the connection queue
length too large, an attacker can run your system out of memory.
Some FreeBSD users have raised this limit to 10000 when under attack
(and restarted their servers so the new limit takes affect) and have
not reported problems.
kern.sominqueue
A given server may request fewer than the system maximum queue
limit. This is usually done in cases where a service is provided
where low response latency is key. If a transaction has sat around
in a queue for a long time, there's no point in completing the
transaction. This isn't the typical case.
If you have such a server, and you are unable to change the code
to eliminate this artificial limitation, there's one thing you can
try. The kern.sominqueue variable overrides any minimum queue
length requests made by the server. The default for this variable
is 0, which means that a server may request a tiny queue and that
request will be respected.
There really should be no reason to override the minimum queue value.
If you do raise it, you may inadvertently affect the operation of
other services operating on the local machine. Basicly, this is a
sledge-hammer approach to tuning the system when no other option is
available.
(4) How do we fix this once and for all?
Unfortunately, this is a vulnerability in the design of TCP. A fair
number of protocol experts are musing over ways to fix this.
The best solutions to date require an authenticated IP layer.
There are changes being made to the Internet infrastructure which will
make it more difficult for attackers to operate without detection, but
for the time being, without a change to the TCP protocol or the addition
of authentication below TCP, there simply is no "solution" that isn't as
bad as the problem itself, despite the claims of "anti-SYN" product
vendors.
(5) Where do I get these patches?
These patches have been incorporated into FreeBSD 2.1-STABLE and
FreeBSD 2.2-CURRENT as of 19-Sep-1996. Updating your source tree
from those code bases and recompiling your kernel will get you the
new code.
Also available are patches relative to the FreeBSD 2.1.5 release.
These patches will be incorporated into an official FreeBSD security
advisory when complete, but for now, you can find them at:
ftp://freebsd.org/pub/CERT/patches/syn-flooding-prerelease/tcp-patches.215
-rw-r--r-- 1 pst security 10142 Sep 19 00:58 tcp-patches.215
MD5 (tcp-patches.215) = f6167c50b8d3302156fc0f9d609e89a7
DRAFT
DRAFT End of draft
DRAFT
-----BEGIN PGP SIGNATURE-----
Version: 2.6.2
iQCVAwUBMkD/mlUuHi5z0oilAQGAOwP/SHPTXoPb2uCc/Cx+BdDkoXVNTYbkJWOR
wdM6mnq/oZDUqZpyqZ1q2EZDIjhWgqecioPNg0uFuJHfyx15uQQbDepfW3l4luik
PXhdCR1G8vbAgQKHPVXhRi4dCkhTb7RQLSlZf6+sj7n4JyLSliztFzNxk1Goo5Fs
x5Mbx7aB7ig=
=oOo2
-----END PGP SIGNATURE-----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199609190810.BAA15858>
