aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/security.h
diff options
context:
space:
mode:
authorKees Cook <keescook@chromium.org>2014-02-25 13:28:04 -0500
committerKees Cook <keescook@chromium.org>2014-07-25 14:47:45 -0400
commit13752fe2d7f2d41c2fd92a5d1b1c6e38c4de0c05 (patch)
treeee922f8fbd1dd96c0aee0fd6274d94271f55217c /include/linux/security.h
parent7d8b6c63751cfbbe5eef81a48c22978b3407a3ad (diff)
security: introduce kernel_fw_from_file hook
In order to validate the contents of firmware being loaded, there must be a hook to evaluate any loaded firmware that wasn't built into the kernel itself. Without this, there is a risk that a root user could load malicious firmware designed to mount an attack against kernel memory (e.g. via DMA). Signed-off-by: Kees Cook <keescook@chromium.org> Reviewed-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'include/linux/security.h')
-rw-r--r--include/linux/security.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/include/linux/security.h b/include/linux/security.h
index 59820f8782a1..0ae4b147718a 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -702,6 +702,15 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
702 * @inode points to the inode to use as a reference. 702 * @inode points to the inode to use as a reference.
703 * The current task must be the one that nominated @inode. 703 * The current task must be the one that nominated @inode.
704 * Return 0 if successful. 704 * Return 0 if successful.
705 * @kernel_fw_from_file:
706 * Load firmware from userspace (not called for built-in firmware).
707 * @file contains the file structure pointing to the file containing
708 * the firmware to load. This argument will be NULL if the firmware
709 * was loaded via the uevent-triggered blob-based interface exposed
710 * by CONFIG_FW_LOADER_USER_HELPER.
711 * @buf pointer to buffer containing firmware contents.
712 * @size length of the firmware contents.
713 * Return 0 if permission is granted.
705 * @kernel_module_request: 714 * @kernel_module_request:
706 * Ability to trigger the kernel to automatically upcall to userspace for 715 * Ability to trigger the kernel to automatically upcall to userspace for
707 * userspace to load a kernel module with the given name. 716 * userspace to load a kernel module with the given name.
@@ -1568,6 +1577,7 @@ struct security_operations {
1568 void (*cred_transfer)(struct cred *new, const struct cred *old); 1577 void (*cred_transfer)(struct cred *new, const struct cred *old);
1569 int (*kernel_act_as)(struct cred *new, u32 secid); 1578 int (*kernel_act_as)(struct cred *new, u32 secid);
1570 int (*kernel_create_files_as)(struct cred *new, struct inode *inode); 1579 int (*kernel_create_files_as)(struct cred *new, struct inode *inode);
1580 int (*kernel_fw_from_file)(struct file *file, char *buf, size_t size);
1571 int (*kernel_module_request)(char *kmod_name); 1581 int (*kernel_module_request)(char *kmod_name);
1572 int (*kernel_module_from_file)(struct file *file); 1582 int (*kernel_module_from_file)(struct file *file);
1573 int (*task_fix_setuid) (struct cred *new, const struct cred *old, 1583 int (*task_fix_setuid) (struct cred *new, const struct cred *old,
@@ -1840,6 +1850,7 @@ int security_prepare_creds(struct cred *new, const struct cred *old, gfp_t gfp);
1840void security_transfer_creds(struct cred *new, const struct cred *old); 1850void security_transfer_creds(struct cred *new, const struct cred *old);
1841int security_kernel_act_as(struct cred *new, u32 secid); 1851int security_kernel_act_as(struct cred *new, u32 secid);
1842int security_kernel_create_files_as(struct cred *new, struct inode *inode); 1852int security_kernel_create_files_as(struct cred *new, struct inode *inode);
1853int security_kernel_fw_from_file(struct file *file, char *buf, size_t size);
1843int security_kernel_module_request(char *kmod_name); 1854int security_kernel_module_request(char *kmod_name);
1844int security_kernel_module_from_file(struct file *file); 1855int security_kernel_module_from_file(struct file *file);
1845int security_task_fix_setuid(struct cred *new, const struct cred *old, 1856int security_task_fix_setuid(struct cred *new, const struct cred *old,
@@ -2366,6 +2377,12 @@ static inline int security_kernel_create_files_as(struct cred *cred,
2366 return 0; 2377 return 0;
2367} 2378}
2368 2379
2380static inline int security_kernel_fw_from_file(struct file *file,
2381 char *buf, size_t size)
2382{
2383 return 0;
2384}
2385
2369static inline int security_kernel_module_request(char *kmod_name) 2386static inline int security_kernel_module_request(char *kmod_name)
2370{ 2387{
2371 return 0; 2388 return 0;