From owner-announce-jp@jp.freebsd.org  Sat Nov 25 11:34:58 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id LAA28412;
	Sat, 25 Nov 2000 11:34:58 +0900 (JST)
	(envelope-from owner-announce-jp@jp.FreeBSD.org)
Message-Id: <200011242001.FAA04971@eos.ocn.ne.jp>
To: announce-jp@jp.freebsd.org
In-Reply-To: <20001120213916.D628E37B4D7@hub.freebsd.org>
References: <20001120213916.D628E37B4D7@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:49:49 +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 621
Subject: Re: ANNOUNCE: FreeBSD Security Advisory: FreeBSD-SA-00:68.ncurses [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:68.ncurses [REVISED]
  From: FreeBSD Security Advisories <security-advisories@freebsd.org>
  Date: Mon, 20 Nov 2000 13:39:16 -0800 (PST)
  Message-Id: <20001120213916.D628E37B4D7@hub.freebsd.org>
  X-Sequence: announce-jp 604

 $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:68                                            Security Advisory
                                                                FreeBSD, Inc.

$B%H%T%C%/(B:       ncurses allows local privilege escalation  [REVISED]

$BJ,N`(B:           core, ports
$B%b%8%e!<%k(B:     ncurses
$B9pCNF|(B:         2000-11-13
$B2~D{F|(B:         2000-11-20
$B1F6AHO0O(B:       $B=$@5F|0JA0$N(B FreeBSD 5.0-CURRENT, FreeBSD 4.x
                FreeBSD 3.x $B$O$^$@L$=$@5(B
$B=$@5F|(B:         2000-10-11 (FreeBSD 4.1.1-STABLE)
                2000-11-10 (ncurses port)
$B%/%l%8%C%H(B:     Jouko Pynnonen <jouko@SOLUTIONS.FI>
FreeBSD $B$K8GM-$+(B:       NO

0.   $B2~D{MzNr(B - Revision History

v1.0  2000-11-13  $B=iHG8x3+(B
v1.1  2000-11-20  Corrected status of 3.x, referenced ncurses port
                  FreeBSD 3.x $B$K4X$9$k>pJs$N=$@5$H(B ncurses port $B$NDI2C(B

I.   $BGX7J(B - Background

ncurses $B$O%F%-%9%H%b!<%II=<(MQ$N%i%$%V%i%j$G(B, $B$5$^$6$^$J<oN`$NC<Kv$K(B
$BE,9g$9$k$h$&(B, $B%"%W%j%1!<%7%g%s$N=PNO$r%U%)!<%^%C%H$9$k$N$K;H$o$l$F$$$^$9(B.
$B$3$l$OFbIt$GJ]<i$5$l$F$$$k$b$N$G$O$J$/(B, $B30It$+$i4sB#$5$l(B, FreeBSD $B$K(B
$BI8=`$GAH$_9~$^$l$F$$$^$9(B.

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

libncurses $B%i%$%V%i%j$N%+!<%=%k0\F0%1!<%Q%S%j%F%#$N=hM}ItJ,$K$O(B,
$B%P%C%U%!%*!<%P%U%m!<$r0z$-5/$3$92DG=@-$N$"$k%P%C%U%!$,B8:_$7$^$9(B.
$B967b<T$O<+?H$NMQ0U$7$?FC<l$JC<Kv%(%s%H%j$r4^$`(B termcap $B%U%!%$%k$r(B
$B9b$$8"8B$r;}$D%"%W%j%1!<%7%g%s$KFI$_9~$^$;$k$3$H$G(B, $B<eE@$r;}$D(B
ncurses $B%3!<%I$,8F$S=P$5$l$?;~$K(B, $B$3$N<eE@$r0-MQ$9$k$3$H$,2DG=$G$9(B.
$B$3$N<eE@$K$h$j(B, $B967b<T$O%m!<%+%k%7%9%F%`>e$K$*$$$F(B, $B0-MQ$5$l$?(B
$B%"%W%j%1!<%7%g%s$N;}$D8"8B$GG$0U$N%3!<%I$r<B9T$G$-$k$h$&$K$J$j$^$9(B.

FreeBSD $B%Y!<%9%7%9%F%`$K4^$^$l$F$$$k(B systat $B%f!<%F%#%j%F%#$O(B,
$B<eE@$r;}$C$?(B ncurses $B%i%$%V%i%j%k!<%A%s$r;HMQ$7$F$$$k$3$H$,H=L@$7$F$$$^$9(B.
$B$3$N%f!<%F%#%j%F%#$O%+!<%M%k%a%b%j$rFI$_=P$9$3$H$,(B
$B2DG=(B ($B$?$@$7=q$-9~$_$OIT2D(B) $B$J9b$$8"8B$r;}$D(B, kmem $B%0%k!<%W$N8"8B$G(B
$B<B9T$5$l$^$9(B.  $B%+!<%M%k%a%b%j$rFI$`$3$H$N$G$-$k%W%m%;%9$O(B, $B$?$H$($P(B
$B%M%C%H%o!<%/%H%i%U%#%C%/(B, $B%G%#%9%/%P%C%U%!(B, $BC<Kv$NI=<(>uBV$H$$$C$?(B
$B%"%/%;%9$K9b$$8"8B$rI,MW$H$9$k%G!<%?$r%b%K%?%j%s%0$9$k$3$H$,$G$-$k$?$a(B,
$B%m!<%+%k%7%9%F%`(B, $B$"$k$$$OB>$N%7%9%F%`$K$*$$$F(B, $B$=$N>pJs$,(B root $B8"8B$r4^$`(B,
$B$5$i$K9b$$8"8B$rF@$k$?$a$KMxMQ$5$l$k4m81@-$,$"$j$^$9(B.

FreeBSD $B%Y!<%9%7%9%F%`$K4^$^$l$kB>$N%"%W%j%1!<%7%g%s$,F1MM$N<eE@$r(B
$B;}$C$F$$$k2DG=@-$O$"$j$^$9$,(B, $B<eE@$r;}$D2DG=@-$N$"$k(B ncurses $B4X?t$N(B
$B$9$Y$F$r3NG'$9$k$N$O:$Fq$J$?$a(B, $BB>$N%"%W%j%1!<%7%g%s$K<eE@$,B8:_$9$k$+(B
$B$I$&$+$N3NG'$O$J$5$l$F$$$^$;$s(B.  $B0J2<$K<($9$N$O(B, ncurses $B%i%$%V%i%j$H(B
$B%j%s%/$5$l$F$$$F(B, $B9b$$8"8B$G<B9T$5$l$k(B FreeBSD $B%7%9%F%`$N%P%$%J%j$N(B
$BA4%j%9%H$G$9(B.  $B$3$l$i$O0-MQ2DG=$J%;%-%e%j%F%#>e$N<eE@$r;}$C$F$$$k$+$b(B
$BCN$l$^$;$s(B.

/usr/sbin/lpc
/usr/bin/top
/usr/bin/systat

FreeBSD 3.x $B$H$=$l0JA0$N%P!<%8%g%s$N(B FreeBSD $B$G;H$o$l$F$$$k(B ncurses $B$O(B
$BHs>o$K8E$/<j$,2C$($i$l$?$b$N$G$"$j(B, $B8eJ}8_49@-$r3NJ]$7$J$,$i(B
$B?7$7$$%P!<%8%g%s$K99?7$9$k$N$O:$Fq$G$9(B.  FreeBSD 4.0 $B$G$O99?7$5$l$?(B
$B%P!<%8%g%s$N(B ncurses $B$,;H$o$l$F$$$^$9$,(B, FreeBSD 3.x $B$N(B ncurses $B$,(B
$B?7$7$$%P!<%8%g%s$N$b$N$K99?7$5$l$kM=Dj$O$"$j$^$;$s(B.  $B$^$?(B, $B8=:_$N$H$3$m(B
FreeBSD 3.x $B$KB8:_$9$k<eE@$O=$@5$5$l$F$$$^$;$s(B.

ncurses port ($B%P!<%8%g%s(B 5.2 $B$h$jA0$N$b$N(B) $B$K$b(B, $BF1MM$N(B
$B%;%-%e%j%F%#>e$N<eE@$,B8:_$7$^$9(B.  $B$3$NLdBj$O(B, FreeBSD 4.2 $B8x3+A0$K(B
$B=$@5$5$l$^$7$?(B.

III. $B1F6AHO0O(B - Impact

$B$"$k<o$N(B setuid/setgid $B$5$l$?%=%U%H%&%'%"(B (FreeBSD $B%Y!<%9%7%9%F%`$N(B
$B%f!<%F%#%j%F%#$*$h$S%5!<%I%Q!<%F%#@=$N(B ports/packages $B$r4^$`(B) $B$K$O(B,
$B0-MQ$9$k$3$H$G%m!<%+%k$+$i9b$$8"8B$N%"%/%;%9$rF@$k$3$H$N$G$-$k$h$&$J(B
$B%;%-%e%j%F%#>e$N<eE@$,B8:_$9$k2DG=@-$,$"$j$^$9(B.

/usr/bin/systat $B%f!<%F%#%j%F%#$K$O(B, $B$3$N(B ncurses $B$NLdBj$K$h$k(B
$B%;%-%e%j%F%#>e$N<eE@$,B8:_$9$k$3$H$,H=L@$7$F$$$^$9(B.  $B8=;~E@$G$O(B,
/usr/bin/top $B$H(B /usr/sbin/lpc $B$KF1MM$NLdBj$r;}$C$F$$$k$+$I$&$+$O(B
$BITL@$G$9(B.

$B$3$NLdBj$O(B, FreeBSD 4.2 $B$N%j%j!<%9A0$K=$@5$5$l$^$7$?(B.

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

ncurses $B%i%$%V%i%jLdBj$K5/0x$9$k<eE@$r;}$C$F$$$k%P%$%J%j$r3N<B$K(B
$B8!=P$9$k$3$H$OHs>o$K:$Fq$G$9$,(B, $BDs6!$5$l$F$$$k%f!<%F%#%j%F%#$r;H$&$3$H$G(B,
ncurses $B%i%$%V%i%j$r;HMQ$7$F$$$F@x:_E*$K%;%-%e%j%F%#>e$N<eE@$H(B
$B$J$jF@$k$h$&$J(B, $B9b$$8"8B$G<B9T$5$l$k%P%$%J%j$r8!:w$9$k$3$H$,$G$-$^$9(B.
$B$3$N%f!<%F%#%j%F%#$O<B:]$K$O<eE@$r;}$?$J$$%P%$%J%j$rJs9p$9$k$3$H$,(B
$B$"$j$^$9$,(B, $BK|A4$N%;%-%e%j%F%#$r4|$9$?$a$K$O(B, $B$=$l$i$9$Y$F$r(B
$B:F%3%s%Q%$%k$9$Y$-$G$7$g$&(B.

$B@EE*$K%j%s%/$5$l$?%P%$%J%j$N$&$A(B, $B<eE@$,B8:_$9$k2DG=@-$,$"$k$H(B
$BJs9p$5$l$?$b$N$K$D$$$F$O(B, $B%;%-%e%j%F%#>e$N<eE@$r=$@5$9$k$?$a$K(B
libc $B%i%$%V%i%j$r:F%3%s%Q%$%k$7$?8e(B, $B2DG=$J$i%=!<%9$+$i(B
$B:F%3%s%Q%$%k$9$Y$-$G$9(B.  $BF0E*$K%j%s%/$5$l$?%i%$%V%i%j$O(B, $B8e=R$N$h$&$K(B
libc $B$K=$@5%Q%C%A$rE,MQ$7$F:F%3%s%Q%$%k$9$k$@$1$G=$@5$5$l$^$9(B.

$B;CDjE*$JA<CV$H$7$F(B, $BE,59(B, $BJs9p$5$l$?$9$Y$F$N(B setuid/setgid $B$5$l$?%P%$%J%j$r(B
$B:o=|$9$k$+(B, setuid/setgid $B$5$l$F$$$k%U%!%$%k$+$i9b$$8"8B$r<h$j=|$/$+(B,
$B$"$k$$$O%U%!%$%k$N5v2DB0@-$r@)8B$9$k$3$H$r9MN8$7$F$/$@$5$$(B.

$B$b$A$m$s(B, $BJs9p$5$l$?%U%!%$%k$N$$$/$D$+$O%m!<%+%k%7%9%F%`$N@5>o$J1?MQ$K(B
$BI,MW$J$b$N$G$"$k$+$bCN$l$^$;$s(B.  $B$=$N>l9g$OE,@Z$J%f!<%6%0%k!<%W$r@_Dj$7$F(B
$B$=$N%P%$%J%j$+$i(B "o+x" $B$N%U%!%$%k5v2DB0@-%S%C%H$r<h$j=|$-(B, $B$=$N%P%$%J%j$r(B
$B<B9T2DG=$J%f!<%6$r@)8B$9$k$3$H0J30$KL@3N$JLdBj2sHrJ}K!$O$"$j$^$;$s(B.

1) $B<!$N>l=j$+$i(B 'scan_ncurses.sh' $B$*$h$S(B 'test_ncurses.sh' $B%9%/%j%W%H$r(B
   $B%@%&%s%m!<%I$7$^$9(B.

ftp://ftp.freebsd.org/pub/FreeBSD/CERT/tools/SA-00:68/scan_ncurses.sh
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/tools/SA-00:68/test_ncurses.sh

$B0J2<$O(B fetch(1) $B%3%^%s%I;H$C$?Nc$G$9(B.

# fetch ftp://ftp.freebsd.org/pub/FreeBSD/CERT/tools/SA-00:68/scan_ncurses.sh
Receiving scan_ncurses.sh (381 bytes): 100%
381 bytes transferred in 0.1 seconds (7.03 kBps)
# fetch ftp://ftp.freebsd.org/pub/FreeBSD/CERT/tools/SA-00:68/test_ncurses.sh
Receiving test_ncurses.sh (604 bytes): 100%
604 bytes transferred in 0.1 seconds (6.55 kBps)

2) md5 $B%A%'%C%/%5%`$r8!::$7(B, $B2<$NCM$HHf3S$7$^$9(B.

# md5 scan_ncurses.sh
MD5 (scan_ncurses.sh) = 597f63af701253f053581aa1821cbac1
# md5 test_ncurses.sh
MD5 (test_ncurses.sh) = 12491ceb15415df7682e3797de53223e

3) $B%7%9%F%`$KBP$7$F(B scan_ncurses.sh $B$r<B9T$7$^$9(B.

# chmod a+x ./test_ncurses.sh
# sh scan_ncurses.sh ./test_ncurses.sh /

$B$3$N%9%/%j%W%H$O%7%9%F%`A4BN$r8!::$7(B, libncurses $B$r;H$C$F$$$F(B,
setuid $B$b$7$/$O(B setgid $B$5$l$F$$$k%P%$%J%j$rC5$7$^$9(B.  $B$?$H$($P$=$N%P%$%J%j$r(B,
$B%;%-%e%j%F%#>e$N<eE@$r0-MQ$G$-$k%m!<%+%k%f!<%6$NC/$+$,9b$$%f!<%68"8B$r(B
$BF@$kL\E*$G<B9T$G$-$k$+$I$&$+$J$I(B, $B%m!<%+%k4D6-$,$I$N$h$&$J%;%-%e%j%F%#>e$N(B
$B4m81$K;/$5$l$k$N$+$K$D$$$F(B, $B%9%/%j%W%H$,Js9p$9$k%P%$%J%j0l$D0l$D$r(B
($B$?$H$($P(B 'ls- l' $B$d$=$NB>$N%D!<%k$G(B) $B3NG'$9$Y$-$G$7$g$&(B.  

4) $BE,59(B, $B3:Ev$9$k%P%$%J%j$r:o=|$9$k$+(B, $B%U%!%$%k$N5v2DB0@-$r@)8B$7$^$9(B.

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

$B%;%-%e%j%F%#>e$N<eE@$r;}$D(B FreeBSD $B%7%9%F%`$r(B, $B=$@5F|0J9_$N(B
4.1.1-STABLE $B$K%"%C%W%0%l!<%I$9$k$+(B, $B8=9T$N%7%9%F%`$N%=!<%9%3!<%I$K(B
$B=$@5%Q%C%A$rE,MQ$7$F:F9=C[$7$F$/$@$5$$(B.
$B$=$N8e(B, $B%;%/%7%g%s(B IV $B$K=q$+$l$F$$$k$h$&$K(B scan_ncurses.sh $B%9%/%j%W%H$r(B
$B<B9T$7(B, $B$3$N%9%/%j%W%H$,Js9p$9$k(B, $B@EE*%j%s%/$5$l$?$9$Y$F$N%P%$%J%j$r(B
$B3NG'$7$^$9(B.  $B$3$l$i$N%U%!%$%k$O:o=|$9$k$+(B, $B:F%3%s%Q%$%k$9$k$+(B,
$B$"$k$$$O$3$N%;%-%e%j%F%#>e$NLdBj$KBP$9$k0BA4@-$r9b$a$k$?$a$K(B
$B8"8B$r@)8B$9$Y$-$G$9(B ($B@EE*%j%s%/$5$l$?%P%$%J%j$K$O(B, $BC1$K(B
libc $B6&M-%i%$%V%i%j$r:F%3%s%Q%$%k$7$?$@$1$G$O=$@5$N8z2L$,$J$$$?$a$G$9(B).

$B8=9T$N%7%9%F%`$K=$@5%Q%C%A$rE,MQ$9$k$K$O(B, $B=$@5$5$l$?(B ncurses $B%3!<%I$r(B
$B0J2<$N>l=j$+$i<hF@$7$F(B, root $B8"8B$G<!$N%3%^%s%I$r<B9T$7$^$9(B.

# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-00:68/ncurses.tar.gz
# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-00:68/ncurses.tar.gz.asc

PGP $B%f!<%F%#%j%F%#$G=pL>$r3NG'$7$^$9(B.

cd /usr/src
tar xvfz /path/to/ncurses.tar.gz
cd /usr/src/lib/libncurses
make all
make install

$BDL>o$H0[$J$j(B, $B$3$N%;%-%e%j%F%#>e$N<eE@$r=$@5$O(B, $BC1$J$k=$@5%Q%C%A$N7A$G$O(B
$BDs6!$5$l$F$$$^$;$s(B.  $B$3$l$O(B ncurses $B$N%Y%s%@$,$=$l$rMQ0U$7$J$+$C$?$3$H(B,
$B$^$?(B, $B<eE@$,=$@5$5$l$F$$$k:G?7$N(B ncurses snapshot $B$K$OB>$K$b?tB?$/$N(B
$BJQ99$,2C$($i$l$F$*$j(B, $B$=$l$i$,$=$l$>$l(B, $B$I$N$h$&$JL\E*$N$b$N$G(B,
$B<eE@$N=$@5$K4X78$,$"$k$N$+$I$&$+$,ITL@3N$J$?$a$G$9(B.


[ncurses port]

$B<eE@$r;}$C$?%P!<%8%g%s$N(B ncurses port $B$,%$%s%9%H!<%k$5$l$F$$$k>l9g$O(B,
$B0J2<$N$$$:$l$+$N<j=g$G%"%C%W%0%l!<%I$9$k$3$H$,$G$-$^$9(B.

1) Ports Collection $BA4BN$r%"%C%W%0%l!<%I$7(B, ncurses $B$N(B port $B$r:F9=C[$7$^$9(B.

2) $B8E$$(B ($BLuCm(B: ncurses $B$N(B) package $B$r%7%9%F%`$+$i:o=|$7(B, $B=$@5F|0J9_$K(B
   $B:n@.$5$l$??7$7$$(B package $B$r0J2<$N>l=j$+$i<hF@$7$F%$%s%9%H!<%k$7$^$9(B.

ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-3-stable/devel/ncurses-5.2.tgz
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-4-stable/devel/ncurses-5.2.tgz
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/alpha/packages-4-stable/devel/ncurses-5.2.tgz
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-5-current/devel/ncurses-5.2.tgz
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/alpha/packages-5-current/devel/ncurses-5.2.tgz

3) ncurses port $B$N?7$7$$(B port $B%9%1%k%H%s$r0J2<$N>l=j$+$i%@%&%s%m!<%I$7(B,
   $B$=$l$r;H$C$F(B port $B$r:F9=C[$7$^$9(B.

http://www.freebsd.org/ports/

4) $B>e5-(B (3) $B$NA`:n$r<+F0E*$K9T$J$&(B portcheckout $B%f!<%F%#%j%F%#$r;H$$$^$9(B.
   portcheckout $B$N(B port $B$O(B /usr/ports/devel/portcheckout $B$K$"$j$^$9(B.
   $B$^$?(B, portcheckout $B$N(B package $B$,0J2<$N>l=j$+$iF~<j2DG=$G$9(B.

ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-3-stable/devel/portcheckout-2.0.tgz
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-4-stable/devel/portcheckout-2.0.tgz
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/alpha/packages-4-stable/devel/portcheckout-2.0.tgz
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-5-current/devel/portcheckout-2.0.tgz
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/alpha/packages-5-current/devel/portcheckout-2.0.tgz

