Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 31 May 1999 15:43:46 +1000
From:      David Dawes <dawes@rf900.physics.usyd.edu.au>
To:        Bruce Evans <bde@zeta.org.au>, aron@cs.rice.edu, freebsd-bugs@freebsd.org
Subject:   Re: kern/11915: access system call says file is readable when its not
Message-ID:  <19990531154346.K24275@rf900.physics.usyd.edu.au>
In-Reply-To: <199905310517.PAA01594@godzilla.zeta.org.au>; from Bruce Evans on Mon, May 31, 1999 at 03:17:45PM %2B1000
References:  <199905310517.PAA01594@godzilla.zeta.org.au>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, May 31, 1999 at 03:17:45PM +1000, Bruce Evans wrote:
>> As for how I ran into this. Well, it seems XOpenDisplay() library call
>> in X11 uses access() to determine whether it can read a user's
>> .Xauthority file.
>
>If so, then XOpenDisplay() is a potential security hole and should never
>be used :-).  See access.2.

As far as I can see (and I can only guess at the original intention),
it uses access(2) to decide whether it can bail out based on the real
uid.  It doesn't buy any security for a setuid application, but I think
that's really the responsibility of the application.  Xterm handles
this, for example.

>> My home directory is NFS mounted on my
>> desktop machine and the NFS server maps the "root" of my machine into
>> "nobody". So setuid programs (like xterm and Eterm) have a potential
>> problem - they run with the effective userid of
>> root and when they try to open my .Xauthority file,  the NFS server
>> refuses access. For this reason, Eterm temporarily swaps the real userid
>> and effective userid (thus real userid becomes root and effective userid
>> becomes my user id) before issuing XOpenDisplay(). However, because of
>> thie problem with access() even this fails.

It could perhaps be argued that the access(2) call be removed, but xterm
demonstrates that it doesn't have to be a problem (when saved uids are
supported).  Here's what xterm does:

#ifdef HAS_SAVED_IDS_AND_SETEUID 
            uid_t euid = geteuid();
            gid_t egid = getegid();
            uid_t ruid = getuid();
            gid_t rgid = getgid();

            if (setegid(rgid) == -1)
                (void) fprintf(stderr, "setegid(%d): %s\n",
                               (int) rgid, strerror(errno));

            if (seteuid(ruid) == -1)
                (void) fprintf(stderr, "seteuid(%d): %s\n",
                               (int) ruid, strerror(errno));
#endif

    ...
    XtAppInitialize( ... );
    ...

#ifdef HAS_SAVED_IDS_AND_SETEUID 
            if (seteuid(euid) == -1)
                (void) fprintf(stderr, "seteuid(%d): %s\n", 
                               (int) euid, strerror(errno));
            
            if (setegid(egid) == -1)
                (void) fprintf(stderr, "setegid(%d): %s\n", 
                               (int) egid, strerror(errno));
#endif



BTW, the code for accessing the .Xauthority file is in libXau:
XauGetAuthByAddr() and XauGetBestAuthByAddr().

>I use the same (NFS) configuration.  xterm seems to handle it correctly.

Yep.

David


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990531154346.K24275>