Tcpdump Off-by-One Heap Overflow Lets Remote Users Deny Service
SecurityTracker Alert ID: 1017717|
SecurityTracker URL: http://securitytracker.com/id/1017717
(Links to External Site)
Updated: Mar 7 2007|
Original Entry Date: Mar 2 2007
Denial of service via network|
Fix Available: Yes Vendor Confirmed: Yes |
A vulnerability was reported in tcpdump. A remote user can cause denial of service conditions.|
A remote user can send a specially crafted 802.11 frame to trigger an off-by-one heap overflow in the function parse_elements() function in 'print-802_11.c' and cause the process to crash.
Moritz Jodeit reported this vulnerability.
[Editor's note: The report did not indicate whether code execution is possible or not. Also, CVE indicates that the overflow may be stack-based.]
A remote user can cause denial of service conditions.|
The vendor has issued a fix, available via CVS:|
The tcpdump_3_9 branch also contains the fix.
Vendor URL: www.tcpdump.org/ (Links to External Site)
|Underlying OS: Linux (Any), UNIX (Any)|
This archive entry has one or more follow-up message(s) listed below.|
Source Message Contents
Date: Thu, 1 Mar 2007 13:59:23 +0100|
Subject: [Full-disclosure] tcpdump: off-by-one heap overflow in 802.11
There's an off-by-one heap-overflow in the ieee802.11 printer,
which can be triggered by a maliciously crafted 802.11 frame.
The link type must have been explicitly specified for this to
The function parse_elements() in print-802_11.c checks the
length pbody->tim.length from the frame for too small values in
line 265, but then uses the wrong variable in the following
range check in line 267. Since pbody->tim.length is defined as
a u_int8_t it can hold a maximum value of 255, which in turn
would copy 252 bytes into pbody->tim.bitmap, which is only
251 bytes of size.
253 case E_TIM:
254 /* Present, possibly truncated */
255 pbody->tim_status = TRUNCATED;
256 if (!TTEST2(*(p + offset), 2))
258 memcpy(&pbody->tim, p + offset, 2);
259 offset += 2;
260 if (!TTEST2(*(p + offset), 3))
262 memcpy(&pbody->tim.count, p + offset, 3);
263 offset += 3;
265 if (pbody->tim.length <= 3)
267 if (pbody->rates.length > sizeof pbody->tim.bitmap)
269 if (!TTEST2(*(p + offset), pbody->tim.length - 3))
271 memcpy(pbody->tim.bitmap, p + (pbody->tim.length - 3),
272 (pbody->tim.length - 3))
The current tcpdump release 3.9.5 is still vulnerable.
This got fixed  in CVS Head and in the tcpdump_3_9 branch.
Full-Disclosure - We believe in it.
Hosted and sponsored by Secunia - http://secunia.com/