Commit da2441fd authored by David Howells's avatar David Howells Committed by Al Viro

vfs: Add LSM hooks for the new mount API

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: default avatarDavid Howells <dhowells@redhat.com>
cc: linux-security-module@vger.kernel.org
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 31d921c7
...@@ -76,6 +76,17 @@ ...@@ -76,6 +76,17 @@
* changes on the process such as clearing out non-inheritable signal * changes on the process such as clearing out non-inheritable signal
* state. This is called immediately after commit_creds(). * 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. * Security hooks for filesystem operations.
* *
* @sb_alloc_security: * @sb_alloc_security:
...@@ -1459,6 +1470,8 @@ union security_list_options { ...@@ -1459,6 +1470,8 @@ union security_list_options {
void (*bprm_committing_creds)(struct linux_binprm *bprm); void (*bprm_committing_creds)(struct linux_binprm *bprm);
void (*bprm_committed_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); int (*sb_alloc_security)(struct super_block *sb);
void (*sb_free_security)(struct super_block *sb); void (*sb_free_security)(struct super_block *sb);
void (*sb_free_mnt_opts)(void *mnt_opts); void (*sb_free_mnt_opts)(void *mnt_opts);
...@@ -1800,6 +1813,7 @@ struct security_hook_heads { ...@@ -1800,6 +1813,7 @@ struct security_hook_heads {
struct hlist_head bprm_check_security; struct hlist_head bprm_check_security;
struct hlist_head bprm_committing_creds; struct hlist_head bprm_committing_creds;
struct hlist_head bprm_committed_creds; struct hlist_head bprm_committed_creds;
struct hlist_head fs_context_parse_param;
struct hlist_head sb_alloc_security; struct hlist_head sb_alloc_security;
struct hlist_head sb_free_security; struct hlist_head sb_free_security;
struct hlist_head sb_free_mnt_opts; struct hlist_head sb_free_mnt_opts;
......
...@@ -53,6 +53,9 @@ struct msg_msg; ...@@ -53,6 +53,9 @@ struct msg_msg;
struct xattr; struct xattr;
struct xfrm_sec_ctx; struct xfrm_sec_ctx;
struct mm_struct; struct mm_struct;
struct fs_context;
struct fs_parameter;
enum fs_value_type;
/* If capable should audit the security request */ /* If capable should audit the security request */
#define SECURITY_CAP_NOAUDIT 0 #define SECURITY_CAP_NOAUDIT 0
...@@ -220,6 +223,7 @@ int security_bprm_set_creds(struct linux_binprm *bprm); ...@@ -220,6 +223,7 @@ int security_bprm_set_creds(struct linux_binprm *bprm);
int security_bprm_check(struct linux_binprm *bprm); int security_bprm_check(struct linux_binprm *bprm);
void security_bprm_committing_creds(struct linux_binprm *bprm); void security_bprm_committing_creds(struct linux_binprm *bprm);
void security_bprm_committed_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); int security_sb_alloc(struct super_block *sb);
void security_sb_free(struct super_block *sb); void security_sb_free(struct super_block *sb);
void security_free_mnt_opts(void **mnt_opts); void security_free_mnt_opts(void **mnt_opts);
...@@ -517,6 +521,12 @@ static inline void security_bprm_committed_creds(struct linux_binprm *bprm) ...@@ -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) static inline int security_sb_alloc(struct super_block *sb)
{ {
return 0; return 0;
......
...@@ -374,6 +374,11 @@ void security_bprm_committed_creds(struct linux_binprm *bprm) ...@@ -374,6 +374,11 @@ void security_bprm_committed_creds(struct linux_binprm *bprm)
call_void_hook(bprm_committed_creds, 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) int security_sb_alloc(struct super_block *sb)
{ {
return call_int_hook(sb_alloc_security, 0, sb); return call_int_hook(sb_alloc_security, 0, sb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment