Seems like the message got filtered on BUGTRAQ, I'd still
think at least some of the people on this list may have an
interest in parts of the data below.
Cheers.
---------- Forwarded message ----------
Date: Sat, 29 Jul 2000 06:11:54 +0300 (EET DST)
From: Ville <viha@cryptlink.net>
To: bugtraq@securityfocus.com
Subject: Linux traceroute (oddness & localhost memory-alloc)
Hi.
During a standard security-audit on a tad older Linux-system,
I stumbled upon some oddities in traceroute that had a nasty
feel into them.
When I researched further into it, I found no obvious way of
using the means to cause anything useful (audit-wise), but
figured I could still share the bits and pieces as they may
turn out to be of amusement or need to some.
This was way more than six months back, but I never got
around to sending mail about it. I reran the test on an RH 6
box and got the following results (reported to the correct
dev/security teams a week earlier):
1. Traceroute parses its output for any obvious over-
flow attempts.
$ traceroute `perl -e "print '1'x512"`
traceroute: Nice try !
It seems this has already been worked on once.
--- traceroute-1.4a5/traceroute.c.secfix Fri Jun 13 05:30:27 1997
+++ traceroute-1.4a5/traceroute.c Tue Dec 16 12:14:32 1997
+ <MAXHOSTNAMELEN>
+ Fprintf(stderr, "%s: Nice Try !\n", prog);
2. The input-validation for packet-size does not get
applied properly.
$ traceroute 127.0.0.1 `perl -e "print '1'x4096"`
Segmentation fault.
$ traceroute 127.0.0.1 `perl -e "print '1'x10"`
traceroute: malloc: Cannot allocate memory.
This is not likely to be as severe as it may seem
on first sight. Further analysis reveals that the
size-value is correctly checked for numeric-input
only (0-9) and thus any alphabetical input will
get rejected.
Not only the fact that ASCII-codes in the 048-057
(0x30 to 0x39) region map purely to functions
relating to XOR, AAA and CMP in x86-ASM, but also
the reality that the value is stored as a simple
integer makes a buffer-overflow (or its cousin)
quite far-fetched.
3. Traceroute permits a simple denial-of-service on
localhost as a normal user (the program is +s[uid]
root by default).
$ traceroute 127.0.0.1 360000000
^C^C^C
This seems to attempt allocating hundreds of mega-
bytes of memory because the code checking correct
packet-sizes has been misinserted into the wrong
section of the source-code.
Result: Localhost gets very unresponsive and may
need a reboot if a system watchdog fails to nail
the process.
4. It is possible to cause a puzzling message into
system logs with no obvious trace of the culprit.
$ traceroute 0.0.0.0
server0 kernel: a.b.c.d sent an invalid ICMP
error to a broadcast.
1 foo (a.b.c.d) 0.444 ms 0.203 ms 0.174 ms
This should probably be prevented at proper stage
or implemented differently, while it admittedly
is a very minor issue.
I sent a rough equivalent of the above blurp to all related
Linux parties and got one reply (from Debian), pointing out
at least #2 does not seem to apply to them, but that there
may still be an issue with the memory allocation even in the
version of traceroute they ship.
Simple patch by another co-worker attached to move the size-
checking into the correct location (based on 1.4a5).
Oh, I wonder if the program does yet check whether specified
-s[ource addresses] are mapped as local interfaces on the
box? I'm too tired to try a dump on the network-traffic now.
Apologies if any of this was already [widely] known.
Ta ta.
--
Ville <viha@cryptlink.net> Information-Security Consultation
Cryptlink Networking