Date: Sun, 09 Mar 1997 11:54:41 -0800 From: Cy Schubert <cy@cwsys.cwent.com> To: freebsd-security@freebsd.org Cc: Garrett Wollman <wollman@lcs.mit.edu>, "Daniel O'Callaghan" <danny@panda.hilink.com.au> Subject: Re: 4.4BSD NFS File Handles (fwd) Message-ID: <199703091954.LAA00737@cwsys.cwent.com> In-Reply-To: Your message of "Sun, 09 Mar 1997 09:08:50 PST." <199703091708.JAA00702@cwsys.cwent.com>
next in thread | previous in thread | raw e-mail | index | archive | help
I have tested my suggestion below on both of my 2.1.6 systems using the following test program; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> main() { struct stat sb; if (stat("/usr",&sb)) { perror("stat error"); exit(1); } printf("%ud\n",sb.st_gen); } The modified patch returns zero in sb.st_gen for non-root users, yet does not set the flag indicating the use of superuser powers. (I agree with Garret that filling a field via a commonly used system call does not quailfy to set the superuser-power-used flag). The patch is based on 2.1.6 as distributed on CDROM. --- sys/kern/vfs_vnops.c.orig Thu Oct 26 02:17:22 1995 +++ sys/kern/vfs_vnops.c Sun Mar 9 09:28:11 1997 @@ -395,7 +395,10 @@ sb->st_ctimespec = vap->va_ctime; sb->st_blksize = vap->va_blocksize; sb->st_flags = vap->va_flags; - sb->st_gen = vap->va_gen; + if (p->p_cred->pc_ucred->cr_uid == 0) + sb->st_gen = vap->va_gen; + else + sb->st_gen = 0; sb->st_blocks = vap->va_bytes / S_BLKSIZE; return (0); } Since I maintain a diverse range of platforms at work, five different vendors at last count, and since I build infrastructure or at least test some concepts at home, maintaining compatibility with these platforms is important to me as it reduces the number customizations I need to do for to get the same package to work on all platforms. Regards, Phone: (250)387-8437 Cy Schubert Fax: (250)387-5766 UNIX Support OV/VM: BCSC02(CSCHUBER) ITSD BITNET: CSCHUBER@BCSC02.BITNET Government of BC Internet: cschuber@uumail.gov.bc.ca cschuber@bcsc02.gov.bc.ca "Quit spooling around, JES do it." > > <<On Fri, 7 Mar 1997 16:15:41 +1100 (EST), "Daniel O'Callaghan" <danny@pand a. > hilink.com.au> said: > > > > > if (suser(p->p_ucred, &p->p_acflag)) { > > > sb->st_gen = 0; > > > } else { > > > sb->st_gen = vap->va_gen; > > > } > > > > This test is bogus. The problem is that is causes p_acflag to get the > > ``used superuser privileges'' bit set every time a root process calls > > stat(). Since most processes call stat() at least once in their > > lifetime, this would make p_acflag completely useless. > > Agreed. Replacing the "if (suser(p->p_ucred, &p->p_acflag)) {" in the > patch with "if (p->p_cred->pc_ucred->cr_uid == 0) {" should address this > concern. > > > > > I'm certainly willing to live with not making this information > > available through the stat(2) interface at all. Any process with > > appropriate privilege can simply read the information off the disk > > anyway, so I don't see any benefit in having it here. (A process with > > appropriate privilege can also call getfh(2) and parse the returned > > handle.) > > I disagree. This field is returned by other UNICES, notably DEC UNIX among > others. Removing it would cause some portability concerns in some cases, > e.g. some code may not compile right-out-of-the-box.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199703091954.LAA00737>