Date: Wed, 17 Feb 1999 13:03:45 -0800
From: Steven Hodges <nsn@RAW.VELOWEB.COM>
To: BUGTRAQ@netspace.org
Subject: Tetrix 1.13.16 is Vulnerable

   I have recently found a buffer overflow in a TetriNet daemon for Linux
called "Tetrix". To exploit this bug, you will need a hostname longer than
122 characters, and any method of connecting to the host on port 31457.
Once you are connected, the overflow should take place.

here is the patch!


----------------------------------snip snip-------------------------------
diff -ru tetrinetx-1.13.16.orig/src/main.c tetrinetx-1.13.16/src/main.c
--- tetrinetx-1.13.16.orig/src/main.c   Thu Dec 24 00:24:50 1998
+++ tetrinetx-1.13.16/src/main.c        Sun Feb 14 16:22:45 1999
@@ -2561,7 +2562,7 @@
 /* Someone has just connected. So lets answer them */
 void net_telnet(struct net_t *n, char *buf)
   {
-    unsigned long ip; int k,l; char s[121]; char strg[121];
+    unsigned long ip; int k,l; char s[UHOSTLEN]; char strg[121];
     char n1[4], n2[4], n3[4], n4[4];
     struct channel_t *chan, *ochan;
     struct net_t *net;
diff -ru tetrinetx-1.13.16.orig/src/main.h tetrinetx-1.13.16/src/main.h
--- tetrinetx-1.13.16.orig/src/main.h   Thu Dec 24 00:24:50 1998
+++ tetrinetx-1.13.16/src/main.h        Sun Feb 14 16:19:06 1999
@@ -48,9 +48,8 @@
 #define SERVERBUILD "16"               /* What build we are at */
 #define NICKLEN 30                     /* Maximum length of Nickname */
 #define VERLEN 10                      /* Maximum length of Tetrinet version */
-#define UHOSTLEN 30                    /* Maximum length of Hostname */
+#define UHOSTLEN 256                   /* Maximum length of Hostname */
 #define TEAMLEN NICKLEN                        /* Maximum length of teamname */
-/*#define MAXNET 80*/                  /* Maximum network sockets */
 #define MAXWINLIST 100                 /* Maximum entries on Winlist */
 #define TELNET_PORT 31457              /* Telnet port to listen on */
 #define QUERY_PORT 31456               /* Query port to listen on */
diff -ru tetrinetx-1.13.16.orig/src/net.c tetrinetx-1.13.16/src/net.c
--- tetrinetx-1.13.16.orig/src/net.c    Thu Dec 24 00:24:50 1998
+++ tetrinetx-1.13.16/src/net.c Sun Feb 14 16:22:11 1999
@@ -250,15 +250,17 @@
 unsigned long ip;
 {
   struct hostent *hp; unsigned long addr=ip;
-  unsigned char *p; static char s[121];
-/*  alarm(10);*/
+  unsigned char *p; static char s[UHOSTLEN];
+
   hp=gethostbyaddr((char *)&addr,sizeof(addr),AF_INET); /*alarm(0);*/
   if (hp==NULL) {
     p=(unsigned char *)&addr;
     sprintf(s,"%u.%u.%u.%u",p[0],p[1],p[2],p[3]);
     return s;
   }
-  strcpy(s,hp->h_name); return s;
+  strncpy(s,hp->h_name,(UHOSTLEN-1));
+  s[strlen(s)]='\0';
+  return s;
 }

 /* short routine to answer a connect received on a socket made previously
----------------------------------snip snip-------------------------------

