diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-25 03:45:31 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-25 03:45:31 -0400 |
| commit | 36b8d186e6cc8e32cb5227f5645a58e1bc0af190 (patch) | |
| tree | 1000ad26e189e6ff2c53fb7eeff605f59c7ad94e /include | |
| parent | cd85b557414fe4cd44ea6608825e96612a5fe2b2 (diff) | |
| parent | c45ed235abf1b0b6666417e3c394f18717976acd (diff) | |
Merge branch 'next' of git://selinuxproject.org/~jmorris/linux-security
* 'next' of git://selinuxproject.org/~jmorris/linux-security: (95 commits)
TOMOYO: Fix incomplete read after seek.
Smack: allow to access /smack/access as normal user
TOMOYO: Fix unused kernel config option.
Smack: fix: invalid length set for the result of /smack/access
Smack: compilation fix
Smack: fix for /smack/access output, use string instead of byte
Smack: domain transition protections (v3)
Smack: Provide information for UDS getsockopt(SO_PEERCRED)
Smack: Clean up comments
Smack: Repair processing of fcntl
Smack: Rule list lookup performance
Smack: check permissions from user space (v2)
TOMOYO: Fix quota and garbage collector.
TOMOYO: Remove redundant tasklist_lock.
TOMOYO: Fix domain transition failure warning.
TOMOYO: Remove tomoyo_policy_memory_lock spinlock.
TOMOYO: Simplify garbage collector.
TOMOYO: Fix make namespacecheck warnings.
target: check hex2bin result
encrypted-keys: check hex2bin result
...
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/evm.h | 100 | ||||
| -rw-r--r-- | include/linux/ima.h | 13 | ||||
| -rw-r--r-- | include/linux/integrity.h | 39 | ||||
| -rw-r--r-- | include/linux/kernel.h | 2 | ||||
| -rw-r--r-- | include/linux/security.h | 32 | ||||
| -rw-r--r-- | include/linux/xattr.h | 19 |
6 files changed, 183 insertions, 22 deletions
diff --git a/include/linux/evm.h b/include/linux/evm.h new file mode 100644 index 000000000000..9fc13a760928 --- /dev/null +++ b/include/linux/evm.h | |||
| @@ -0,0 +1,100 @@ | |||
| 1 | /* | ||
| 2 | * evm.h | ||
| 3 | * | ||
| 4 | * Copyright (c) 2009 IBM Corporation | ||
| 5 | * Author: Mimi Zohar <zohar@us.ibm.com> | ||
| 6 | */ | ||
| 7 | |||
| 8 | #ifndef _LINUX_EVM_H | ||
| 9 | #define _LINUX_EVM_H | ||
| 10 | |||
| 11 | #include <linux/integrity.h> | ||
| 12 | #include <linux/xattr.h> | ||
| 13 | |||
| 14 | struct integrity_iint_cache; | ||
| 15 | |||
| 16 | #ifdef CONFIG_EVM | ||
| 17 | extern enum integrity_status evm_verifyxattr(struct dentry *dentry, | ||
| 18 | const char *xattr_name, | ||
| 19 | void *xattr_value, | ||
| 20 | size_t xattr_value_len, | ||
| 21 | struct integrity_iint_cache *iint); | ||
| 22 | extern int evm_inode_setattr(struct dentry *dentry, struct iattr *attr); | ||
| 23 | extern void evm_inode_post_setattr(struct dentry *dentry, int ia_valid); | ||
| 24 | extern int evm_inode_setxattr(struct dentry *dentry, const char *name, | ||
| 25 | const void *value, size_t size); | ||
| 26 | extern void evm_inode_post_setxattr(struct dentry *dentry, | ||
| 27 | const char *xattr_name, | ||
| 28 | const void *xattr_value, | ||
| 29 | size_t xattr_value_len); | ||
| 30 | extern int evm_inode_removexattr(struct dentry *dentry, const char *xattr_name); | ||
| 31 | extern void evm_inode_post_removexattr(struct dentry *dentry, | ||
| 32 | const char *xattr_name); | ||
| 33 | extern int evm_inode_init_security(struct inode *inode, | ||
| 34 | const struct xattr *xattr_array, | ||
| 35 | struct xattr *evm); | ||
| 36 | #ifdef CONFIG_FS_POSIX_ACL | ||
| 37 | extern int posix_xattr_acl(const char *xattrname); | ||
| 38 | #else | ||
| 39 | static inline int posix_xattr_acl(const char *xattrname) | ||
| 40 | { | ||
| 41 | return 0; | ||
| 42 | } | ||
| 43 | #endif | ||
| 44 | #else | ||
| 45 | #ifdef CONFIG_INTEGRITY | ||
| 46 | static inline enum integrity_status evm_verifyxattr(struct dentry *dentry, | ||
| 47 | const char *xattr_name, | ||
| 48 | void *xattr_value, | ||
| 49 | size_t xattr_value_len, | ||
| 50 | struct integrity_iint_cache *iint) | ||
| 51 | { | ||
| 52 | return INTEGRITY_UNKNOWN; | ||
| 53 | } | ||
| 54 | #endif | ||
| 55 | |||
| 56 | static inline int evm_inode_setattr(struct dentry *dentry, struct iattr *attr) | ||
| 57 | { | ||
| 58 | return 0; | ||
| 59 | } | ||
| 60 | |||
| 61 | static inline void evm_inode_post_setattr(struct dentry *dentry, int ia_valid) | ||
| 62 | { | ||
| 63 | return; | ||
| 64 | } | ||
| 65 | |||
| 66 | static inline int evm_inode_setxattr(struct dentry *dentry, const char *name, | ||
| 67 | const void *value, size_t size) | ||
| 68 | { | ||
| 69 | return 0; | ||
| 70 | } | ||
| 71 | |||
| 72 | static inline void evm_inode_post_setxattr(struct dentry *dentry, | ||
| 73 | const char *xattr_name, | ||
| 74 | const void *xattr_value, | ||
| 75 | size_t xattr_value_len) | ||
| 76 | { | ||
| 77 | return; | ||
| 78 | } | ||
| 79 | |||
| 80 | static inline int evm_inode_removexattr(struct dentry *dentry, | ||
| 81 | const char *xattr_name) | ||
| 82 | { | ||
| 83 | return 0; | ||
| 84 | } | ||
| 85 | |||
| 86 | static inline void evm_inode_post_removexattr(struct dentry *dentry, | ||
| 87 | const char *xattr_name) | ||
| 88 | { | ||
| 89 | return; | ||
| 90 | } | ||
| 91 | |||
| 92 | static inline int evm_inode_init_security(struct inode *inode, | ||
| 93 | const struct xattr *xattr_array, | ||
| 94 | struct xattr *evm) | ||
| 95 | { | ||
| 96 | return 0; | ||
| 97 | } | ||
| 98 | |||
| 99 | #endif /* CONFIG_EVM_H */ | ||
| 100 | #endif /* LINUX_EVM_H */ | ||
diff --git a/include/linux/ima.h b/include/linux/ima.h index 09e6e62f9953..6ac8e50c6cf5 100644 --- a/include/linux/ima.h +++ b/include/linux/ima.h | |||
| @@ -15,8 +15,6 @@ struct linux_binprm; | |||
| 15 | 15 | ||
| 16 | #ifdef CONFIG_IMA | 16 | #ifdef CONFIG_IMA |
| 17 | extern int ima_bprm_check(struct linux_binprm *bprm); | 17 | extern int ima_bprm_check(struct linux_binprm *bprm); |
| 18 | extern int ima_inode_alloc(struct inode *inode); | ||
| 19 | extern void ima_inode_free(struct inode *inode); | ||
| 20 | extern int ima_file_check(struct file *file, int mask); | 18 | extern int ima_file_check(struct file *file, int mask); |
| 21 | extern void ima_file_free(struct file *file); | 19 | extern void ima_file_free(struct file *file); |
| 22 | extern int ima_file_mmap(struct file *file, unsigned long prot); | 20 | extern int ima_file_mmap(struct file *file, unsigned long prot); |
| @@ -27,16 +25,6 @@ static inline int ima_bprm_check(struct linux_binprm *bprm) | |||
| 27 | return 0; | 25 | return 0; |
| 28 | } | 26 | } |
| 29 | 27 | ||
| 30 | static inline int ima_inode_alloc(struct inode *inode) | ||
| 31 | { | ||
| 32 | return 0; | ||
| 33 | } | ||
| 34 | |||
| 35 | static inline void ima_inode_free(struct inode *inode) | ||
| 36 | { | ||
| 37 | return; | ||
| 38 | } | ||
| 39 | |||
| 40 | static inline int ima_file_check(struct file *file, int mask) | 28 | static inline int ima_file_check(struct file *file, int mask) |
| 41 | { | 29 | { |
| 42 | return 0; | 30 | return 0; |
| @@ -51,6 +39,5 @@ static inline int ima_file_mmap(struct file *file, unsigned long prot) | |||
| 51 | { | 39 | { |
| 52 | return 0; | 40 | return 0; |
| 53 | } | 41 | } |
| 54 | |||
| 55 | #endif /* CONFIG_IMA_H */ | 42 | #endif /* CONFIG_IMA_H */ |
| 56 | #endif /* _LINUX_IMA_H */ | 43 | #endif /* _LINUX_IMA_H */ |
diff --git a/include/linux/integrity.h b/include/linux/integrity.h new file mode 100644 index 000000000000..a0c41256cb92 --- /dev/null +++ b/include/linux/integrity.h | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2009 IBM Corporation | ||
| 3 | * Author: Mimi Zohar <zohar@us.ibm.com> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation, version 2 of the License. | ||
| 8 | */ | ||
| 9 | |||
| 10 | #ifndef _LINUX_INTEGRITY_H | ||
| 11 | #define _LINUX_INTEGRITY_H | ||
| 12 | |||
| 13 | #include <linux/fs.h> | ||
| 14 | |||
| 15 | enum integrity_status { | ||
| 16 | INTEGRITY_PASS = 0, | ||
| 17 | INTEGRITY_FAIL, | ||
| 18 | INTEGRITY_NOLABEL, | ||
| 19 | INTEGRITY_NOXATTRS, | ||
| 20 | INTEGRITY_UNKNOWN, | ||
| 21 | }; | ||
| 22 | |||
| 23 | /* List of EVM protected security xattrs */ | ||
| 24 | #ifdef CONFIG_INTEGRITY | ||
| 25 | extern int integrity_inode_alloc(struct inode *inode); | ||
| 26 | extern void integrity_inode_free(struct inode *inode); | ||
| 27 | |||
| 28 | #else | ||
| 29 | static inline int integrity_inode_alloc(struct inode *inode) | ||
| 30 | { | ||
| 31 | return 0; | ||
| 32 | } | ||
| 33 | |||
| 34 | static inline void integrity_inode_free(struct inode *inode) | ||
| 35 | { | ||
| 36 | return; | ||
| 37 | } | ||
| 38 | #endif /* CONFIG_INTEGRITY_H */ | ||
| 39 | #endif /* _LINUX_INTEGRITY_H */ | ||
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 46ac9a50528d..8eefcf7e95eb 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -382,7 +382,7 @@ static inline char *pack_hex_byte(char *buf, u8 byte) | |||
| 382 | } | 382 | } |
| 383 | 383 | ||
| 384 | extern int hex_to_bin(char ch); | 384 | extern int hex_to_bin(char ch); |
| 385 | extern void hex2bin(u8 *dst, const char *src, size_t count); | 385 | extern int __must_check hex2bin(u8 *dst, const char *src, size_t count); |
| 386 | 386 | ||
| 387 | /* | 387 | /* |
| 388 | * General tracing related utility functions - trace_printk(), | 388 | * General tracing related utility functions - trace_printk(), |
diff --git a/include/linux/security.h b/include/linux/security.h index ebd2a53a3d07..19d8e04e1688 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/key.h> | 36 | #include <linux/key.h> |
| 37 | #include <linux/xfrm.h> | 37 | #include <linux/xfrm.h> |
| 38 | #include <linux/slab.h> | 38 | #include <linux/slab.h> |
| 39 | #include <linux/xattr.h> | ||
| 39 | #include <net/flow.h> | 40 | #include <net/flow.h> |
| 40 | 41 | ||
| 41 | /* Maximum number of letters for an LSM name string */ | 42 | /* Maximum number of letters for an LSM name string */ |
| @@ -147,6 +148,10 @@ extern int mmap_min_addr_handler(struct ctl_table *table, int write, | |||
| 147 | void __user *buffer, size_t *lenp, loff_t *ppos); | 148 | void __user *buffer, size_t *lenp, loff_t *ppos); |
| 148 | #endif | 149 | #endif |
| 149 | 150 | ||
| 151 | /* security_inode_init_security callback function to write xattrs */ | ||
| 152 | typedef int (*initxattrs) (struct inode *inode, | ||
| 153 | const struct xattr *xattr_array, void *fs_data); | ||
| 154 | |||
| 150 | #ifdef CONFIG_SECURITY | 155 | #ifdef CONFIG_SECURITY |
| 151 | 156 | ||
| 152 | struct security_mnt_opts { | 157 | struct security_mnt_opts { |
| @@ -1367,7 +1372,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
| 1367 | * @inode_getsecctx: | 1372 | * @inode_getsecctx: |
| 1368 | * Returns a string containing all relavent security context information | 1373 | * Returns a string containing all relavent security context information |
| 1369 | * | 1374 | * |
| 1370 | * @inode we wish to set the security context of. | 1375 | * @inode we wish to get the security context of. |
| 1371 | * @ctx is a pointer in which to place the allocated security context. | 1376 | * @ctx is a pointer in which to place the allocated security context. |
| 1372 | * @ctxlen points to the place to put the length of @ctx. | 1377 | * @ctxlen points to the place to put the length of @ctx. |
| 1373 | * This is the main security structure. | 1378 | * This is the main security structure. |
| @@ -1655,6 +1660,8 @@ struct security_operations { | |||
| 1655 | extern int security_init(void); | 1660 | extern int security_init(void); |
| 1656 | extern int security_module_enable(struct security_operations *ops); | 1661 | extern int security_module_enable(struct security_operations *ops); |
| 1657 | extern int register_security(struct security_operations *ops); | 1662 | extern int register_security(struct security_operations *ops); |
| 1663 | extern void __init security_fixup_ops(struct security_operations *ops); | ||
| 1664 | |||
| 1658 | 1665 | ||
| 1659 | /* Security operations */ | 1666 | /* Security operations */ |
| 1660 | int security_ptrace_access_check(struct task_struct *child, unsigned int mode); | 1667 | int security_ptrace_access_check(struct task_struct *child, unsigned int mode); |
| @@ -1704,8 +1711,11 @@ int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts); | |||
| 1704 | int security_inode_alloc(struct inode *inode); | 1711 | int security_inode_alloc(struct inode *inode); |
| 1705 | void security_inode_free(struct inode *inode); | 1712 | void security_inode_free(struct inode *inode); |
| 1706 | int security_inode_init_security(struct inode *inode, struct inode *dir, | 1713 | int security_inode_init_security(struct inode *inode, struct inode *dir, |
| 1707 | const struct qstr *qstr, char **name, | 1714 | const struct qstr *qstr, |
| 1708 | void **value, size_t *len); | 1715 | initxattrs initxattrs, void *fs_data); |
| 1716 | int security_old_inode_init_security(struct inode *inode, struct inode *dir, | ||
| 1717 | const struct qstr *qstr, char **name, | ||
| 1718 | void **value, size_t *len); | ||
| 1709 | int security_inode_create(struct inode *dir, struct dentry *dentry, int mode); | 1719 | int security_inode_create(struct inode *dir, struct dentry *dentry, int mode); |
| 1710 | int security_inode_link(struct dentry *old_dentry, struct inode *dir, | 1720 | int security_inode_link(struct dentry *old_dentry, struct inode *dir, |
| 1711 | struct dentry *new_dentry); | 1721 | struct dentry *new_dentry); |
| @@ -2034,11 +2044,19 @@ static inline void security_inode_free(struct inode *inode) | |||
| 2034 | static inline int security_inode_init_security(struct inode *inode, | 2044 | static inline int security_inode_init_security(struct inode *inode, |
| 2035 | struct inode *dir, | 2045 | struct inode *dir, |
| 2036 | const struct qstr *qstr, | 2046 | const struct qstr *qstr, |
| 2037 | char **name, | 2047 | initxattrs initxattrs, |
| 2038 | void **value, | 2048 | void *fs_data) |
| 2039 | size_t *len) | ||
| 2040 | { | 2049 | { |
| 2041 | return -EOPNOTSUPP; | 2050 | return 0; |
| 2051 | } | ||
| 2052 | |||
| 2053 | static inline int security_old_inode_init_security(struct inode *inode, | ||
| 2054 | struct inode *dir, | ||
| 2055 | const struct qstr *qstr, | ||
| 2056 | char **name, void **value, | ||
| 2057 | size_t *len) | ||
| 2058 | { | ||
| 2059 | return 0; | ||
| 2042 | } | 2060 | } |
| 2043 | 2061 | ||
| 2044 | static inline int security_inode_create(struct inode *dir, | 2062 | static inline int security_inode_create(struct inode *dir, |
diff --git a/include/linux/xattr.h b/include/linux/xattr.h index aed54c50aa66..e5d122031542 100644 --- a/include/linux/xattr.h +++ b/include/linux/xattr.h | |||
| @@ -30,6 +30,9 @@ | |||
| 30 | #define XATTR_USER_PREFIX_LEN (sizeof (XATTR_USER_PREFIX) - 1) | 30 | #define XATTR_USER_PREFIX_LEN (sizeof (XATTR_USER_PREFIX) - 1) |
| 31 | 31 | ||
| 32 | /* Security namespace */ | 32 | /* Security namespace */ |
| 33 | #define XATTR_EVM_SUFFIX "evm" | ||
| 34 | #define XATTR_NAME_EVM XATTR_SECURITY_PREFIX XATTR_EVM_SUFFIX | ||
| 35 | |||
| 33 | #define XATTR_SELINUX_SUFFIX "selinux" | 36 | #define XATTR_SELINUX_SUFFIX "selinux" |
| 34 | #define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX | 37 | #define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX |
| 35 | 38 | ||
| @@ -49,6 +52,11 @@ | |||
| 49 | #define XATTR_CAPS_SUFFIX "capability" | 52 | #define XATTR_CAPS_SUFFIX "capability" |
| 50 | #define XATTR_NAME_CAPS XATTR_SECURITY_PREFIX XATTR_CAPS_SUFFIX | 53 | #define XATTR_NAME_CAPS XATTR_SECURITY_PREFIX XATTR_CAPS_SUFFIX |
| 51 | 54 | ||
| 55 | #define XATTR_POSIX_ACL_ACCESS "posix_acl_access" | ||
| 56 | #define XATTR_NAME_POSIX_ACL_ACCESS XATTR_SYSTEM_PREFIX XATTR_POSIX_ACL_ACCESS | ||
| 57 | #define XATTR_POSIX_ACL_DEFAULT "posix_acl_default" | ||
| 58 | #define XATTR_NAME_POSIX_ACL_DEFAULT XATTR_SYSTEM_PREFIX XATTR_POSIX_ACL_DEFAULT | ||
| 59 | |||
| 52 | #ifdef __KERNEL__ | 60 | #ifdef __KERNEL__ |
| 53 | 61 | ||
| 54 | #include <linux/types.h> | 62 | #include <linux/types.h> |
| @@ -67,6 +75,12 @@ struct xattr_handler { | |||
| 67 | size_t size, int flags, int handler_flags); | 75 | size_t size, int flags, int handler_flags); |
| 68 | }; | 76 | }; |
| 69 | 77 | ||
| 78 | struct xattr { | ||
| 79 | char *name; | ||
| 80 | void *value; | ||
| 81 | size_t value_len; | ||
| 82 | }; | ||
| 83 | |||
| 70 | ssize_t xattr_getsecurity(struct inode *, const char *, void *, size_t); | 84 | ssize_t xattr_getsecurity(struct inode *, const char *, void *, size_t); |
| 71 | ssize_t vfs_getxattr(struct dentry *, const char *, void *, size_t); | 85 | ssize_t vfs_getxattr(struct dentry *, const char *, void *, size_t); |
| 72 | ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size); | 86 | ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size); |
| @@ -78,7 +92,10 @@ ssize_t generic_getxattr(struct dentry *dentry, const char *name, void *buffer, | |||
| 78 | ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size); | 92 | ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size); |
| 79 | int generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags); | 93 | int generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags); |
| 80 | int generic_removexattr(struct dentry *dentry, const char *name); | 94 | int generic_removexattr(struct dentry *dentry, const char *name); |
| 81 | 95 | ssize_t vfs_getxattr_alloc(struct dentry *dentry, const char *name, | |
| 96 | char **xattr_value, size_t size, gfp_t flags); | ||
| 97 | int vfs_xattr_cmp(struct dentry *dentry, const char *xattr_name, | ||
| 98 | const char *value, size_t size, gfp_t flags); | ||
| 82 | #endif /* __KERNEL__ */ | 99 | #endif /* __KERNEL__ */ |
| 83 | 100 | ||
| 84 | #endif /* _LINUX_XATTR_H */ | 101 | #endif /* _LINUX_XATTR_H */ |
