Skip to content
  • Eric Paris's avatar
    security: shmem: implement kernel private shmem inodes · c7277090
    Eric Paris authored
    
    
    We have a problem where the big_key key storage implementation uses a
    shmem backed inode to hold the key contents.  Because of this detail of
    implementation LSM checks are being done between processes trying to
    read the keys and the tmpfs backed inode.  The LSM checks are already
    being handled on the key interface level and should not be enforced at
    the inode level (since the inode is an implementation detail, not a
    part of the security model)
    
    This patch implements a new function shmem_kernel_file_setup() which
    returns the equivalent to shmem_file_setup() only the underlying inode
    has S_PRIVATE set.  This means that all LSM checks for the inode in
    question are skipped.  It should only be used for kernel internal
    operations where the inode is not exposed to userspace without proper
    LSM checking.  It is possible that some other users of
    shmem_file_setup() should use the new interface, but this has not been
    explored.
    
    Reproducing this bug is a little bit difficult.  The steps I used on
    Fedora are:
    
     (1) Turn off selinux enforcing:
    
    	setenforce 0
    
     (2) Create a huge key
    
    	k=`dd if=/dev/zero bs=8192 count=1 | keyctl padd big_key test-key @s`
    
     (3) Access the key in another context:
    
    	runcon system_u:system_r:httpd_t:s0-s0:c0.c1023 keyctl print $k >/dev/null
    
     (4) Examine the audit logs:
    
    	ausearch -m AVC -i --subject httpd_t | audit2allow
    
    If the last command's output includes a line that looks like:
    
    	allow httpd_t user_tmpfs_t:file { open read };
    
    There was an inode check between httpd and the tmpfs filesystem.  With
    this patch no such denial will be seen.  (NOTE! you should clear your
    audit log if you have tested for this previously)
    
    (Please return you box to enforcing)
    
    Signed-off-by: default avatarEric Paris <eparis@redhat.com>
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    cc: Hugh Dickins <hughd@google.com>
    cc: linux-mm@kvack.org
    c7277090