All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Smalley <sds@tycho.nsa.gov>
To: Stephen Smalley <stephen.smalley@gmail.com>,
	Hugh Dickins <hughd@google.com>
Cc: Prarit Bhargava <prarit@redhat.com>,
	Morten Stevens <mstevens@fedoraproject.org>,
	Eric Sandeen <esandeen@redhat.com>,
	Dave Chinner <david@fromorbit.com>,
	Daniel Wagner <wagi@monom.org>,
	Linux Kernel <linux-kernel@vger.kernel.org>,
	Eric Paris <eparis@redhat.com>,
	linux-mm@kvack.org, selinux <selinux@tycho.nsa.gov>,
	Andrew Morton <akpm@linux-foundation.org>,
	Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: mm: shmem_zero_setup skip security check and lockdep conflict with XFS
Date: Wed, 08 Jul 2015 12:37:22 -0400	[thread overview]
Message-ID: <559D51C2.7060603@tycho.nsa.gov> (raw)
In-Reply-To: <CAB9W1A2ekXaqHfcUxpmx_5rwxfP+wMHA17BdrA7f=Ey-rp0Lvw@mail.gmail.com>

On 07/08/2015 09:13 AM, Stephen Smalley wrote:
> On Sun, Jun 14, 2015 at 12:48 PM, Hugh Dickins <hughd@google.com> wrote:
>> It appears that, at some point last year, XFS made directory handling
>> changes which bring it into lockdep conflict with shmem_zero_setup():
>> it is surprising that mmap() can clone an inode while holding mmap_sem,
>> but that has been so for many years.
>>
>> Since those few lockdep traces that I've seen all implicated selinux,
>> I'm hoping that we can use the __shmem_file_setup(,,,S_PRIVATE) which
>> v3.13's commit c7277090927a ("security: shmem: implement kernel private
>> shmem inodes") introduced to avoid LSM checks on kernel-internal inodes:
>> the mmap("/dev/zero") cloned inode is indeed a kernel-internal detail.
>>
>> This also covers the !CONFIG_SHMEM use of ramfs to support /dev/zero
>> (and MAP_SHARED|MAP_ANONYMOUS).  I thought there were also drivers
>> which cloned inode in mmap(), but if so, I cannot locate them now.
> 
> This causes a regression for SELinux (please, in the future, cc
> selinux list and Paul Moore on SELinux-related changes).  In
> particular, this change disables SELinux checking of mprotect
> PROT_EXEC on shared anonymous mappings, so we lose the ability to
> control executable mappings.  That said, we are only getting that
> check today as a side effect of our file execute check on the tmpfs
> inode, whereas it would be better (and more consistent with the
> mmap-time checks) to apply an execmem check in that case, in which
> case we wouldn't care about the inode-based check.  However, I am
> unclear on how to correctly detect that situation from
> selinux_file_mprotect() -> file_map_prot_check(), because we do have a
> non-NULL vma->vm_file so we treat it as a file execute check.  In
> contrast, if directly creating an anonymous shared mapping with
> PROT_EXEC via mmap(...PROT_EXEC...),  selinux_mmap_file is called with
> a NULL file and therefore we end up applying an execmem check.

Also, can you provide the lockdep traces that motivated this change?

