 
Bugtraq mailing list archives
Re: Race condition in "rm -r"
From: abelits () PHOBOS ILLTEL DENVER CO US (Alex Belits)
Date: Sun, 7 May 2000 13:03:28 -0700
On Sat, 6 May 2000, Glynn Clements wrote:
Use a statically-linked "rm" and "chroot /tmp" first.Maybe stat "." after chdir to verify that we ended up the expected place?
More like;y getcwd() will be useful -- there is nothing in stat that can tell us if we followed a link, and inode comparison may be unreliable.
My "rm" (GNU fileutils 4.0) does this:
    getdents(3, /* 45 entries */, 3933)     = 924
    lstat("Imakefile", {st_mode=S_IFREG|0644, st_size=2842, ...}) = 0
    unlink("Imakefile")                     = 0
    lstat("pixmaps", {st_mode=S_IFDIR|0755, st_size=1024, ...}) = 0
    chdir("pixmaps")                        = 0
    close(3)                                = 0
1>  open(".", O_RDONLY|O_NONBLOCK)          = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
2>  fstat(3, {st_mode=S_IFDIR|0755, st_size=1024, ...}) = 0
    lseek(3, 0, SEEK_CUR)                   = 0
    getdents(3, /* 49 entries */, 3933)     = 1112
    lstat("about.xpm", {st_mode=S_IFREG|0644, st_size=43055, ...}) = 0
    unlink("about.xpm")                     = 0
    lstat("apple.xpm", {st_mode=S_IFREG|0644, st_size=927, ...}) = 0
    unlink("apple.xpm")                     = 0
Any suggestions as to why it is doing the fstat() in (2) if it isn't
checking for symlink games? [Note: I'm not saying that it *is*
checking, just that it seems odd if it isn't.]
  Relevant piece from glibc 2.1.1 opendir() (other libraries probably do
something similar):
---8<---
    {
      /* We first have to check whether the name is for a directory.  We
         cannot do this after the open() call since the open/close operation
         performed on, say, a tape device might have undesirable effects.  */
      if (__xstat (_STAT_VER, name, &statbuf) < 0)
        return NULL;
      if (! S_ISDIR (statbuf.st_mode))
        {
          __set_errno (ENOTDIR);
          return NULL;
         }
    }
  fd = __open (name, O_RDONLY|O_NDELAY|EXTRA_FLAGS);
  if (fd < 0)
    return NULL;
  /* Now make sure this really is a directory and nothing changed since
     the `stat' call.  */
  if (__fstat (fd, &statbuf) < 0)
    goto lose;
  if (! S_ISDIR (statbuf.st_mode))
    {
      save_errno = ENOTDIR;
      goto lose;
    }
  if (__fcntl (fd, F_SETFD, FD_CLOEXEC) < 0)
    goto lose;
--->8---
  (lines before open() don't exist in your example, however I have left
them because otherwise comment for fstat() doesn't make sense).
--
Alex
----------------------------------------------------------------------
 Excellent.. now give users the option to cut your hair you hippie!
                                                  -- Anonymous Coward
Current thread:
- Re: Windows NT/95/98/Possible Others Denial of Service Attack. Mi crosoft ODBC Database connectivity flaw. Daniel Docekal (May 01)
- SuSE Security Announcement - aaa_base - UPDATE Marc Heuse (May 02)
- Race condition in "rm -r" Morten Welinder (May 03)
- Re: Race condition in "rm -r" Glynn Clements (May 06)
- Re: Race condition in "rm -r" David Brownlee (May 07)
- Re: Race condition in "rm -r" Glynn Clements (May 07)
- Re: Race condition in "rm -r" David Brownlee (May 08)
 
 
- Race condition in "rm -r" Morten Welinder (May 03)
- Re: Race condition in "rm -r" Alex Belits (May 07)
- Re: Race condition in "rm -r" Glynn Clements (May 07)
 
- SuSE Security Announcement - aaa_base - UPDATE Marc Heuse (May 02)
- Ipchains! Dimuthu Parussalla (May 07)
- Re: Ipchains! Paul D. Carlucci (May 10)
- Prevent Current and Future E-Mail Worms AXENT Security Team (May 12)
- Cisco Security Advisory: Cisco IOS HTTP Server Vulnerability Cisco Systems Product Security Incident Response Team (May 15)
- Contemplations : Melissa, I love you - not! Cerberus Security Team (May 08)
- June 2000 FIRST Conference Reminder Roger Safian (May 08)


