On Thu, 9 Dec 1999, Andre Albsmeier wrote:

> > On Tue, 7 Dec 1999, Warner Losh wrote:
> > 
> > > I've been reviewing this patch with someone and I think the last
> > > version is ready to commit.  I'll take a look at my tree to make
> > > sure.
> > 
> On Tue, 07-Dec-1999 at 14:55:37 -0800, Alfred Perlstein wrote:
> > please do not, the patch in PR 11997 introduces a major security flaw.
> > 
> > someone can hardlink to any file and clobber it with a file owned by
> > them:
> > 
> 
> I think the (really big) security hole can be closed by not doing
> the chown/chmod commands. I inserted them because I wanted the
> file in the spool directory to appear exactly as if lpr would
> have copied it.
> I am currently running the patch with the chown/chmod removed and
> lpd doesn't seem to have any problems with it. The side effect now
> is that the file in the spool directory keeps it's permissions.
> I don't think that this is a problem because if the file was
> set to 666 by the creator before, he doesn't care a lot about
> it anyway :-)
> 
> What do people think about this? Alfred, Warner ?
> 
> For better reference, here is the current patch:
> 
> *** lpr.c.ORI Thu Dec  9 15:30:18 1999
> --- lpr.c     Thu Dec  9 15:30:35 1999
> ***************
> *** 370,375 ****
> --- 370,405 ----
>               }
>               if (sflag)
>                       printf("%s: %s: not linked, copying instead\n", name, arg);
> +             /*
> +              * If lpr was invoked with -r we try to move the file to
> +              * be printed instead of copying and deleting it later.
> +              * This works if the file and lpd's spool directory are
> +              * on the same filesystem as it is often the case for files
> +              * printed by samba or pcnfsd. In this case, a lot of I/O
> +              * and temporary disk space can be avoided. Otherwise, we
> +              * will continue normally.
> +              */
> +             if (f) {                        /* file should be deleted */
> +                     seteuid(euid);          /* needed for rename() */
> +                     if (!rename(arg, dfname)) {
> +                             int i;
> + #if 0
> +                             chown(dfname, userid, getegid());
> +                             chmod(dfname, S_IRUSR | S_IWUSR |
> +                                 S_IRGRP | S_IWGRP);
> + #endif
> +                             seteuid(uid);   /* restore old uid */
> +                             if (format == 'p')
> +                                     card('T', title ? title : arg);
> +                             for (i = 0; i < ncopies; i++)
> +                                     card(format, &dfname[inchar-2]);
> +                             card('U', &dfname[inchar-2]);
> +                             card('N', arg);
> +                             nact++;
> +                             continue;
> +                     }
> +                     seteuid(uid);           /* restore old uid */
> +             }
>               if ((i = open(arg, O_RDONLY)) < 0) {
>                       printf("%s: cannot open %s\n", name, arg);
>               } else {
> 
> 

I don't have too much time to think about this, argue me this:

why should I allow a user to print any file on the system?

the race condition is still there.

-Alfred




To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-stable" in the body of the message

Reply via email to