Brought to you by:
Suppliers of:
THTTPd (Trivial HTTP) is a simple, small, portable, fast, and supposedly secure (although otherwise was discovered) web server. This product has been discovered to contain an exploitable remote buffer overflow, which allows remote attackers to crash the HTTP server and possibly execute arbitrary code.
Credit:
The vulnerability information has been discovered by: D. J. Bernstein .
Vulnerable systems:
THTTPd 2.04 and prior (as back as version 1.90a)
Immune systems:
THTTPd 2.05 and above.
The THTTPd 2.04 code contains serious security vulnerability in the way it handles parsed HTTP If-Modified-Since fields. The parser only scans %[a-zA-Z] into a fixed-size stack buffer (without checking the size of the provided buffer).
When THTTPd is fed an If-Modified-Since line with 1300 x's, it core dumps. This is something that any attacker on the Internet could do to any THTTPd server, taking down web service until THTTPd is restarted.
A patch is provided below:
*** tdate_parse.c 1999/09/15 16:09:36 1.1
--- tdate_parse.c 1999/11/10 01:16:39
***************
*** 211,217 ****
*/
/* DD-mth-YY HH:MM:SS GMT */
! if ( sscanf( cp, "%d-%[a-zA-Z]-%d %d:%d:%d GMT",
&tm_mday, str_mon, &tm_year, &tm_hour, &tm_min,
&tm_sec ) == 6 &&
scan_mon( str_mon, &tm_mon ) )
--- 211,217 ----
*/
/* DD-mth-YY HH:MM:SS GMT */
! if ( sscanf( cp, "%d-%400[a-zA-Z]-%d %d:%d:%d GMT",
&tm_mday, str_mon, &tm_year, &tm_hour, &tm_min,
&tm_sec ) == 6 &&
scan_mon( str_mon, &tm_mon ) )
***************
*** 225,231 ****
}
/* DD mth YY HH:MM:SS GMT */
! else if ( sscanf( cp, "%d %[a-zA-Z] %d %d:%d:%d GMT",
&tm_mday, str_mon, &tm_year, &tm_hour, &tm_min,
&tm_sec) == 6 &&
scan_mon( str_mon, &tm_mon ) )
--- 225,231 ----
}
/* DD mth YY HH:MM:SS GMT */
! else if ( sscanf( cp, "%d %400[a-zA-Z] %d %d:%d:%d GMT",
&tm_mday, str_mon, &tm_year, &tm_hour, &tm_min,
&tm_sec) == 6 &&
scan_mon( str_mon, &tm_mon ) )
***************
*** 239,245 ****
}
/* HH:MM:SS GMT DD-mth-YY */
! else if ( sscanf( cp, "%d:%d:%d GMT %d-%[a-zA-Z]-%d",
&tm_hour, &tm_min, &tm_sec, &tm_mday, str_mon,
&tm_year ) == 6 &&
scan_mon( str_mon, &tm_mon ) )
--- 239,245 ----
}
/* HH:MM:SS GMT DD-mth-YY */
! else if ( sscanf( cp, "%d:%d:%d GMT %d-%400[a-zA-Z]-%d",
&tm_hour, &tm_min, &tm_sec, &tm_mday, str_mon,
&tm_year ) == 6 &&
scan_mon( str_mon, &tm_mon ) )
***************
*** 253,259 ****
}
/* HH:MM:SS GMT DD mth YY */
! else if ( sscanf( cp, "%d:%d:%d GMT %d %[a-zA-Z] %d",
&tm_hour, &tm_min, &tm_sec, &tm_mday, str_mon,
&tm_year ) == 6 &&
scan_mon( str_mon, &tm_mon ) )
--- 253,259 ----
}
/* HH:MM:SS GMT DD mth YY */
! else if ( sscanf( cp, "%d:%d:%d GMT %d %400[a-zA-Z] %d",
&tm_hour, &tm_min, &tm_sec, &tm_mday, str_mon,
&tm_year ) == 6 &&
scan_mon( str_mon, &tm_mon ) )
***************
*** 267,273 ****
}
/* wdy, DD-mth-YY HH:MM:SS GMT */
! else if ( sscanf( cp, "%[a-zA-Z], %d-%[a-zA-Z]-%d %d:%d:%d GMT",
str_wday, &tm_mday, str_mon, &tm_year, &tm_hour, &tm_min,
&tm_sec ) == 7 &&
scan_wday( str_wday, &tm_wday ) &&
--- 267,273 ----
}
/* wdy, DD-mth-YY HH:MM:SS GMT */
! else if ( sscanf( cp, "%400[a-zA-Z], %d-%400[a-zA-Z]-%d %d:%d:%d
GMT",
str_wday, &tm_mday, str_mon, &tm_year, &tm_hour, &tm_min,
&tm_sec ) == 7 &&
scan_wday( str_wday, &tm_wday ) &&
***************
*** 283,289 ****
}
/* wdy, DD mth YY HH:MM:SS GMT */
! else if ( sscanf( cp, "%[a-zA-Z], %d %[a-zA-Z] %d %d:%d:%d GMT",
str_wday, &tm_mday, str_mon, &tm_year, &tm_hour, &tm_min,
&tm_sec ) == 7 &&
scan_wday( str_wday, &tm_wday ) &&
--- 283,289 ----
}
/* wdy, DD mth YY HH:MM:SS GMT */
! else if ( sscanf( cp, "%400[a-zA-Z], %d %400[a-zA-Z] %d %d:%d:%d
GMT",
str_wday, &tm_mday, str_mon, &tm_year, &tm_hour, &tm_min,
&tm_sec ) == 7 &&
scan_wday( str_wday, &tm_wday ) &&
***************
*** 299,305 ****
}
/* wdy mth DD HH:MM:SS GMT YY */
! else if ( sscanf( cp, "%[a-zA-Z] %[a-zA-Z] %d %d:%d:%d GMT %d",
str_wday, str_mon, &tm_mday, &tm_hour, &tm_min, &tm_sec,
&tm_year ) == 7 &&
scan_wday( str_wday, &tm_wday ) &&
--- 299,305 ----
}
/* wdy mth DD HH:MM:SS GMT YY */
! else if ( sscanf( cp, "%400[a-zA-Z] %400[a-zA-Z] %d %d:%d:%d GMT %d",
str_wday, str_mon, &tm_mday, &tm_hour, &tm_min, &tm_sec,
&tm_year ) == 7 &&
scan_wday( str_wday, &tm_wday ) &&
A (2.05) complete version can be downloaded from:
http://www.acme.com/software/thttpd/thttpd-2.05.tar.gz
Fix information
SuSE has already released a fixed package of thttpd:
SuSE 6.2
ftp://ftp.suse.com/pub/suse/i386/update/6.2/n1/thttpd-2.04-31.i386.rpm
SuSE 6.3
ftp://ftp.suse.com/pub/suse/i386/update/6.3/n1/thttpd-2.04-31.i386.rpm
Please enable JavaScript to view the comments powered by Disqus.
blog comments powered by