diff options
author | Chanho Park <chanho61.park@samsung.com> | 2014-06-03 19:54:53 +0900 |
---|---|---|
committer | Seung-Woo Kim <sw0312.kim@samsung.com> | 2016-12-14 13:43:26 +0900 |
commit | 73cf77e8d6a618e657e45c39e4140600c6f88033 (patch) | |
tree | a8c097baf7186953af1399b82cdce1866ca37172 /security | |
parent | a795b6bf319c8dc536e7ba4b43c9378045d74124 (diff) | |
download | linux-exynos-73cf77e8d6a618e657e45c39e4140600c6f88033.tar.gz linux-exynos-73cf77e8d6a618e657e45c39e4140600c6f88033.tar.bz2 linux-exynos-73cf77e8d6a618e657e45c39e4140600c6f88033.zip |
LOCAL / smack: add permissive mode for debugging purpose
This patch adds smack permissive mode.
Signed-off-by: Chanho Park <chanho61.park@samsung.com>
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
[k.kozlowski: rebased on 4.1]
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Diffstat (limited to 'security')
-rw-r--r-- | security/smack/Kconfig | 8 | ||||
-rw-r--r-- | security/smack/smack.h | 9 | ||||
-rw-r--r-- | security/smack/smack_access.c | 12 | ||||
-rw-r--r-- | security/smack/smack_lsm.c | 11 | ||||
-rw-r--r-- | security/smack/smackfs.c | 72 |
5 files changed, 112 insertions, 0 deletions
diff --git a/security/smack/Kconfig b/security/smack/Kconfig index 271adae81796..b1c221d694c6 100644 --- a/security/smack/Kconfig +++ b/security/smack/Kconfig @@ -40,3 +40,11 @@ config SECURITY_SMACK_NETFILTER This enables security marking of network packets using Smack labels. If you are unsure how to answer this question, answer N. + +config SECURITY_SMACK_PERMISSIVE_MODE + bool "Enable Permissive mode for debugging purpose" + depends on SECURITY_SMACK + help + This selects the permissive mode of smack for debug purpose. This + do not block any access of the smack policy and just warn the block + by log message. diff --git a/security/smack/smack.h b/security/smack/smack.h index 49eada6266ec..39db373a071e 100644 --- a/security/smack/smack.h +++ b/security/smack/smack.h @@ -348,6 +348,15 @@ static inline int smack_privileged(int cap) return 0; } +#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE +/* + * permissive mode + */ +#define SMACK_PERMISSIVE_DENIED 0x0 +#define SMACK_PERMISSIVE_ALLOWED 0x1 +extern int permissive_mode; +#endif + /* * logging functions */ diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c index 0f410fc56e33..188bf7dae120 100644 --- a/security/smack/smack_access.c +++ b/security/smack/smack_access.c @@ -55,6 +55,14 @@ LIST_HEAD(smack_known_list); static u32 smack_next_secid = 10; /* + * are we running in permissive mode? + * can be overwritten at run-time by /smack/permissive + */ +#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE +int permissive_mode = SMACK_PERMISSIVE_ALLOWED; +#endif + +/* * what events do we log * can be overwritten at run-time by /smack/logging */ @@ -209,6 +217,10 @@ out_audit: smack_log(subject->smk_known, object->smk_known, request, rc, a); #endif +#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE + if (permissive_mode == SMACK_PERMISSIVE_ALLOWED) + return 0; +#endif return rc; } diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index e45f0a3df127..1a6881887c92 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -4485,6 +4485,17 @@ static __init int smack_init(void) return 0; } +#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE +static int __init mode_setup(char *str) +{ + unsigned long mode; + if (!kstrtoul(str, 10, &mode)) + permissive_mode = mode ? 1 : 0; + return 1; +} +__setup("permissive=", mode_setup); +#endif + /* * Smack requires early initialization in order to label * all processes and objects when they are created. diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c index ac4cac7c661a..90c79839271c 100644 --- a/security/smack/smackfs.c +++ b/security/smack/smackfs.c @@ -57,6 +57,9 @@ enum smk_inos { #ifdef CONFIG_SECURITY_SMACK_BRINGUP SMK_UNCONFINED = 22, /* define an unconfined label */ #endif +#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE + SMK_PERMISSIVE = 23, /* permissive mode */ +#endif }; /* @@ -718,6 +721,71 @@ static const struct file_operations smk_load_ops = { .release = seq_release, }; +#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE +/** + * smk_read_permissive - read() for /smack/permissive + * @filp: file pointer, not actually used + * @buf: where to put the result + * @cn: maximum to send along + * @ppos: where to start + * + * Returns number of bytes read or error code, as appropriate + */ +static ssize_t smk_read_permissive(struct file *filp, char __user *buf, + size_t count, loff_t *ppos) +{ + char temp[32]; + ssize_t rc; + + if (*ppos != 0) + return 0; + + sprintf(temp, "%d\n", permissive_mode); + rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp)); + return rc; +} + +/** + * smk_write_permissive - write() for /smack/permissive + * @file: file pointer, not actually used + * @buf: where to get the data from + * @count: bytes sent + * @ppos: where to start + * + * Returns number of bytes written or error code, as appropriate + */ +static ssize_t smk_write_permissive(struct file *file, const char __user *buf, + size_t count, loff_t *ppos) +{ + char temp[32]; + int i; + + if (!capable(CAP_MAC_ADMIN)) + return -EPERM; + + if (count >= sizeof(temp) || count == 0) + return -EINVAL; + + if (copy_from_user(temp, buf, count) != 0) + return -EFAULT; + + temp[count] = '\0'; + + if (sscanf(temp, "%d", &i) != 1) + return -EINVAL; + if (i < 0 || i > 1) + return -EINVAL; + permissive_mode = i; + return count; +} + +static const struct file_operations smk_permissive_ops = { + .read = smk_read_permissive, + .write = smk_write_permissive, + .llseek = default_llseek, +}; +#endif /* End of CONFIG_SECURITY_SMACK_PERMISSIVE_MODE */ + /** * smk_cipso_doi - initialize the CIPSO domain */ @@ -2479,6 +2547,10 @@ static int smk_fill_super(struct super_block *sb, void *data, int silent) [SMK_UNCONFINED] = { "unconfined", &smk_unconfined_ops, S_IRUGO|S_IWUSR}, #endif +#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE + [SMK_PERMISSIVE] = { + "permissive", &smk_permissive_ops, S_IRUGO|S_IWUSR}, +#endif /* last one */ {""} }; |