home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / unix / volume26 / kit / pch24 < prev    next >
Encoding:
Text File  |  1993-05-04  |  17.4 KB  |  615 lines

  1. Newsgroups: comp.sources.unix
  2. From: ram@acri.fr (Raphael Manfredi)
  3. Subject: v26i231: kit - the ultimate mailing kit, Patch24
  4. Sender: unix-sources-moderator@efficacy.home.vix.com
  5. Approved: WhoAmI@efficacy.home.vix.com
  6.  
  7. Submitted-By: ram@acri.fr (Raphael Manfredi)
  8. Posting-Number: Volume 26, Issue 231
  9. Archive-Name: kit/pch24
  10.  
  11. [The latest patch for kit version 2.0 is #28.]
  12.  
  13. System: kit version 2.0
  14. Patch #: 24
  15. Priority: LOW
  16. Subject: new target 'secure' for alien code detection in archive
  17. Subject: new option -d to specify directory where kits are
  18. Subject: added security checks (options -s and -S) on shell archives
  19. Subject: avoid sending an acknowledgment when -l option used
  20. Subject: (reported by Christian Bertin <bertin@acri.fr>)
  21. Subject: documents new options -d, -s and -S for unkit
  22. Subject: new file 'secure' installed in private library
  23. Date: Mon Feb  8 18:15:27 PST 1993
  24. From: Raphael Manfredi <ram@eiffel.com>
  25.  
  26. Description:
  27.     Avoid sending an acknowledgment when -l option used, which
  28.     is rather annoying. Besides, it is incorrect!
  29.     (reported by Christian Bertin <bertin@acri.fr>)
  30.  
  31.     New options -d, -s and -S for unkit
  32.  
  33.     Unkit will now perform security checks on the shell archives,
  34.     in a vaillant attempt to detect alien code which could, for
  35.     instance, install trojan horses on the behalf of the user. See
  36.     manual page for details.
  37.  
  38. Fix:    From rn, say "| patch -p -N -d DIR", where DIR is your kit source
  39.     directory.  Outside of rn, say "cd DIR; patch -p -N <thisarticle".
  40.     If you don't have the patch program, apply the following by hand,
  41.     or get patch (version 2.0, latest patchlevel).
  42.  
  43.     After patching:
  44.         make clean            # Important to update patchlevel in files
  45.         Configure -d
  46.         make
  47.         make install
  48.  
  49.     If patch indicates that patchlevel is the wrong version, you may need
  50.     to apply one or more previous patches, or the patch may already
  51.     have been applied.  See the patchlevel.h file to find out what has or
  52.     has not been applied.  In any event, don't continue with the patch.
  53.  
  54.     If you are missing previous patches they can be obtained from me:
  55.  
  56.         Raphael Manfredi <ram@eiffel.com>
  57.  
  58.     If you send a mail message of the following form it will greatly speed
  59.     processing:
  60.  
  61.         Subject: Command
  62.         @SH mailpatch PATH kit 2.0 LIST
  63.                ^ note the c
  64.  
  65.     where PATH is a return path FROM ME TO YOU either in Internet notation,
  66.     or in bang notation from some well-known host, and LIST is the number
  67.     of one or more patches you need, separated by spaces, commas, and/or
  68.     hyphens.  Saying 35- says everything from 35 to the end.
  69.  
  70.     To get some more detailed instructions, send me the following mail:
  71.  
  72.         Subject: Command
  73.         @SH mailhelp PATH
  74.  
  75.  
  76. Index: patchlevel.h
  77. Prereq: 23
  78. 2c2
  79. < #define PATCHLEVEL 23
  80. ---
  81. > #define PATCHLEVEL 24
  82.  
  83. Index: kit/unkit.SH
  84. Prereq: 2.0.1.15
  85. *** kit/unkit.SH.old    Mon Feb  8 18:15:15 1993
  86. --- kit/unkit.SH    Mon Feb  8 18:15:17 1993
  87. ***************
  88. *** 19,27 ****
  89.   # @(#) (c) E. Mogenet April 1990
  90.   # @(#) (c) R. Manfredi, 1990 1991
  91.   
  92. ! # $Id: unkit.SH,v 2.0.1.15 93/01/11 18:07:29 ram Exp $
  93.   #
  94.   # $Log:    unkit.SH,v $
  95.   # Revision 2.0.1.15  93/01/11  18:07:29  ram
  96.   # patch22: now uses external getopt script for option parsing
  97.   # patch22: fixed some typos in the help message
  98. --- 19,33 ----
  99.   # @(#) (c) E. Mogenet April 1990
  100.   # @(#) (c) R. Manfredi, 1990 1991
  101.   
  102. ! # $Id: unkit.SH,v 2.0.1.16 93/02/08 18:13:58 ram Exp $
  103.   #
  104.   # $Log:    unkit.SH,v $
  105. + # Revision 2.0.1.16  93/02/08  18:13:58  ram
  106. + # patch24: new option -d to specify directory where kits are
  107. + # patch24: added security checks (options -s and -S) on shell archives
  108. + # patch24: avoid sending an acknowledgment when -l option used
  109. + # patch24: (reported by Christian Bertin <bertin@acri.fr>)
  110. + # 
  111.   # Revision 2.0.1.15  93/01/11  18:07:29  ram
  112.   # patch22: now uses external getopt script for option parsing
  113.   # patch22: fixed some typos in the help message
  114. ***************
  115. *** 119,124 ****
  116. --- 125,134 ----
  117.   
  118.   decoding=hexdecode            # Default decoding program
  119.   preserve=yes                # Preserve input files by default
  120. + secure=yes                    # Security checks by default
  121. + extra_secure=no                # Don't be too strict
  122. + ack=yes                        # Acknowledgment sent if present
  123. + directory=''                # Cd there before starting extraction
  124.   usebtar=''                    # Do not use badtar
  125.   key=''                        # Key for DES decoding
  126.   
  127. ***************
  128. *** 128,146 ****
  129.   
  130.   # Old Bourne shells do not have functions
  131.   usage='
  132. ! echo "Usage: unkit [-bhlprV] [-k key] [file1 ... filen]";
  133.   echo " "" -b : force use of badtar ($badtar by default).";
  134.   echo " "" -h : give this help message.";
  135.   echo " "" -k : set the key used for data decryption.";
  136.   echo " "" -l : list files held in the kit parts.";
  137.   echo " "" -p : preserve input files (default).";
  138.   echo " "" -r : remove input files if unshar succeeds.";
  139.   echo " "" -V : print current version and patch-level.";
  140.   exit 1
  141.   '
  142.   
  143.   # Process the command line options
  144. ! eval "set X "`$libdir/getopt bhlprVk: "$@"`; shift
  145.   while test $# -gt 0
  146.   do
  147.       case "$1" in
  148. --- 138,159 ----
  149.   
  150.   # Old Bourne shells do not have functions
  151.   usage='
  152. ! echo "Usage: unkit [-bhlprsSV] [-d dir] [-k key] [file1 ... filen]";
  153.   echo " "" -b : force use of badtar ($badtar by default).";
  154. + echo " "" -d : cd to specified directory before starting extraction.";
  155.   echo " "" -h : give this help message.";
  156.   echo " "" -k : set the key used for data decryption.";
  157.   echo " "" -l : list files held in the kit parts.";
  158.   echo " "" -p : preserve input files (default).";
  159.   echo " "" -r : remove input files if unshar succeeds.";
  160. + echo " "" -s : skip security checks on shell-archives.";
  161. + echo " "" -S : extra secure; abort if security checks cannot be made.";
  162.   echo " "" -V : print current version and patch-level.";
  163.   exit 1
  164.   '
  165.   
  166.   # Process the command line options
  167. ! eval "set X "`$libdir/getopt bhlprsSVd:k: "$@"`; shift
  168.   while test $# -gt 0
  169.   do
  170.       case "$1" in
  171. ***************
  172. *** 156,161 ****
  173. --- 169,175 ----
  174.       -h) eval $usage;;
  175.       -l) tar_opt=tvf
  176.           preserve=yes
  177. +         ack=no
  178.           shift;;
  179.       -b) usebtar='true'
  180.           shift;;
  181. ***************
  182. *** 162,167 ****
  183. --- 176,188 ----
  184.       -k) key="-k $2"
  185.           shift
  186.           shift;;
  187. +     -s) secure=no
  188. +         shift;;
  189. +     -S) extra_secure=yes
  190. +         shift;;
  191. +     -d) directory="$2"
  192. +         shift
  193. +         shift;;
  194.       --) shift
  195.           break
  196.           ;;
  197. ***************
  198. *** 199,204 ****
  199. --- 220,238 ----
  200.   list=''
  201.   count=0
  202.   
  203. + # Go to specified directory before starting, if necessary
  204. + case "$directory" in
  205. + '') ;;
  206. + *)
  207. +     if cd $directory; then
  208. +         : ok
  209. +     else
  210. +         echo "unkit: cannot cd to $directory." >&2
  211. +         exit 1
  212. +     fi
  213. +     ;;
  214. + esac
  215.   for file in $*; do
  216.       # Use perl if possible, as it does not have this stupid awk limitation
  217.       # about the maximum number of opened files. However, I want this to
  218. ***************
  219. *** 283,299 ****
  220.       ;;
  221.   esac
  222.   
  223.   # Loop over each identified kit part and unshar it
  224.   for i
  225.   do
  226.       # The command expects "$a" to be the parameter.
  227. !     eval "a=$i; $unshar_cmd"    &&
  228. !     (test $preserve = no && rm $i)
  229.   done
  230.   
  231.   # Clean up extracted parts (save disk space before tar extraction)
  232.   rm -f zag.[tx][mt]*
  233.   
  234.   # Now check for file names to find how to decode
  235.   if test -f z[ace][gbc].ba.aa -a ! -f ark*isdone
  236.   then
  237. --- 317,379 ----
  238.       ;;
  239.   esac
  240.   
  241. + # Security checks need perl, unfortunately.
  242. + if (perl -v) >/dev/null 2>&1; then
  243. +     : nothing
  244. + else
  245. +     secure=no
  246. +     case "$extra_secure" in
  247. +     yes)
  248. +         echo "unkit: cannot perform security checks (perl not found)." >&2
  249. +         rm -f zag.[tx][mt]*
  250. +         exit 1
  251. +         ;;
  252. +     esac
  253. + fi
  254.   # Loop over each identified kit part and unshar it
  255. + unsecure=''
  256.   for i
  257.   do
  258. +     # Ensure archive does not contain any alien code.
  259. +     run_unshar=yes
  260. +     case "$secure" in
  261. +     yes)
  262. +         if perl $libdir/secure $i; then
  263. +             : ok
  264. +         else
  265. +             echo "unkit: skipping unsecure shell archive $i (for now)." >&2
  266. +             unsecure="$unsecure $i"
  267. +             run_unshar=no
  268. +         fi
  269. +         ;;
  270. +     esac
  271.       # The command expects "$a" to be the parameter.
  272. !     case "$run_unshar" in
  273. !     yes)
  274. !         eval "a=$i; $unshar_cmd"    &&
  275. !         (test $preserve = no && rm $i)
  276. !         ;;
  277. !     esac
  278.   done
  279.   
  280.   # Clean up extracted parts (save disk space before tar extraction)
  281.   rm -f zag.[tx][mt]*
  282.   
  283. + # Should unsecure parts have been found, signal it again and abort
  284. + case "$unsecure" in
  285. + '') ;;
  286. + *)
  287. +     echo "unkit: the following parts are unsecure:" >&2
  288. +     set X $unsecure
  289. +     shift
  290. +     echo $* | tr ' ' '\012' | sed -e 's/^/    /' >&2
  291. +     echo "unkit: aborting." >&2
  292. +     exit 1
  293. +     ;;
  294. + esac
  295.   # Now check for file names to find how to decode
  296.   if test -f z[ace][gbc].ba.aa -a ! -f ark*isdone
  297.   then
  298. ***************
  299. *** 330,336 ****
  300.   eval "$tarcmd" && status=0
  301.   
  302.   # Send acknowledgment only when unpacking was successful.
  303. ! if test -f zzz.ack -a $status -eq 0; then
  304.       sender=`cat zzz.ack`
  305.       subject=`cat zzz.subject`
  306.       echo "Sending acknowledgment to $sender..."
  307. --- 410,416 ----
  308.   eval "$tarcmd" && status=0
  309.   
  310.   # Send acknowledgment only when unpacking was successful.
  311. ! if test $ack = 'yes' -a -f zzz.ack -a $status -eq 0; then
  312.       sender=`cat zzz.ack`
  313.       subject=`cat zzz.subject`
  314.       echo "Sending acknowledgment to $sender..."
  315.  
  316. Index: man/kit.SH
  317. Prereq: 2.0.1.11
  318. *** man/kit.SH.old    Mon Feb  8 18:15:21 1993
  319. --- man/kit.SH    Mon Feb  8 18:15:22 1993
  320. ***************
  321. *** 18,26 ****
  322.   .TH KIT $manext "Version $VERSION PL$PATCHLEVEL"
  323.   ''' @(#) Manual page for mailing kit -- (c) ram July 1990
  324.   '''
  325. ! ''' $Id: kit.SH,v 2.0.1.11 93/01/11 18:08:33 ram Exp $
  326.   '''
  327.   ''' $Log:    kit.SH,v $
  328.   ''' Revision 2.0.1.11  93/01/11  18:08:33  ram
  329.   ''' patch22: manual page now carries version number and patchlevel
  330.   ''' patch22: added OPTIONS section for quick reference
  331. --- 18,30 ----
  332.   .TH KIT $manext "Version $VERSION PL$PATCHLEVEL"
  333.   ''' @(#) Manual page for mailing kit -- (c) ram July 1990
  334.   '''
  335. ! ''' $Id: kit.SH,v 2.0.1.12 93/02/08 18:14:56 ram Exp $
  336.   '''
  337.   ''' $Log:    kit.SH,v $
  338. + ''' Revision 2.0.1.12  93/02/08  18:14:56  ram
  339. + ''' patch24: documents new options -d, -s and -S for unkit
  340. + ''' patch24: new file 'secure' installed in private library
  341. + ''' 
  342.   ''' Revision 2.0.1.11  93/01/11  18:08:33  ram
  343.   ''' patch22: manual page now carries version number and patchlevel
  344.   ''' patch22: added OPTIONS section for quick reference
  345. ***************
  346. *** 85,91 ****
  347.   \fBmailkit\fR [ \fB\-EFVcefhp\fR ] [ \fB\-l\fI file\fR ]
  348.   [ \fB\-n\fI partname\fR ] \fItitle\fR [ \fIaddress(es)\fR ]
  349.   .sp
  350. ! \fBunkit\fR [ \fB\-bhlprV\fR ] [ \fB\-k\fI key\fR ] [ \fIfiles\fR ]
  351.   .SH DESCRIPTION
  352.   '''
  353.   ''' Kit
  354. --- 89,96 ----
  355.   \fBmailkit\fR [ \fB\-EFVcefhp\fR ] [ \fB\-l\fI file\fR ]
  356.   [ \fB\-n\fI partname\fR ] \fItitle\fR [ \fIaddress(es)\fR ]
  357.   .sp
  358. ! \fBunkit\fR [ \fB\-bhlprsSV\fR ] [\fB\-d\fI dir\fR ]
  359. ! [ \fB\-k\fI key\fR ] [ \fIfiles\fR ]
  360.   .SH DESCRIPTION
  361.   '''
  362.   ''' Kit
  363. ***************
  364. *** 244,249 ****
  365. --- 249,264 ----
  366.   specify the key to be used by DES. If you do not supply it, DES will
  367.   prompt you on the terminal.
  368.   .PP
  369. + By default, \fIunkit\fR will perform security checks on the shell archives
  370. + (if \fIperl\fR is available) to detect alien code. It will skip those parts
  371. + containing suspicious code which should not be part of the archive. You may
  372. + explicitely skip those checks by using the \fB\-s\fR option, which should be
  373. + used only when \fIunkit\fR input can be reliably trusted. Unfortunately, the
  374. + script used to make those checks is written in \fIperl\fR, so nothing will
  375. + happen if \fIperl\fR is not in your PATH. The \fB\-S\fR option will make kit
  376. + abort with an error if it is unable to perform security checks due to the
  377. + absence of \fIperl\fR.
  378. + .PP
  379.   For all of these commands, option \fB\-V\fR prints the version
  380.   number with the current patch level and exits, while \fB\-h\fR gives
  381.   a little help message with the syntax and the meaning of the options.
  382. ***************
  383. *** 391,396 ****
  384. --- 406,416 ----
  385.   .PP
  386.   \fIUnkit\fR uses the following options:
  387.   .TP 15
  388. + .B \-S
  389. + Complain loudly and abort if \fIperl\fR is not found, since that would make
  390. + it impossible to check each kit part for possible alien code before running
  391. + them through the shell.
  392. + .TP
  393.   .B \-V
  394.   Print version number and patchlevel.
  395.   .TP
  396. ***************
  397. *** 397,402 ****
  398. --- 417,425 ----
  399.   .B \-b
  400.   Force usage of \fIbadtar\fR.
  401.   .TP
  402. + .B \-d\fI dir
  403. + Go to \fIdir\fR before starting extraction.
  404. + .TP
  405.   .B \-h
  406.   Print usage and option summary.
  407.   .TP
  408. ***************
  409. *** 410,415 ****
  410. --- 433,442 ----
  411.   .TP
  412.   .B \-r
  413.   Remove input files if unshar succeeds.
  414. + .TP
  415. + .B \-s
  416. + Force skipping of security checks, which are conducted only if \fIperl\fR is
  417. + available in your PATH.
  418.   .SH FILES
  419.   .PD 0
  420.   .TP 15
  421. ***************
  422. *** 451,456 ****
  423. --- 478,486 ----
  424.   .TP
  425.   $privlib/rshar
  426.   a simple shell archive maker.
  427. + .TP
  428. + $privlib/secure
  429. + security checks (detection of alien code) in kit archives.
  430.   .PD
  431.   .SH ENVIRONMENT
  432.   The following environment variables are paid attention to by \fImailkit\fR. If
  433.  
  434. Index: kit/secure
  435. *** kit/secure.old    Mon Feb  8 18:15:11 1993
  436. --- kit/secure    Mon Feb  8 18:15:12 1993
  437. ***************
  438. *** 0 ****
  439. --- 1,78 ----
  440. + #!/usr/bin/perl
  441. + # $Id: secure,v 2.0.1.1 93/02/08 18:12:21 ram Exp $
  442. + #
  443. + # $Log:    secure,v $
  444. + # Revision 2.0.1.1  93/02/08  18:12:21  ram
  445. + # patch24: created
  446. + # 
  447. + # Scan shell archive (the subset used by kit) and determines if it contains
  448. + # alien code which could be a virus of some sort and infect the machine or
  449. + # the user's account when ran through a shell.
  450. + # Unfortunately, perl is needed to make those checks.
  451. + #
  452. + # This program knows about the format of shell archives created by cshar or
  453. + # makeshar, for kit purposes. We know for instance there will never be a
  454. + # need for mkdir.
  455. + while (<>) {
  456. +     m|^#! /bin/sh| && ($in = 1) && next;
  457. +     next unless $in;        # Not in archive yet
  458. +     chop;
  459. +     /^END_OF_FILE$/ && (($file = 0) || next);
  460. +     next if $file;            # Inside file extraction
  461. +     s/^\s+//;                # Strip leading blanks
  462. +     /^#/ && next;            # Shell comment
  463. +     /^$/ && next;            # Blank line
  464. +     $scanned = $_;            # Save current line before modifications
  465. +     if (/^sed/) {            # Must be file extraction
  466. +         $file = 1;
  467. +         next if
  468. +             m|^sed\s+['"]s/\^X//['"]\s*>\s*'?[\w.]+'?\s*<<\s*'END_OF_FILE'$|;
  469. +         &error;
  470. +     } elsif (s/^PATH=(.*); export PATH$/$1/) {
  471. +         &strong_check;
  472. +     } elsif (/^fi/ || /^else/ || /^exit/ || /^done/) {
  473. +         &loose_check;
  474. +     } elsif (/^echo/) {
  475. +         s/\\\\/\01/g;        # \\ -> ^A
  476. +         s/\\.//g;            # Remove escaped characters
  477. +         s/\01/\\/;            # ^A -> \ (forbidden anyway)
  478. +         &echo_check;
  479. +     } elsif (s/^if (.*); then\s*$/$1/) {
  480. +         next if /^test -f '[\w.]+' -a "\$\{1\}\" != "-c"\s*$/;
  481. +         next if /^test \d+ -ne `wc -c <\s*'[\w.]+'`\s*$/;
  482. +         next if /^test ! -f ark\$\{i\}isdone\s*$/i;
  483. +         next if /^test "\$\{missing\}" = ""\s*$/i;
  484. +         &error;
  485. +     } elsif (s/^rm //) {
  486. +         next if /^-f ark\[1-9\]isdone$/;
  487. +         &error;
  488. +     } elsif (s/^cp //) {
  489. +         next if m|^/dev/null ark\d+isdone$|;
  490. +         &error;
  491. +     } elsif (s/^chmod //) {
  492. +         next if m|^\+x '[\w.]+'$|;
  493. +         &erorr;
  494. +     } elsif (s/^for (.*); do\s*$/$1/) {
  495. +         &loose_check;
  496. +     } else {
  497. +         next if /^missing="(\$\{missing\}\s+\$\{i\})?"$/i;
  498. +         &error;
  499. +     }
  500. + }
  501. + exit($errors ? 1 : 0);        # Exit status (0 means ok)
  502. + # Unsafe operation was detected
  503. + sub error {
  504. +     print STDERR "unkit: \"$ARGV\", suspicious line $.: $scanned\n";
  505. +     $errors++;
  506. + }
  507. + # Check arguments to echo (no fear for () or {} subshells for instance), etc...
  508. + sub echo_check        { &error if /[&^*[`\\|;><?]/; }
  509. + sub loose_check        { &error if /[&^*([{}`\\|;><?]/; }
  510. + sub strong_check    { &error if /[=\$^&*([{}`\\|;><?]/; }
  511.  
  512. Index: kit/Makefile.SH
  513. Prereq: 2.0.1.7
  514. *** kit/Makefile.SH.old    Mon Feb  8 18:15:09 1993
  515. --- kit/Makefile.SH    Mon Feb  8 18:15:09 1993
  516. ***************
  517. *** 18,26 ****
  518.   # Makefile for kit (sub-directory kit)
  519.   #
  520.   
  521. ! # $Id: Makefile.SH,v 2.0.1.7 93/01/11 18:04:13 ram Exp $
  522.   #
  523.   # $Log:    Makefile.SH,v $
  524.   # Revision 2.0.1.7  93/01/11  18:04:13  ram
  525.   # patch22: new getopt target
  526.   # 
  527. --- 18,29 ----
  528.   # Makefile for kit (sub-directory kit)
  529.   #
  530.   
  531. ! # $Id: Makefile.SH,v 2.0.1.8 93/02/08 18:12:09 ram Exp $
  532.   #
  533.   # $Log:    Makefile.SH,v $
  534. + # Revision 2.0.1.8  93/02/08  18:12:09  ram
  535. + # patch24: new target 'secure' for alien code detection in archive
  536. + # 
  537.   # Revision 2.0.1.7  93/01/11  18:04:13  ram
  538.   # patch22: new getopt target
  539.   # 
  540. ***************
  541. *** 56,63 ****
  542.   !GROK!THIS!
  543.   $spitshell >>Makefile <<'!NO!SUBS!'
  544.   bin = kit mailkit unkit
  545. ! lib = minikit range getopt
  546. ! scripts = $(bin) $(lib)
  547.   scriptsh = kit.SH mailkit.SH unkit.SH minikit.SH
  548.   added = Makefile config.sh
  549.   
  550. --- 59,68 ----
  551.   !GROK!THIS!
  552.   $spitshell >>Makefile <<'!NO!SUBS!'
  553.   bin = kit mailkit unkit
  554. ! libsh = minikit range getopt
  555. ! lib = secure
  556. ! scripts = $(bin) $(libsh) $(lib)
  557. ! scriptmade = $(bin) $(libsh)
  558.   scriptsh = kit.SH mailkit.SH unkit.SH minikit.SH
  559.   added = Makefile config.sh
  560.   
  561. ***************
  562. *** 87,98 ****
  563.           ../install -m 755 $$file $(binsh); \
  564.       done
  565.       ../install -d $(libdir)
  566. !     -for file in $(lib); do \
  567.           ../install -m 755 $$file $(libdir); \
  568.       done
  569.   
  570.   clean:
  571. !     $(RM) -f $(scripts)
  572.   
  573.   realclean clobber: clean
  574.       $(RM) -f $(added)
  575. --- 92,103 ----
  576.           ../install -m 755 $$file $(binsh); \
  577.       done
  578.       ../install -d $(libdir)
  579. !     -for file in $(libsh) $(lib); do \
  580.           ../install -m 755 $$file $(libdir); \
  581.       done
  582.   
  583.   clean:
  584. !     $(RM) -f $(scriptmade)
  585.   
  586.   realclean clobber: clean
  587.       $(RM) -f $(added)
  588.  
  589. Index: MANIFEST
  590. *** MANIFEST.old    Mon Feb  8 18:15:25 1993
  591. --- MANIFEST    Mon Feb  8 18:15:25 1993
  592. ***************
  593. *** 30,35 ****
  594. --- 30,36 ----
  595.   kit/mailkit.SH             Mails parts generated by "kit"
  596.   kit/minikit.SH             The minikit script for kit extraction
  597.   kit/range.SH               Run range expansion within specified bound
  598. + kit/secure                 Alien code detector for kit archives
  599.   kit/unkit.SH               Reversal of "kit"
  600.   man/Makefile.SH            Makefile for manual pages
  601.   man/atob.SH                Manual page for "atob"
  602.  
  603. *** End of Patch 24 ***
  604.