[VulnDiscuss] Re: Algorithmic Complexity Attacks and the Linux Networking Code

Andreas Gietl <[email protected]>
Newsgroups gmane.comp.security.vulnerabilities.watch.general
Organization e-admin internet gmbh
Message-ID <[email protected]>
On Saturday 17 May 2003 23:12, Florian Weimer wrote:

looks like there is another patch for that problem inlcuded in

linux-2.4.21-rc2

from the changelog:

  o [NET]: Fix hashing exploits in ipv4 routing, IP conntrack, and TCP synq

But it looks like this patch is not the same as the one from redhat.

>          Algorithmic Complexity Attacks and the Linux Networking Code
>
>    The Linux networking code makes extensive use of hash tables to
>    implement caches to support packet classification.  One of these
>    caches, the routing cache, can be used to mount effective denial of
>    service attacks, using an algorithmic complexity attack.
>
> The Linux Routing Cache
>
>    The routing cache (or "dst cache") caches routing decisions for a
>    traffic flow.  A traffic flow consists of packets which have the
>    same IPv4 source and destination address and the same TOS value in
>    the IP header.  These flows are unidirectional; for a two-way
>    communication, two flows exist, one in each direction.  Even if the
>    cache is also called "dst cache" for historical reasons, the cache
>    covers more than just destination addresses.
>
>    When a packet arrives, the kernel must route it.  The IP routing
>    code checks for a suitable traffic flow and reuses the cached
>    routing decisions, if possible.  Otherwise, it makes a new routing
>    decision and creates a new traffic flow, by updating the routing
>    cache accordingly.  This routing occurs on single-homed host with
>    disabled IP forwarding as well as on full-table routers.
>
>    The routing cache is implemented as a hash table, in a rather
>    particular way.  The bucket count is an integral power of two which
>    is fixed on system boot and scaled according to the amount of
>    physical RAM.  The hash function is GF(2)-linear (which means that
>    it is easy to find collisions).  Collision chaining is used to
>    store different entries which hash to the same bucket.  A garbage
>    collection mechanism ensures that the size of the cache stays below
>    the configured maximum entry count.  This entry count is scaled
>    with available system memory, too.
>
>    Note that there are additional hash tables in the networking code.
>    For example, IP connection tracking adds an additional hash table
>    (which uses a different, but still rather weak hash table).
>
> The Attack
>
>    Our attack is targeted at a host and uses packets with carefully
>    chosen source addresses and TOS values to trigger collisions in the
>    lower bits of the routing cache hash function.  (Note that these
>    collisions have nothing to do with colliding packets on the wire.)
>    As a result, all these packets create distinct flows which are
>    stored in a linear list hooked to a single bucket to a hash table.
>    In essence, this reduces the hash table to a linear list, and
>    finding entries becomes extremely expensive when the list is very
>    long.  (This effect is detailed in the paper cited below.)
>
>    The effectiveness of the attack depends significantly on the
>    maximum size of routing cache.  As described above, the default
>    maximum size depends on the amount of physical RAM present in the
>    machine.  Therefore, machines with more RAM are more vulnerable if
>    they operate in the default configuration.  For example, we were
>    able to freeze a machine with four gigabytes of RAM with a stream
>    of about 400 packets per second.  (The same machine remained
>    unaffected when we used random source addresses instead of source
>    addresses that lead to collisions in the hash function.)
>
>    Of course, the hash function is extremely simple, but this is not
>    source of the problem.  Even though it is possible to find
>    collisions by solving a rather small system of linear equations
>    over the field of two elements, the main problem results from the
>    fact that the attacker can determine the hash bucket for traffic
>    flows (and send packets based on that information).
>
> Countermeasures
>
>    Red Hat published a security advisory which includes a patch (see
>    below) which changes the hash function to a non-linear, keyed hash
>    function.  While the the hash function is not cryptographically
>    strong, it is certainly much more complicated (if not even
>    impossible) for an attacker to trigger collisions.  (As an
>    additional protection, the key is changed every ten minutes.) In
>    our experience, the patch, applied to stock Linux 2.4.20, works
>    reasonably well in typical denial of service situations.
>
>    If you cannot apply the patch and are confronted with an attack of
>    this type, there are two options to protect machines: setting rate
>    limits using iptables, or decreasing the routing cache size.
>    Choosing suitable rate limits is very complicated, so it is not
>    recommended.  You can decrease the routing cache size using the
>    /proc interface. (If the total size of the cache is reduced, the
>    maximum length of a collision chain is reduced, too, and this
>    particular attack is no longer possible.) As root, run the
>    following commands:
>
> # echo 4096 > /proc/sys/net/ipv4/route/max_size
> # echo 2048 > /proc/sys/net/ipv4/route/gc_thresh
> #
>
>    (On most systems, you can edit /etc/sysctl.conf to make these
>    changes permanent.)
>
>    However, note that this approach of decreasing the cache size has a
>    severe impact on routing performance if the number of parallel
>    flows processed by the machine exceeds the maximum routing cache
>    size.
>
> Frequently Asked Questions
>
>      * How significant is this problem?
>
>        The Linux IP stack is not very robust against various types of
>        denial of service attacks.  As a result, this problem is
>        unlikely to have any practical consequences.  We recommend to
>        apply the patch to fix this problem during routine maintenance
>        and not to change the maximum routing cache size preventively
>        because of the potential performance impact.
>
>      * Are other vendors affected by the problem?
>
>        At this time, we do not believe that Cisco IOS routers or
>        machines running Solaris or one of the BSD variants are
>        affected.  However, only source code inspection can reveal if a
>        product is affected, and vendors are encouraged to verify that
>        their products are unaffected.  Flow-based routing using hash
>        tables is particularly prone to this vulnerability, and
>        implementations of this principle should therefore be
>        scrutinized.
>
>      * Is exploit code available publicly?
>
>        To our knowledge, this kind of attack is currently (May 2003)
>        not in the wild, and no widely available attack tools support
>        it.
>
>      * Does this attack affect only affects routers?
>
>        No, it is also relevant for hosts.  The routing cache includes
>        both source and destination addresses, and it is possible to
>        spoof source addresses accordingly.  However, routers are at
>        somewhat greater risk because to attack them, you can choose
>        the destination addresses in a way that trigger collisions
>        which does not require root privileges (or special IP packet
>        generation code) on the attacking host.
>
>      * I've read that it is impossible to spoof source addresses on the
>        current Internet, thanks to ingress filtering, so this attack is
>        not a problem, right?
>
>        While proper ingress (and egress) filtering is a standard
>        practice to reduce source address spoofing, it isn't
>        universally applied throughout the Internet.  A lot of denial
>        of service attacks still use spoofed source addresses and
>        arrive at the intended victim.
>
>      * Is it possible to use rate limits to counter the attack?
>
>        It is possible, but not recommended.  To protect machines which
>        large amounts of memory in default configurations, ridiculously
>        low rate limits would be required which would enable denial of
>        service attacks on their own.  Note that all rate limits which
>        protect the routing cache have to be applied in the PREROUTING
>        chain, as the standard INPUT chain is processed after a packet
>        has already updated the routing cache.
>
>      * Netfilter connection tracking uses a huge hash table as well.
>        Is it affected?
>
>        Yes, we believe that it is affected by the essentially same
>        problem.  The Red Hat patch corrects Netfilter connection
>        tracking, too.
>
>      * Will the Red Hat patch fix other performance issues with the
>        routing cache?
>
>        Unfortunately, the answer is no.  We now have multiple reports
>        that Linux routers break down according to the inefficiency of
>        the routing cache under stress, at incredible low packet rates.
>        These problems continue to exist and are likely to persist
>        until the kernel developers eliminate the routing cache.
>
>      * Why took it so long before this bug was fixed?
>
>        Kernel developers were contacted at the beginning of April,
>        when the issue was independently discovered in the Linux
>        kernel, not in February, when the first technical report was
>        written by Scott Crosby and Dan Wallach.
>
> References
>
>      * Scott A. Crosby, Dan S. Wallach, Denial of Service via
>        Algorithmic Complexity Attacks
>       
> <http://www.cs.rice.edu/~scrosby/hash/CrosbyWallach_UsenixSec2003/index.htm
>l>
>
>      * Red Hat, Updated 2.4 kernel fixes security vulnerabilities and
>        various bugs
>        <https://rhn.redhat.com/errata/RHSA-2003-172.html>
>
>      * The patch for Linux 2.4.20 that has been published by Red Hat
>        <http://www.enyo.de/fw/security/notes/linux-2.4.20-nethashfix.patch>
>
>      * Most current version of this document
>        <http://www.enyo.de/fw/security/notes/linux-dst-cache-dos.html>

-- 
e-admin internet gmbh
Andreas Gietl                                            tel +49 941 3810884
Ludwig-Thoma-Strasse 35                      fax +49 89 244329104
93051 Regensburg                                  mobil +49 171 6070008

PGP/GPG-Key unter http://www.e-admin.de/gpg.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.