Subject: Re: mmap(), security and /dev/zero
To: Bill Studenmund <wrstuden@NetBSD.org>
From: Andrew Brown <atatat@atatdot.net>
List: tech-kern
Date: 06/25/2004 08:41:31
On Thu, Jun 24, 2004 at 12:19:51PM -0700, Bill Studenmund wrote:
>On Thu, Jun 24, 2004 at 10:58:54AM +0200, Alan Barrett wrote:
>> How does the following compromise sound?
>> 
>>         shlibs must be in files that have "r" permission.
>>         shlibs must be on file systems that honour "x" permission
>>                 (that is, were not mounted with the noexec option).
>
>I think that sounds quite reasonable. And I don't think it'd be too hard 
>to implement.

i think this is the already case, given:

    (1) you must be able to read a file to open it, which you must do
        in order to mmap it

    (2) this code from src/sys/uvm:uvm_mmap()

                /*
                 * Don't allow mmap for EXEC if the file system
                 * is mounted NOEXEC.
                 */
                if ((prot & PROT_EXEC) != 0 &&
                    (vp->v_mount->mnt_flag & MNT_NOEXEC) != 0)
                        return (EACCES);

    (3) this code from src/sys/uvm/uvm_map.c:uvm_map_protect()

                /*
                 * Don't allow VM_PROT_EXECUTE to be set on entries that
                 * point to vnodes that are associated with a NOEXEC file
                 * system.
                 */
                if (UVM_ET_ISOBJ(current) &&
                    UVM_OBJ_IS_VNODE(current->object.uvm_obj)) {
                        struct vnode *vp =
                            (struct vnode *) current->object.uvm_obj;

                        if ((new_prot & VM_PROT_EXECUTE) != 0 &&
                            (vp->v_mount->mnt_flag & MNT_NOEXEC) != 0) {
                                error = EACCES;
                                goto out;
                        }
                }

the only thing that's *not* covered, afaict, is filesystems that get
remounted (ie, mount -u) with/without noexec.  the transition between
those two states doesn't affect anything that's already got executable
mappings.

-- 
|-----< "CODE WARRIOR" >-----|
codewarrior@daemon.org             * "ah!  i see you have the internet
twofsonet@graffiti.com (Andrew Brown)                that goes *ping*!"
werdna@squooshy.com       * "information is power -- share the wealth."