Package: dsniff
Version: 2.4b1+debian-22
Severity: grave
Tags: security
The fix for #609988 was not implemented correctly:
,----[ decode_tds.c ]
| int
| decode_tds(u_char *buf, int len, u_char *obuf, int olen)
| {
| struct tds_hdr *th;
| struct tds_login *tl;
| struct tds7_login *t7l, *myt7l;
| u_char *user, *pass, *serv;
| u_short userlen, passlen, servlen;
|
| obuf[0] = '\0';
|
| if (th->size != 8) {
| /* wrong header length */
| return (strlen(obuf));
| }
|
| for (th = (struct tds_hdr *)buf;
| len > sizeof(*th) && len >= ntohs(th->size);
| buf += ntohs(th->size), len -= ntohs(th->size)) {
|
| if (th->type == 2) {
| /* Version 4.x, 5.0 */
`----
th is not initialized outside the "for" loop, so uninitialized or
unmapped memory is accessed. This leads to segmentation faults which
makes the program unusable.
This is in part my fault: I only provided a description where put the
four lines, instead of a real patch. Since I was already using a locally
patched dsniff package, I never verified if the problem has been
properly fixed.
This time, I have attached a real patch.
Cheers,
-Hilko
-- System Information:
Debian Release: 7.0
APT prefers unstable
APT policy: (500, 'unstable')
Architecture: i386 (i686)
Kernel: Linux 3.2.0-4-686-pae (SMP w/2 CPU cores)
Locale: LANG=C, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages dsniff depends on:
ii libc6 2.13-38
ii libdb5.1 5.1.29-5
ii libice6 2:1.0.8-2
ii libnet1 1.1.4-2.1
ii libnids1.21 1.23-2
ii libpcap0.8 1.3.0-1
ii libsm6 2:1.2.1-2
ii libssl1.0.0 1.0.1e-2
ii libx11-6 2:1.5.0-1
ii libxmu6 2:1.1.1-1
ii openssl 1.0.1e-2
dsniff recommends no packages.
dsniff suggests no packages.
-- no debconf information
--- decode_tds.c.orig 2013-06-18 10:35:34.000000000 +0200
+++ decode_tds.c 2013-06-18 10:37:41.000000000 +0200
@@ -140,15 +140,15 @@
obuf[0] = '\0';
- if (th->size != 8) {
- /* wrong header length */
- return (strlen(obuf));
- }
-
for (th = (struct tds_hdr *)buf;
len > sizeof(*th) && len >= ntohs(th->size);
buf += ntohs(th->size), len -= ntohs(th->size)) {
+ if (th->size != 8) {
+ /* wrong header length */
+ break;
+ }
+
if (th->type == 2) {
/* Version 4.x, 5.0 */
if (len < sizeof(*th) + sizeof(*tl))