diff options
Diffstat (limited to 'include/linux/security.h')
| -rw-r--r-- | include/linux/security.h | 69 | 
1 files changed, 67 insertions, 2 deletions
diff --git a/include/linux/security.h b/include/linux/security.h index 5f7441abbf42..a8d59d612d27 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -77,6 +77,54 @@ enum lsm_event {  	LSM_POLICY_CHANGE,  }; +/* + * These are reasons that can be passed to the security_locked_down() + * LSM hook. Lockdown reasons that protect kernel integrity (ie, the + * ability for userland to modify kernel code) are placed before + * LOCKDOWN_INTEGRITY_MAX.  Lockdown reasons that protect kernel + * confidentiality (ie, the ability for userland to extract + * information from the running kernel that would otherwise be + * restricted) are placed before LOCKDOWN_CONFIDENTIALITY_MAX. + * + * LSM authors should note that the semantics of any given lockdown + * reason are not guaranteed to be stable - the same reason may block + * one set of features in one kernel release, and a slightly different + * set of features in a later kernel release. LSMs that seek to expose + * lockdown policy at any level of granularity other than "none", + * "integrity" or "confidentiality" are responsible for either + * ensuring that they expose a consistent level of functionality to + * userland, or ensuring that userland is aware that this is + * potentially a moving target. It is easy to misuse this information + * in a way that could break userspace. Please be careful not to do + * so. + * + * If you add to this, remember to extend lockdown_reasons in + * security/lockdown/lockdown.c. + */ +enum lockdown_reason { +	LOCKDOWN_NONE, +	LOCKDOWN_MODULE_SIGNATURE, +	LOCKDOWN_DEV_MEM, +	LOCKDOWN_KEXEC, +	LOCKDOWN_HIBERNATION, +	LOCKDOWN_PCI_ACCESS, +	LOCKDOWN_IOPORT, +	LOCKDOWN_MSR, +	LOCKDOWN_ACPI_TABLES, +	LOCKDOWN_PCMCIA_CIS, +	LOCKDOWN_TIOCSSERIAL, +	LOCKDOWN_MODULE_PARAMETERS, +	LOCKDOWN_MMIOTRACE, +	LOCKDOWN_DEBUGFS, +	LOCKDOWN_INTEGRITY_MAX, +	LOCKDOWN_KCORE, +	LOCKDOWN_KPROBES, +	LOCKDOWN_BPF_READ, +	LOCKDOWN_PERF, +	LOCKDOWN_TRACEFS, +	LOCKDOWN_CONFIDENTIALITY_MAX, +}; +  /* These functions are in security/commoncap.c */  extern int cap_capable(const struct cred *cred, struct user_namespace *ns,  		       int cap, unsigned int opts); @@ -195,6 +243,7 @@ int unregister_blocking_lsm_notifier(struct notifier_block *nb);  /* prototypes */  extern int security_init(void); +extern int early_security_init(void);  /* Security operations */  int security_binder_set_context_mgr(struct task_struct *mgr); @@ -259,7 +308,8 @@ int security_dentry_create_files_as(struct dentry *dentry, int mode,  					struct qstr *name,  					const struct cred *old,  					struct cred *new); - +int security_path_notify(const struct path *path, u64 mask, +					unsigned int obj_type);  int security_inode_alloc(struct inode *inode);  void security_inode_free(struct inode *inode);  int security_inode_init_security(struct inode *inode, struct inode *dir, @@ -387,11 +437,11 @@ int security_ismaclabel(const char *name);  int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen);  int security_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid);  void security_release_secctx(char *secdata, u32 seclen); -  void security_inode_invalidate_secctx(struct inode *inode);  int security_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen);  int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen);  int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen); +int security_locked_down(enum lockdown_reason what);  #else /* CONFIG_SECURITY */  static inline int call_blocking_lsm_notifier(enum lsm_event event, void *data) @@ -423,6 +473,11 @@ static inline int security_init(void)  	return 0;  } +static inline int early_security_init(void) +{ +	return 0; +} +  static inline int security_binder_set_context_mgr(struct task_struct *mgr)  {  	return 0; @@ -621,6 +676,12 @@ static inline int security_move_mount(const struct path *from_path,  	return 0;  } +static inline int security_path_notify(const struct path *path, u64 mask, +				unsigned int obj_type) +{ +	return 0; +} +  static inline int security_inode_alloc(struct inode *inode)  {  	return 0; @@ -1204,6 +1265,10 @@ static inline int security_inode_getsecctx(struct inode *inode, void **ctx, u32  {  	return -EOPNOTSUPP;  } +static inline int security_locked_down(enum lockdown_reason what) +{ +	return 0; +}  #endif	/* CONFIG_SECURITY */  #ifdef CONFIG_SECURITY_NETWORK  |