Merge tag 'selinux-pr-20190917' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux
Pull selinux updates from Paul Moore: - Add LSM hooks, and SELinux access control hooks, for dnotify, fanotify, and inotify watches. This has been discussed with both the LSM and fs/notify folks and everybody is good with these new hooks. - The LSM stacking changes missed a few calls to current_security() in the SELinux code; we fix those and remove current_security() for good. - Improve our network object labeling cache so that we always return the object's label, even when under memory pressure. Previously we would return an error if we couldn't allocate a new cache entry, now we always return the label even if we can't create a new cache entry for it. - Convert the sidtab atomic_t counter to a normal u32 with READ/WRITE_ONCE() and memory barrier protection. - A few patches to policydb.c to clean things up (remove forward declarations, long lines, bad variable names, etc) * tag 'selinux-pr-20190917' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux: lsm: remove current_security() selinux: fix residual uses of current_security() for the SELinux blob selinux: avoid atomic_t usage in sidtab fanotify, inotify, dnotify, security: add security hook for fs notifications selinux: always return a secid from the network caches if we find one selinux: policydb - rename type_val_to_struct_array selinux: policydb - fix some checkpatch.pl warnings selinux: shuffle around policydb.c to get rid of forward declarations
This commit is contained in:
@@ -89,6 +89,8 @@
|
||||
#include <linux/kernfs.h>
|
||||
#include <linux/stringhash.h> /* for hashlen_string() */
|
||||
#include <uapi/linux/mount.h>
|
||||
#include <linux/fsnotify.h>
|
||||
#include <linux/fanotify.h>
|
||||
|
||||
#include "avc.h"
|
||||
#include "objsec.h"
|
||||
@@ -3275,6 +3277,50 @@ static int selinux_inode_removexattr(struct dentry *dentry, const char *name)
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
static int selinux_path_notify(const struct path *path, u64 mask,
|
||||
unsigned int obj_type)
|
||||
{
|
||||
int ret;
|
||||
u32 perm;
|
||||
|
||||
struct common_audit_data ad;
|
||||
|
||||
ad.type = LSM_AUDIT_DATA_PATH;
|
||||
ad.u.path = *path;
|
||||
|
||||
/*
|
||||
* Set permission needed based on the type of mark being set.
|
||||
* Performs an additional check for sb watches.
|
||||
*/
|
||||
switch (obj_type) {
|
||||
case FSNOTIFY_OBJ_TYPE_VFSMOUNT:
|
||||
perm = FILE__WATCH_MOUNT;
|
||||
break;
|
||||
case FSNOTIFY_OBJ_TYPE_SB:
|
||||
perm = FILE__WATCH_SB;
|
||||
ret = superblock_has_perm(current_cred(), path->dentry->d_sb,
|
||||
FILESYSTEM__WATCH, &ad);
|
||||
if (ret)
|
||||
return ret;
|
||||
break;
|
||||
case FSNOTIFY_OBJ_TYPE_INODE:
|
||||
perm = FILE__WATCH;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* blocking watches require the file:watch_with_perm permission */
|
||||
if (mask & (ALL_FSNOTIFY_PERM_EVENTS))
|
||||
perm |= FILE__WATCH_WITH_PERM;
|
||||
|
||||
/* watches on read-like events need the file:watch_reads permission */
|
||||
if (mask & (FS_ACCESS | FS_ACCESS_PERM | FS_CLOSE_NOWRITE))
|
||||
perm |= FILE__WATCH_READS;
|
||||
|
||||
return path_has_perm(current_cred(), path, perm);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the inode security context value to the user.
|
||||
*
|
||||
@@ -3403,7 +3449,7 @@ static int selinux_inode_copy_up_xattr(const char *name)
|
||||
static int selinux_kernfs_init_security(struct kernfs_node *kn_dir,
|
||||
struct kernfs_node *kn)
|
||||
{
|
||||
const struct task_security_struct *tsec = current_security();
|
||||
const struct task_security_struct *tsec = selinux_cred(current_cred());
|
||||
u32 parent_sid, newsid, clen;
|
||||
int rc;
|
||||
char *context;
|
||||
@@ -6818,6 +6864,7 @@ static struct security_hook_list selinux_hooks[] __lsm_ro_after_init = {
|
||||
LSM_HOOK_INIT(inode_getsecid, selinux_inode_getsecid),
|
||||
LSM_HOOK_INIT(inode_copy_up, selinux_inode_copy_up),
|
||||
LSM_HOOK_INIT(inode_copy_up_xattr, selinux_inode_copy_up_xattr),
|
||||
LSM_HOOK_INIT(path_notify, selinux_path_notify),
|
||||
|
||||
LSM_HOOK_INIT(kernfs_init_security, selinux_kernfs_init_security),
|
||||
|
||||
|
Reference in New Issue
Block a user