vfs: Add LSM hooks for the new mount API
authorDavid Howells <dhowells@redhat.com>
Thu, 1 Nov 2018 23:07:24 +0000 (23:07 +0000)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 28 Feb 2019 08:29:23 +0000 (03:29 -0500)
Add LSM hooks for use by the new mount API and filesystem context code.
This includes:

 (1) Hooks to handle allocation, duplication and freeing of the security
     record attached to a filesystem context.

 (2) A hook to snoop source specifications.  There may be multiple of these
     if the filesystem supports it.  They will to be local files/devices if
     fs_context::source_is_dev is true and will be something else, possibly
     remote server specifications, if false.

 (3) A hook to snoop superblock configuration options in key[=val] form.
     If the LSM decides it wants to handle it, it can suppress the option
     being passed to the filesystem.  Note that 'val' may include commas
     and binary data with the fsopen patch.

 (4) A hook to perform validation and allocation after the configuration
     has been done but before the superblock is allocated and set up.

 (5) A hook to transfer the security from the context to a newly created
     superblock.

 (6) A hook to rule on whether a path point can be used as a mountpoint.

These are intended to replace:

security_sb_copy_data
security_sb_kern_mount
security_sb_mount
security_sb_set_mnt_opts
security_sb_clone_mnt_opts
security_sb_parse_opts_str

[AV -- some of the methods being replaced are already gone, some of the
methods are not added for the lack of need]

Signed-off-by: David Howells <dhowells@redhat.com>
cc: linux-security-module@vger.kernel.org
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
include/linux/lsm_hooks.h
include/linux/security.h
security/security.c

index 9a0bdf91e6467bc1c4dae2629b9608a4047533ef..47ba4db4d8fbb557b3ea698627eb67ed2ce1c24c 100644 (file)
  *     changes on the process such as clearing out non-inheritable signal
  *     state.  This is called immediately after commit_creds().
  *
+ * Security hooks for mount using fs_context.
+ *     [See also Documentation/filesystems/mounting.txt]
+ *
+ * @fs_context_parse_param:
+ *     Userspace provided a parameter to configure a superblock.  The LSM may
+ *     reject it with an error and may use it for itself, in which case it
+ *     should return 0; otherwise it should return -ENOPARAM to pass it on to
+ *     the filesystem.
+ *     @fc indicates the filesystem context.
+ *     @param The parameter
+ *
  * Security hooks for filesystem operations.
  *
  * @sb_alloc_security:
@@ -1459,6 +1470,8 @@ union security_list_options {
        void (*bprm_committing_creds)(struct linux_binprm *bprm);
        void (*bprm_committed_creds)(struct linux_binprm *bprm);
 
+       int (*fs_context_parse_param)(struct fs_context *fc, struct fs_parameter *param);
+
        int (*sb_alloc_security)(struct super_block *sb);
        void (*sb_free_security)(struct super_block *sb);
        void (*sb_free_mnt_opts)(void *mnt_opts);
@@ -1800,6 +1813,7 @@ struct security_hook_heads {
        struct hlist_head bprm_check_security;
        struct hlist_head bprm_committing_creds;
        struct hlist_head bprm_committed_creds;
+       struct hlist_head fs_context_parse_param;
        struct hlist_head sb_alloc_security;
        struct hlist_head sb_free_security;
        struct hlist_head sb_free_mnt_opts;
index dbfb5a66babb5ae8ed99b7e13095fc085fba01c8..1cc4d7a3d6fa0dc5ed83c65c63f141763552a84d 100644 (file)
@@ -53,6 +53,9 @@ struct msg_msg;
 struct xattr;
 struct xfrm_sec_ctx;
 struct mm_struct;
+struct fs_context;
+struct fs_parameter;
+enum fs_value_type;
 
 /* If capable should audit the security request */
 #define SECURITY_CAP_NOAUDIT 0
@@ -220,6 +223,7 @@ int security_bprm_set_creds(struct linux_binprm *bprm);
 int security_bprm_check(struct linux_binprm *bprm);
 void security_bprm_committing_creds(struct linux_binprm *bprm);
 void security_bprm_committed_creds(struct linux_binprm *bprm);
+int security_fs_context_parse_param(struct fs_context *fc, struct fs_parameter *param);
 int security_sb_alloc(struct super_block *sb);
 void security_sb_free(struct super_block *sb);
 void security_free_mnt_opts(void **mnt_opts);
@@ -517,6 +521,12 @@ static inline void security_bprm_committed_creds(struct linux_binprm *bprm)
 {
 }
 
+static inline int security_fs_context_parse_param(struct fs_context *fc,
+                                                 struct fs_parameter *param)
+{
+       return -ENOPARAM;
+}
+
 static inline int security_sb_alloc(struct super_block *sb)
 {
        return 0;
index f1b8d2587639668a84cc3db1c73e71ee79f86134..e5519488327dccc136e19e2514ac25af6951f7e2 100644 (file)
@@ -374,6 +374,11 @@ void security_bprm_committed_creds(struct linux_binprm *bprm)
        call_void_hook(bprm_committed_creds, bprm);
 }
 
+int security_fs_context_parse_param(struct fs_context *fc, struct fs_parameter *param)
+{
+       return call_int_hook(fs_context_parse_param, -ENOPARAM, fc, param);
+}
+
 int security_sb_alloc(struct super_block *sb)
 {
        return call_int_hook(sb_alloc_security, 0, sb);