Date: Tue, 7 Dec 1999 14:55:37 -0800 (PST) From: Alfred Perlstein <bright@wintelcom.net> To: Warner Losh <imp@village.org> Cc: Garance A Drosihn <drosih@rpi.edu>, current@FreeBSD.ORG, stable@FreeBSD.ORG Subject: NO! Re: [PATCHES] Two fixes for lpd/lpc for review and test Message-ID: <Pine.BSF.4.21.9912071446050.4557-100000@fw.wintelcom.net> In-Reply-To: <199912072106.OAA44391@harmony.village.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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.
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:
try this:
as root:
# cd /var/tmp ; touch rootfile ; chown root:wheel rootfile ; chmod 600 rootfile
as a user:
% cd /var/tmp ; echo foo > foo
% lpr -r foo
sleeping
in another session as user:
% rm foo ; ln rootfile foo
wait a second...
# ls -l rootfile
-rw-rw---- 3 user daemon 5 Dec 7 13:38 rootfile
# cat rootfile
foo
#
ouch!
-Alfred
use this patch to make the race condition apparrent:
Index: usr.sbin/lpr/lpr/lpr.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/lpr/lpr/lpr.c,v
retrieving revision 1.27.2.2
diff -u -u -r1.27.2.2 lpr.c
--- lpr.c 1999/08/29 15:43:29 1.27.2.2
+++ lpr.c 1999/12/08 01:47:47
@@ -370,6 +370,27 @@
}
if (sflag)
printf("%s: %s: not linked, copying instead\n", name, arg);
+ if( f ) { /* means that the file should be deleted */
+ printf("sleeping\n");
+ sleep(5);
+ printf("done.\n");
+ seteuid(euid); /* needed for rename() to succeed */
+ if( ! rename( arg, dfname ) ) {
+ register int i;
+ chmod( dfname, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP );
+ chown( dfname, userid, getgrnam("daemon")->gr_gid );
+ seteuid(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);
+ }
if ((i = open(arg, O_RDONLY)) < 0) {
printf("%s: cannot open %s\n", name, arg);
} else {
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.9912071446050.4557-100000>
