From owner-announce-jp@jp.freebsd.org  Sat Nov 25 11:35:29 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id LAA28499;
	Sat, 25 Nov 2000 11:35:29 +0900 (JST)
	(envelope-from owner-announce-jp@jp.FreeBSD.org)
Message-Id: <200011242001.FAA04946@eos.ocn.ne.jp>
To: announce-jp@jp.freebsd.org
In-Reply-To: <20001120213645.7285337B4C5@hub.freebsd.org>
References: <20001120213645.7285337B4C5@hub.freebsd.org>
X-Mailer: Mew version 1.94.1 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Date: Sat, 25 Nov 2000 04:50:02 +0900
From: Hiroki Sato <hrs@eos.ocn.ne.jp>
X-Dispatcher: imput version 20000228(IM140)
X-ML-maintainer: owner-announce-jp@jp.FreeBSD.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: announce-jp 622
Subject: Re: ANNOUNCE: FreeBSD Security Advisory: FreeBSD-SA-00:69.telnetd [REVISED]
Errors-To: owner-announce-jp@jp.freebsd.org
Sender: owner-announce-jp@jp.freebsd.org


 $B$3$N%a!<%k$O(B, announce-jp $B$KN.$l$?(B

  Subject: ANNOUNCE: FreeBSD Security Advisory: FreeBSD-SA-00:69.telnetd [REVISED]
  From: FreeBSD Security Advisories <security-advisories@freebsd.org>
  Date: Mon, 20 Nov 2000 13:36:45 -0800 (PST)
  Message-Id: <20001120213645.7285337B4C5@hub.freebsd.org>
  X-Sequence: announce-jp 605

 $B$rF|K\8lLu$7$?$b$N$G$9(B. 

 $B$3$N4+9p$NCf$G>R2p$5$l$F$$$k(B WWW $B%5%$%H(B http://www.FreeBSD.org/ $B$*$h$S(B
 FTP $B%5%$%H(B ftp://ftp.FreeBSD.org/ $B$K$O(B, $BF|K\$N%_%i!<%5%$%H$,B8:_$7$^$9(B.
 $B%_%i!<%5%$%H$rMxMQ$9$k$K$O(B,
 http://www.FreeBSD.org/ $B$r(B http://www.jp.FreeBSD.org/www.freebsd.org/ $B$K(B,
 ftp://ftp.FreeBSD.org/ $B$r(B ftp://ftp.jp.FreeBSD.org/ $B$K(B,
 $B$=$l$>$lCV$-49$($F$/$@$5$$(B.

 $B%M%C%H%o!<%/$N:.;($r4KOB$9$k$?$a(B, $B$^$:$O%_%i!<%5%$%H$NMxMQ$r(B
 $B9MN8$9$k$h$&$*4j$$$7$^$9(B.  $B%_%i!<%5%$%H$K4X$9$k>\:Y$O(B

  http://www.FreeBSD.org/handbook/mirror.html ($B1QJ8(B)
  http://www.FreeBSD.org/ja/handbook/mirror.html ($BF|K\8lLu(B)

 $B$K(B, $B$^$?(B, $B2a5n$NF|K\8lHG%;%-%e%j%F%#4+9p$O(B

  http://www.FreeBSD.org/ja/security/

 $B$K$^$H$a$i$l$F$$$^$9(B.

 $B86J8$O(B PGP $B=pL>$5$l$F$$$^$9$,(B, $B$3$NF|K\8lLu$O(B PGP $B=pL>$5$l$F$$$^$;$s(B. 
 $B%Q%C%AEy$NFbMF$,2~cb$5$l$F$$$J$$$3$H$r3NG'$9$k$?$a$K(B PGP $B$N%A%'%C%/$r(B
 $B9T$J$&$K$O(B, $B86J8$r;2>H$7$F$/$@$5$$(B. 

 $BF|K\8lLu$O(B FreeBSD $BF|K\8l%I%-%e%a%s%F!<%7%g%s%W%m%8%'%/%H(B (doc-jp) $B$,;29M$N(B
 $B$?$a$KDs6!$9$k$b$N$G(B, doc-jp $B$O(B $B$=$NFbMF$K$D$$$F$$$+$J$kJ]>Z$b$$$?$7$^$;$s(B.
 $BF|K\8lLu$K$D$$$F$N$*Ld$$9g$o$;$O(B doc-jp@jp.FreeBSD.org $B$^$G$*4j$$$7$^$9(B.

--($B$3$3$+$i(B)

=============================================================================
FreeBSD-SA-00:69                                           Security Advisory
                                                                FreeBSD, Inc.

$B%H%T%C%/(B:       telnetd allows remote system resource consumption [REVISED]

$BJ,N`(B:           core
$B%b%8%e!<%k(B:     telnetd
$B9pCNF|(B:         2000-11-14
$B2~D{F|(B:         2000-11-20
$B%/%l%8%C%H(B:     Jouko Pynnonen <jouko@SOLUTIONS.FI>
$B1F6AHO0O(B:       FreeBSD 3.x ($B$9$Y$F$N%j%j!<%9(B),
                FreeBSD 4.x (4.2 $B0JA0$N$9$Y$F$N%j%j!<%9(B),
                $B=$@5F|0JA0$N(B FreeBSD 3.5.1-STABLE $B$*$h$S(B 4.1.1-STABLE
$B=$@5F|(B:         2000-11-19 (FreeBSD 4.1.1-STABLE)
                2000-11-19 (FreeBSD 3.5.1-STABLE)
FreeBSD $B$K8GM-$+(B:       NO

0.   $B2~D{MzNr(B

v1.0  2000-11-14  $B=iHG8x3+(B
v1.1  2000-11-20  $B=$@5%Q%C%A$N2~D{(B.
                  Christos Zoulas <christos@ZOULAS.COM> $B$N;XE&$K$h$k(B.


I.   $BGX7J(B - Background

telnetd $B$O(B telnet $B%j%b!<%H%m%0%$%s%W%m%H%3%k$N%5!<%P$G$9(B.


II.  $BLdBj$N>\:Y(B - Problem Description

telnet $B%W%m%H%3%k$O(B, $B%/%i%$%"%s%H$+$i%5!<%P>e$N%f!<%6%m%0%$%s%;%7%g%s$K(B
UNIX $B4D6-JQ?t$rEO$95!G=$r;}$C$F$$$^$9(B.  $B$7$+$7(B, $B$=$N4D6-JQ?t$NCf$K$O(B
$BFCJL$J0UL#$r;}$A(B, telnetd $B;R%W%m%;%9<+?H$NF0:n$K1F6A$rM?$($k$?$a$K(B
$B;H$o$l$k$b$N$,$"$j$^$9(B.

$BFC$KLdBj$H$J$k$N$O(B, $B%j%b!<%H%f!<%6$,(B TERMCAP $B4D6-JQ?t$rEO$7$F(B,
$B$=$N%7%9%F%`>e$NG$0U$N%U%!%$%k$r(B termcap $B%G!<%?$H$7$F8!:w$5$;$k(B
$B$3$H$,$G$-$k$H$$$&E@$G$9(B.  telnetd $B%5!<%P%W%m%0%i%`$O(B root $B8"8B$G(B
$BF0:n$9$k$?$a%m!<%+%k%7%9%F%`>e$NG$0U$N%U%!%$%k$rFI$`$3$H$,$G$-$^$9(B.
$B$=$7$F%U%!%$%k$NFbMF$KM-8z$J(B termcap $B%(%s%H%j$,B8:_$9$k>l9g(B,
$B$=$NFbMF$KBP1~$9$k(B termcap $B@)8fJ8;zNs$,%/%i%$%"%s%H$KAw$i$l$k(B
$B=PNO$N=q<0;XDj$KMxMQ$5$l$^$9(B.  $B$?$@$7(B, $B$b$7M-8z$J(B termcap $B%(%s%H%j$,(B
$B$=$N%U%!%$%k$KB8:_$7$J$1$l$P(B, $B%U%!%$%k$NFbMF$,%j%b!<%H%f!<%6$K(B
$BAw$i$l$k$3$H$O$"$j$^$;$s(B.  $B$=$N$?$a(B, $B$3$N%;%-%e%j%F%#>e$N(B
$B<eE@$K$h$C$F%G!<%?$,O31L$9$k4m81@-$O$J$$$H9M$($i$l$F$$$^$9(B.

$B$7$+$7967b<T$O(B, $B%5!<%P$KBP$7$FBg$-$$%U%!%$%k$r8!:w$5$;$?$j(B,
$B%G%P%$%9%U%!%$%k$NFI$_$@$7$r9T$J$o$;$k$3$H$G(B, $B%5!<%P$N(B CPU $B;~4V$d(B
$B%G%#%9%/FI$_$@$7BS0hI}$J$I$N%5!<%P$N;q8;$rL5BL$K>CHq$5$;$k$3$H$,$G$-$^$9(B.
$B$3$l$O%5!<%P$NIi2Y$rA}2C$5$;(B, $BK\Mh$N@5Ev$J%f!<%6$NMW5a$X$N%5!<%S%9$r(B
$BK832$G$-$k$H$$$&$3$H$r0UL#$7$^$9(B.  $B$3$N%;%-%e%j%F%#>e$N<eE@$O(B
login(1) $B%f!<%F%#%j%F%#$,8F$S=P$5$l$kA0$KH/@8$9$k$?$a(B, $B0-MQ$9$k$N$K(B
$B%5!<%P>e$GM-8z$J%"%+%&%s%HG'>Z$rI,MW$H$7$^$;$s(B.

FreeBSD 4.0, 4.1, 4.1.1 $B$*$h$S(B 3.5.1 $B$r4^$`(B, $B=$@5F|0JA0$N$9$Y$F$N(B
FreeBSD $B%j%j!<%9$,$3$NLdBj$N1F6A$r<u$1$^$9(B.
$BLdBjE@$N=$@5$O(B FreeBSD 4.2-RELEASE $B$N8x3+A0$N(B 4.1.1-STABLE $B%V%i%s%A$G(B
$B9T$J$o$l$^$7$?(B.


III. $B1F6AHO0O(B - Impact

$B%j%b!<%H%f!<%6$O(B, $B%5!<%P>e$KM-8z$J%m%0%$%s%"%+%&%s%H$,$J$/$H$b(B,
$B%5!<%P>e$N(B CPU $B$d%G%#%9%/FI$_$@$7BS0hI}$J$I$N;q8;$r>CHq$5$;$k$3$H$,(B
$B2DG=$G$9(B.  $B$3$l$O%5!<%P$NIi2Y$rA}2C$5$;$k$@$1$G$J$/(B, $BK\Mh$N@5Ev$J(B
$B%f!<%6$KBP$9$k%5!<%S%9$rK832$G$-$k2DG=@-$,$"$j$^$9(B.

IV.  $B2sHrJ}K!(B - Workaround

1) telnet $B%5!<%S%9$rDd;_$5$;$^$9(B.  $B$3$N%5!<%S%9$ODL>o(B, inetd $B$K(B
   $B$h$C$F5/F0$5$l$^$9(B.  /etc/inetd.conf $B$K0J2<$N9T$,B8:_$9$k>l9g$O(B,
   $B$=$l$i$r%3%a%s%H%"%&%H$7$F$/$@$5$$(B.

telnet  stream  tcp     nowait  root    /usr/libexec/telnetd    telnetd

telnet  stream  tcp6    nowait  root    /usr/libexec/telnetd    telnetd

2) TCP wrappers (/etc/hosts.allow) $B$+(B, ipfw(8) $B$d(B ipf(8) $B$H$$$C$?(B,
   $B%M%C%H%o!<%/%l%Y%k$N%Q%1%C%H%U%#%k%?$r(B, $B%U%!%$%"%&%)!<%k(B, $B$b$7$/$O(B
   $B%m!<%+%k%^%7%s$GMQ$$$F%"%/%;%9@)8B$rL@<(E*$K9T$J$$(B, telnet $B%5!<%S%9$r(B
   $B?.Mj$G$-$k%^%7%s$N$_$K@)8B$7$^$9(B.


V.   $B2r7h:v(B - Solution

$B<!$N$$$:$l$+$K=>$C$F$/$@$5$$(B.

1) $B<eE@$r;}$C$?(B FreeBSD $B%7%9%F%`$r(B, $B=$@5F|0J9_$N(B
   4.1.1-STABLE $B$b$7$/$O(B 3.5.1-STABLE $B$K%"%C%W%0%l!<%I$7$^$9(B.
   $B=iHG$N4+9p$GG[I[$5$l$F$$$?=$@5%Q%C%A$OIT40A4$G(B, $BFCDj$N>u672<$G(B
   telnetd $B$,F0:nITNI$r0z$-5/$3$7$^$9(B.  $B$4Cm0U$/$@$5$$(B.

2) $B2<$N=$@5%Q%C%A$rE,MQ$7(B, $B4XO"%U%!%$%k$r:F9=C[$7$^$9(B.

$B$3$N4+9p$r%U%!%$%k$KJ]B8$9$k$+(B, $B=$@5%Q%C%A$H(B PGP $B=pL>$r0J2<$N>l=j$+$i(B
$B%@%&%s%m!<%I$7(B, PGP $B%f!<%F%#%j%F%#$r;H$C$F=pL>$r3NG'$7$^$9(B.

ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-00:69/telnetd.patch.v1.1
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-00:69/telnetd.patch.v1.1.asc

$B$=$7$F(B root $B8"8B$G<!$N%3%^%s%I$r<B9T$7$^$9(B.

# cd /usr/src/libexec/telnetd
# patch -p < /path/to/patch_or_advisory
# make depend && make all install

$B<eE@$r;}$C$?%7%9%F%`MQ$N=$@5%Q%C%A(B($B2~D{HG(B):

    Index: ext.h
    ===================================================================
    RCS file: /home/ncvs/src/libexec/telnetd/ext.h,v
    retrieving revision 1.7
    retrieving revision 1.8
    diff -u -r1.7 -r1.8
    --- ext.h   1999/08/28 00:10:22     1.7
    +++ ext.h   2000/11/19 10:01:27     1.8
    @@ -87,7 +87,7 @@
     #endif
     
     extern int pty, net;
    -extern char        *line;
    +extern char        line[16];
     extern int SYNCHing;               /* we are in TELNET SYNCH mode */
     
     #ifndef    P
    Index: sys_term.c
    ===================================================================
    RCS file: /home/ncvs/src/libexec/telnetd/sys_term.c,v
    retrieving revision 1.24
    retrieving revision 1.26
    diff -u -r1.24 -r1.26
    --- sys_term.c      1999/08/28 00:10:24     1.24
    +++ sys_term.c      2000/11/19 10:01:27     1.26
    @@ -480,14 +480,10 @@
      *
      * Returns the file descriptor of the opened pty.
      */
    -#ifndef    __GNUC__
    -char *line = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
    -#else
    -static char Xline[] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
    -char *line = Xline;
    -#endif
     #ifdef     CRAY
    -char *myline = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
    +char myline[16];
    +#else
    +char line[16];
     #endif     /* CRAY */
     
        int
    @@ -1799,6 +1795,13 @@
                    strncmp(*cpp, "_RLD_", 5) &&
                    strncmp(*cpp, "LIBPATH=", 8) &&
     #endif
    +               strncmp(*cpp, "LOCALDOMAIN=", 12) &&
    +               strncmp(*cpp, "RES_OPTIONS=", 12) &&
    +               strncmp(*cpp, "TERMINFO=", 9) &&
    +               strncmp(*cpp, "TERMINFO_DIRS=", 14) &&
    +               strncmp(*cpp, "TERMPATH=", 9) &&
    +               strncmp(*cpp, "TERMCAP=/", 9) &&
    +               strncmp(*cpp, "ENV=", 4) &&
                    strncmp(*cpp, "IFS=", 4))
                        *cpp2++ = *cpp;
        }
    Index: telnetd.c
    ===================================================================
    RCS file: /home/ncvs/src/libexec/telnetd/telnetd.c,v
    retrieving revision 1.22
    retrieving revision 1.24
    diff -u -r1.22 -r1.24
    --- telnetd.c       2000/01/25 14:52:00     1.22
    +++ telnetd.c       2000/11/19 10:01:27     1.24
    @@ -805,13 +805,12 @@
     #else
        for (;;) {
                char *lp;
    -           extern char *line, *getpty();
     
                if ((lp = getpty()) == NULL)
                        fatal(net, "Out of ptys");
     
                if ((pty = open(lp, 2)) >= 0) {
    -                   strcpy(line,lp);
    +                   strlcpy(line,lp,sizeof(line));
                        line[5] = 't';
                        break;
                }
    @@ -1115,7 +1114,7 @@
                IM = Getstr("im", &cp);
                IF = Getstr("if", &cp);
                if (HN && *HN)
    -                   (void) strcpy(host_name, HN);
    +                   (void) strlcpy(host_name, HN, sizeof(host_name));
                if (IF && (if_fd = open(IF, O_RDONLY, 000)) != -1)
                        IM = 0;
                if (IM == 0)
    Index: utility.c
    ===================================================================
    RCS file: /home/ncvs/src/libexec/telnetd/utility.c,v
    retrieving revision 1.13
    retrieving revision 1.14
    diff -u -r1.13 -r1.14
    --- utility.c       1999/08/28 00:10:25     1.13
    +++ utility.c       2000/10/31 05:29:54     1.14
    @@ -330,7 +330,7 @@
     {
        char buf[BUFSIZ];
     
    -   (void) sprintf(buf, "telnetd: %s.\r\n", msg);
    +   (void) snprintf(buf, sizeof(buf), "telnetd: %s.\r\n", msg);
        (void) write(f, buf, (int)strlen(buf));
        sleep(1);       /*XXX*/
        exit(1);
    @@ -343,7 +343,7 @@
     {
        char buf[BUFSIZ], *strerror();
     
    -   (void) sprintf(buf, "%s: %s", msg, strerror(errno));
    +   (void) snprintf(buf, sizeof(buf), "%s: %s", msg, strerror(errno));
        fatal(f, buf);
     }

