Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 01 Aug 2002 19:06:43 +0300
From:      Maxim Sobolev <sobomax@FreeBSD.org>
To:        Bruce Evans <bde@zeta.org.au>, current@FreeBSD.org, obrien@FreeBSD.org
Subject:   Re: pkg_add broken by POLA breakage in tar
Message-ID:  <3D495C93.C7198139@FreeBSD.org>
References:  <20020801203312.V1911-100000@gamplex.bde.org> <3D495A26.4627C170@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Maxim Sobolev wrote:
> 
> Bruce Evans wrote:
> >
> > Revs.1.2-1.3 of tar/src/extract.c break pkg_add (not to mention probably
> > thousands of user scripts that are no more careful than pkg_add) in
> > -current and RELENG_4:
> 
> Are you sure? My own investigation at the time of the commit showed
> that old tar shipped with FreeBSD, was adjusting permissions of
> extracting files when running as uid 0 according to current umask
> settings, so that IMO 1.2-1.3 actually restored POLA, not broke it.

Need evidence? Here it is:

# cvs co -D "10 months ago" src/gnu/usr.bin/tar
[...]
# cd src/gnu/usr.bin/tar
# make
[...]
# mkdir foo
# touch foo/bar
# chmod 777 foo
# chmod 777 foo/bar
# ./tar cvf foo.tar foo
foo/
foo/bar
# rm -rf foo
# ./tar xvf foo.tar
foo/
foo/bar
root@notebook# ls -l | grep foo
drwxr-xr-x  2 root  wheel     512  1 âþú 19:01 foo/
-rw-r--r--  1 root  wheel   10240  1 âþú 19:01 foo.tar
root@notebook# ls -l foo
total 0
-rwxr-xr-x  1 root  wheel  0  1 âþú 19:01 bar*
# umask
0022
#

-Maxim

> 
> -Maxim
> 
> >
> > % RCS file: /home/ncvs/src/contrib/tar/src/extract.c,v
> > % Working file: extract.c
> > % head: 1.4
> > % branch:
> > % locks: strict
> > % access list:
> > % symbolic names:
> > %       RELENG_4: 1.4.0.2
> >         ^^^^^^^^
> > %       TAR_v1_13_25: 1.1.1.1
> > %       FSF: 1.1.1
> > % keyword substitution: kv
> > % total revisions: 6;   selected revisions: 6
> > % description:
> > % ...
> > % ----------------------------
> > % revision 1.3
> > % date: 2002/06/07 06:02:35;  author: sobomax;  state: Exp;  lines: +1 -1
> > % Disabling automatic --same-owner option when running as uid 0 along with
> > % the --same-permissions was an overkill, so put it back. This is consistent
> > % with what our old tar did.
> > %
> > % Suggested by: dillon
> > % ----------------------------
> > % revision 1.2
> > % date: 2002/06/07 00:03:23;  author: sobomax;  state: Exp;  lines: +4 -0
> > % IMO it was a quite ugly idea that if we are running as uid 0 then we can
> > % safely ignore current umask(2) and assume that permissions should be set
> > % right like in the archive. Not only it violates POLA, but introduces
> >                                          ^^^^^^^^^^^^^
> > % huge potential security vulnerability, particularly for ports, where
> > % many popular archives come with 777 files and dirs.
> > % ----------------------------
> >
> > Actually, it is the change violates POLA, and breaks everything that
> > depends on the historical and still documented behaviour.  (The man
> > page even says that (almost) all permissions are restored even in the
> > !root case (it says this indirectly by saying that all attributes are
> > restored if possible and not mentioning the umask or root).  The info
> > page is better.)
> >
> > This bug showed up as breakage in mutt.  mutt uses a setgid utility
> > named mutt_dotlock to lock /var/mail/*, so it fails to download mail
> > if mutt_dotlock's setgid bit is lost on extraction.  It is probably
> > another bug that mutt_dotlock attempts to create a temporary file in
> > /var/mail instead of using flock().
> >
> > "Fixes":
> >
> > (1) Change pkg_add and thousands of user scripts to use tar -p.  This
> > may reopen security holes closed by respecting the umask.
> >
> > %%%
> > Index: extract.c
> > ===================================================================
> > RCS file: /home/ncvs/src/usr.sbin/pkg_install/add/extract.c,v
> > retrieving revision 1.33
> > diff -u -2 -r1.33 extract.c
> > --- extract.c   11 May 2002 04:17:54 -0000      1.33
> > +++ extract.c   1 Aug 2002 10:26:10 -0000
> > @@ -33,5 +33,5 @@
> >  #define PUSHOUT(todir) /* push out string */ \
> >          if (where_count > (int)sizeof(STARTSTRING)-1) { \
> > -                   strcat(where_args, "|tar --unlink -xf - -C "); \
> > +                   strcat(where_args, "|tar --unlink -pxf - -C "); \
> >                     strcat(where_args, todir); \
> >                     if (system(where_args)) { \
> > %%%
> >
> > (2) Restore standard gnu tar behaviour by backing out extract.c revs 1.2-1.3.
> >
> > %%%
> > Index: extract.c
> > ===================================================================
> > RCS file: /home/ncvs/src/contrib/tar/src/extract.c,v
> > retrieving revision 1.4
> > diff -u -2 -r1.4 extract.c
> > --- extract.c   3 Jul 2002 12:44:31 -0000       1.4
> > +++ extract.c   1 Aug 2002 10:44:34 -0000
> > @@ -113,7 +113,5 @@
> >  {
> >    we_are_root = geteuid () == 0;
> > -#ifndef __FreeBSD__
> >    same_permissions_option += we_are_root;
> > -#endif
> >    same_owner_option += we_are_root;
> >    xalloc_fail_func = extract_finish;
> > %%%
> >
> > Bruce
> 
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-current" in the body of the message

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?3D495C93.C7198139>