> 
>>
>> Reported-and-tested-by: Prarit Bhargava <prarit@redhat.com>
>> Reported-by: Daniel Wagner <wagi@monom.org>
>> Reported-by: Morten Stevens <mstevens@fedoraproject.org>
>> Signed-off-by: Hugh Dickins <hughd@google.com>
>> ---
>>
>>  mm/shmem.c |    8 +++++++-
>>  1 file changed, 7 insertions(+), 1 deletion(-)
>>
>> --- 4.1-rc7/mm/shmem.c  2015-04-26 19:16:31.352191298 -0700
>> +++ linux/mm/shmem.c    2015-06-14 09:26:49.461120166 -0700
>> @@ -3401,7 +3401,13 @@ int shmem_zero_setup(struct vm_area_stru
>>         struct file *file;
>>         loff_t size = vma->vm_end - vma->vm_start;
>>
>> -       file = shmem_file_setup("dev/zero", size, vma->vm_flags);
>> +       /*
>> +        * Cloning a new file under mmap_sem leads to a lock ordering conflict
>> +        * between XFS directory reading and selinux: since this file is only
>> +        * accessible to the user through its mapping, use S_PRIVATE flag to
>> +        * bypass file security, in the same way as shmem_kernel_file_setup().
>> +        */
>> +       file = __shmem_file_setup("dev/zero", size, vma->vm_flags, S_PRIVATE);
>>         if (IS_ERR(file))
>>                 return PTR_ERR(file);
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at  http://www.tux.org/lkml/
> _______________________________________________
> Selinux mailing list
> Selinux@tycho.nsa.gov
> To unsubscribe, send email to Selinux-leave@tycho.nsa.gov.
> To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov.
> 
> 

WARNING: multiple messages have this Message-ID (diff)
From: Stephen Smalley <sds@tycho.nsa.gov>
To: Stephen Smalley <stephen.smalley@gmail.com>,
	Hugh Dickins <hughd@google.com>
Cc: Prarit Bhargava <prarit@redhat.com>,
	Morten Stevens <mstevens@fedoraproject.org>,
	Eric Sandeen <esandeen@redhat.com>,
	Dave Chinner <david@fromorbit.com>,
	Daniel Wagner <wagi@monom.org>,
	Linux Kernel <linux-kernel@vger.kernel.org>,
	Eric Paris <eparis@redhat.com>,
	linux-mm@kvack.org, selinux <selinux@tycho.nsa.gov>,
	Andrew Morton <akpm@linux-foundation.org>,
	Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: mm: shmem_zero_setup skip security check and lockdep conflict with XFS
Date: Wed, 08 Jul 2015 12:37:22 -0400	[thread overview]
Message-ID: <559D51C2.7060603@tycho.nsa.gov> (raw)
In-Reply-To: <CAB9W1A2ekXaqHfcUxpmx_5rwxfP+wMHA17BdrA7f=Ey-rp0Lvw@mail.gmail.com>

On 07/08/2015 09:13 AM, Stephen Smalley wrote:
> On Sun, Jun 14, 2015 at 12:48 PM, Hugh Dickins <hughd@google.com> wrote:
>> It appears that, at some point last year, XFS made directory handling
>> changes which bring it into lockdep conflict with shmem_zero_setup():
>> it is surprising that mmap() can clone an inode while holding mmap_sem,
>> but that has been so for many years.
>>
>> Since those few lockdep traces that I've seen all implicated selinux,
>> I'm hoping that we can use the __shmem_file_setup(,,,S_PRIVATE) which
>> v3.13's commit c7277090927a ("security: shmem: implement kernel private
>> shmem inodes") introduced to avoid LSM checks on kernel-internal inodes:
>> the mmap("/dev/zero") cloned inode is indeed a kernel-internal detail.
>>
>> This also covers the !CONFIG_SHMEM use of ramfs to support /dev/zero
>> (and MAP_SHARED|MAP_ANONYMOUS).  I thought there were also drivers
>> which cloned inode in mmap(), but if so, I cannot locate them now.
> 
> This causes a regression for SELinux (please, in the future, cc
> selinux list and Paul Moore on SELinux-related changes).  In
> particular, this change disables SELinux checking of mprotect
> PROT_EXEC on shared anonymous mappings, so we lose the ability to
> control executable mappings.  That said, we are only getting that
> check today as a side effect of our file execute check on the tmpfs
> inode, whereas it would be better (and more consistent with the
> mmap-time checks) to apply an execmem check in that case, in which
> case we wouldn't care about the inode-based check.  However, I am
> unclear on how to correctly detect that situation from
> selinux_file_mprotect() -> file_map_prot_check(), because we do have a
> non-NULL vma->vm_file so we treat it as a file execute check.  In
> contrast, if directly creating an anonymous shared mapping with
> PROT_EXEC via mmap(...PROT_EXEC...),  selinux_mmap_file is called with
> a NULL file and therefore we end up applying an execmem check.

Also, can you provide the lockdep traces that motivated this change?

> 
>>
>> Reported-and-tested-by: Prarit Bhargava <prarit@redhat.com>
>> Reported-by: Daniel Wagner <wagi@monom.org>
>> Reported-by: Morten Stevens <mstevens@fedoraproject.org>
>> Signed-off-by: Hugh Dickins <hughd@google.com>
>> ---
>>
>>  mm/shmem.c |    8 +++++++-
>>  1 file changed, 7 insertions(+), 1 deletion(-)
>>
>> --- 4.1-rc7/mm/shmem.c  2015-04-26 19:16:31.352191298 -0700
>> +++ linux/mm/shmem.c    2015-06-14 09:26:49.461120166 -0700
>> @@ -3401,7 +3401,13 @@ int shmem_zero_setup(struct vm_area_stru
>>         struct file *file;
>>         loff_t size = vma->vm_end - vma->vm_start;
>>
>> -       file = shmem_file_setup("dev/zero", size, vma->vm_flags);
>> +       /*
>> +        * Cloning a new file under mmap_sem leads to a lock ordering conflict
>> +        * between XFS directory reading and selinux: since this file is only
>> +        * accessible to the user through its mapping, use S_PRIVATE flag to
>> +        * bypass file security, in the same way as shmem_kernel_file_setup().
>> +        */
>> +       file = __shmem_file_setup("dev/zero", size, vma->vm_flags, S_PRIVATE);
>>         if (IS_ERR(file))
>>                 return PTR_ERR(file);
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at  http://www.tux.org/lkml/
> _______________________________________________
> Selinux mailing list
> Selinux@tycho.nsa.gov
> To unsubscribe, send email to Selinux-leave@tycho.nsa.gov.
> To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov.
> 
> 

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2015-07-08 16:37 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-14 16:48 mm: shmem_zero_setup skip security check and lockdep conflict with XFS Hugh Dickins
2015-06-14 16:48 ` Hugh Dickins
2015-06-15  6:09 ` Daniel Wagner
2015-06-15  6:09   ` Daniel Wagner
2015-06-16 20:27   ` Hugh Dickins
2015-06-16 20:27     ` Hugh Dickins
2015-06-17 11:45   ` Morten Stevens
2015-06-17 11:45     ` Morten Stevens
2015-06-18  0:22     ` Hugh Dickins
2015-06-18  0:22       ` Hugh Dickins
2015-07-22 12:46     ` Morten Stevens
2015-07-22 12:46       ` Morten Stevens
2015-07-22 21:07       ` Stephen Smalley
2015-07-22 21:07         ` Stephen Smalley
2015-07-08 13:13 ` Stephen Smalley
2015-07-08 13:13   ` Stephen Smalley
2015-07-08 13:13   ` Stephen Smalley
2015-07-08 16:37   ` Stephen Smalley [this message]
2015-07-08 16:37     ` Stephen Smalley
2015-07-08 20:37     ` Morten Stevens
2015-07-08 20:37       ` Morten Stevens
2015-07-08 20:37       ` Morten Stevens
2015-07-09  8:23     ` Hugh Dickins
2015-07-09  8:23       ` Hugh Dickins
2015-07-09  8:23       ` Hugh Dickins
2015-07-09 12:59       ` Stephen Smalley
2015-07-09 12:59         ` Stephen Smalley
2015-07-09 12:59         ` Stephen Smalley
2015-07-10  7:48         ` Hugh Dickins
2015-07-10  7:48           ` Hugh Dickins
2015-07-10  7:48           ` Hugh Dickins
2015-07-10 13:09           ` Stephen Smalley
2015-07-10 13:09             ` Stephen Smalley
2015-07-10 13:09             ` Stephen Smalley

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=559D51C2.7060603@tycho.nsa.gov \
    --to=sds@tycho.nsa.gov \
    --cc=akpm@linux-foundation.org \
    --cc=david@fromorbit.com \
    --cc=eparis@redhat.com \
    --cc=esandeen@redhat.com \
    --cc=hughd@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mstevens@fedoraproject.org \
    --cc=prarit@redhat.com \
    --cc=selinux@tycho.nsa.gov \
    --cc=stephen.smalley@gmail.com \
    --cc=torvalds@linux-foundation.org \
    --cc=wagi@monom.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.