0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <linux/kernel.h>
0016 #include <linux/vmalloc.h>
0017 #include <linux/security.h>
0018 #include <linux/mutex.h>
0019 #include <linux/slab.h>
0020 #include <net/net_namespace.h>
0021 #include <net/cipso_ipv4.h>
0022 #include <linux/seq_file.h>
0023 #include <linux/ctype.h>
0024 #include <linux/audit.h>
0025 #include <linux/magic.h>
0026 #include <linux/mount.h>
0027 #include <linux/fs_context.h>
0028 #include "smack.h"
0029
0030 #define BEBITS (sizeof(__be32) * 8)
0031
0032
0033
0034
0035 enum smk_inos {
0036 SMK_ROOT_INO = 2,
0037 SMK_LOAD = 3,
0038 SMK_CIPSO = 4,
0039 SMK_DOI = 5,
0040 SMK_DIRECT = 6,
0041 SMK_AMBIENT = 7,
0042 SMK_NET4ADDR = 8,
0043 SMK_ONLYCAP = 9,
0044 SMK_LOGGING = 10,
0045 SMK_LOAD_SELF = 11,
0046 SMK_ACCESSES = 12,
0047 SMK_MAPPED = 13,
0048 SMK_LOAD2 = 14,
0049 SMK_LOAD_SELF2 = 15,
0050 SMK_ACCESS2 = 16,
0051 SMK_CIPSO2 = 17,
0052 SMK_REVOKE_SUBJ = 18,
0053 SMK_CHANGE_RULE = 19,
0054 SMK_SYSLOG = 20,
0055 SMK_PTRACE = 21,
0056 #ifdef CONFIG_SECURITY_SMACK_BRINGUP
0057 SMK_UNCONFINED = 22,
0058 #endif
0059 #if IS_ENABLED(CONFIG_IPV6)
0060 SMK_NET6ADDR = 23,
0061 #endif
0062 SMK_RELABEL_SELF = 24,
0063 };
0064
0065
0066
0067
0068 static DEFINE_MUTEX(smack_cipso_lock);
0069 static DEFINE_MUTEX(smack_ambient_lock);
0070 static DEFINE_MUTEX(smk_net4addr_lock);
0071 #if IS_ENABLED(CONFIG_IPV6)
0072 static DEFINE_MUTEX(smk_net6addr_lock);
0073 #endif
0074
0075
0076
0077
0078
0079
0080 struct smack_known *smack_net_ambient;
0081
0082
0083
0084
0085
0086
0087 int smack_cipso_direct = SMACK_CIPSO_DIRECT_DEFAULT;
0088
0089
0090
0091
0092
0093
0094 int smack_cipso_mapped = SMACK_CIPSO_MAPPED_DEFAULT;
0095
0096 #ifdef CONFIG_SECURITY_SMACK_BRINGUP
0097
0098
0099
0100
0101
0102
0103 struct smack_known *smack_unconfined;
0104 #endif
0105
0106
0107
0108
0109
0110 struct smack_known *smack_syslog_label;
0111
0112
0113
0114
0115
0116
0117
0118
0119 int smack_ptrace_rule = SMACK_PTRACE_DEFAULT;
0120
0121
0122
0123
0124
0125
0126
0127 LIST_HEAD(smk_net4addr_list);
0128 #if IS_ENABLED(CONFIG_IPV6)
0129 LIST_HEAD(smk_net6addr_list);
0130 #endif
0131
0132
0133
0134
0135 struct smack_parsed_rule {
0136 struct smack_known *smk_subject;
0137 struct smack_known *smk_object;
0138 int smk_access1;
0139 int smk_access2;
0140 };
0141
0142 static int smk_cipso_doi_value = SMACK_CIPSO_DOI_DEFAULT;
0143
0144
0145
0146
0147
0148
0149
0150 #define SMK_DIGITLEN 4
0151 #define SMK_CIPSOMIN (SMK_LABELLEN + 2 * SMK_DIGITLEN)
0152 #define SMK_CIPSOMAX (SMK_CIPSOMIN + SMACK_CIPSO_MAXCATNUM * SMK_DIGITLEN)
0153
0154
0155
0156
0157
0158
0159
0160 #define SMK_OACCESS "rwxa"
0161 #define SMK_ACCESS "rwxatl"
0162 #define SMK_OACCESSLEN (sizeof(SMK_OACCESS) - 1)
0163 #define SMK_ACCESSLEN (sizeof(SMK_ACCESS) - 1)
0164 #define SMK_OLOADLEN (SMK_LABELLEN + SMK_LABELLEN + SMK_OACCESSLEN)
0165 #define SMK_LOADLEN (SMK_LABELLEN + SMK_LABELLEN + SMK_ACCESSLEN)
0166
0167
0168
0169
0170
0171 static inline void smack_catset_bit(unsigned int cat, char *catsetp)
0172 {
0173 if (cat == 0 || cat > (SMK_CIPSOLEN * 8))
0174 return;
0175
0176 catsetp[(cat - 1) / 8] |= 0x80 >> ((cat - 1) % 8);
0177 }
0178
0179
0180
0181
0182
0183 static void smk_netlabel_audit_set(struct netlbl_audit *nap)
0184 {
0185 struct smack_known *skp = smk_of_current();
0186
0187 nap->loginuid = audit_get_loginuid(current);
0188 nap->sessionid = audit_get_sessionid(current);
0189 nap->secid = skp->smk_secid;
0190 }
0191
0192
0193
0194
0195
0196 #define SMK_NETLBLADDRMIN 9
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212 static int smk_set_access(struct smack_parsed_rule *srp,
0213 struct list_head *rule_list,
0214 struct mutex *rule_lock)
0215 {
0216 struct smack_rule *sp;
0217 int found = 0;
0218 int rc = 0;
0219
0220 mutex_lock(rule_lock);
0221
0222
0223
0224
0225
0226 list_for_each_entry_rcu(sp, rule_list, list) {
0227 if (sp->smk_object == srp->smk_object &&
0228 sp->smk_subject == srp->smk_subject) {
0229 found = 1;
0230 sp->smk_access |= srp->smk_access1;
0231 sp->smk_access &= ~srp->smk_access2;
0232 break;
0233 }
0234 }
0235
0236 if (found == 0) {
0237 sp = kmem_cache_zalloc(smack_rule_cache, GFP_KERNEL);
0238 if (sp == NULL) {
0239 rc = -ENOMEM;
0240 goto out;
0241 }
0242
0243 sp->smk_subject = srp->smk_subject;
0244 sp->smk_object = srp->smk_object;
0245 sp->smk_access = srp->smk_access1 & ~srp->smk_access2;
0246
0247 list_add_rcu(&sp->list, rule_list);
0248 }
0249
0250 out:
0251 mutex_unlock(rule_lock);
0252 return rc;
0253 }
0254
0255
0256
0257
0258
0259
0260
0261 static int smk_perm_from_str(const char *string)
0262 {
0263 int perm = 0;
0264 const char *cp;
0265
0266 for (cp = string; ; cp++)
0267 switch (*cp) {
0268 case '-':
0269 break;
0270 case 'r':
0271 case 'R':
0272 perm |= MAY_READ;
0273 break;
0274 case 'w':
0275 case 'W':
0276 perm |= MAY_WRITE;
0277 break;
0278 case 'x':
0279 case 'X':
0280 perm |= MAY_EXEC;
0281 break;
0282 case 'a':
0283 case 'A':
0284 perm |= MAY_APPEND;
0285 break;
0286 case 't':
0287 case 'T':
0288 perm |= MAY_TRANSMUTE;
0289 break;
0290 case 'l':
0291 case 'L':
0292 perm |= MAY_LOCK;
0293 break;
0294 case 'b':
0295 case 'B':
0296 perm |= MAY_BRINGUP;
0297 break;
0298 default:
0299 return perm;
0300 }
0301 }
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315 static int smk_fill_rule(const char *subject, const char *object,
0316 const char *access1, const char *access2,
0317 struct smack_parsed_rule *rule, int import,
0318 int len)
0319 {
0320 const char *cp;
0321 struct smack_known *skp;
0322
0323 if (import) {
0324 rule->smk_subject = smk_import_entry(subject, len);
0325 if (IS_ERR(rule->smk_subject))
0326 return PTR_ERR(rule->smk_subject);
0327
0328 rule->smk_object = smk_import_entry(object, len);
0329 if (IS_ERR(rule->smk_object))
0330 return PTR_ERR(rule->smk_object);
0331 } else {
0332 cp = smk_parse_smack(subject, len);
0333 if (IS_ERR(cp))
0334 return PTR_ERR(cp);
0335 skp = smk_find_entry(cp);
0336 kfree(cp);
0337 if (skp == NULL)
0338 return -ENOENT;
0339 rule->smk_subject = skp;
0340
0341 cp = smk_parse_smack(object, len);
0342 if (IS_ERR(cp))
0343 return PTR_ERR(cp);
0344 skp = smk_find_entry(cp);
0345 kfree(cp);
0346 if (skp == NULL)
0347 return -ENOENT;
0348 rule->smk_object = skp;
0349 }
0350
0351 rule->smk_access1 = smk_perm_from_str(access1);
0352 if (access2)
0353 rule->smk_access2 = smk_perm_from_str(access2);
0354 else
0355 rule->smk_access2 = ~rule->smk_access1;
0356
0357 return 0;
0358 }
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368 static int smk_parse_rule(const char *data, struct smack_parsed_rule *rule,
0369 int import)
0370 {
0371 int rc;
0372
0373 rc = smk_fill_rule(data, data + SMK_LABELLEN,
0374 data + SMK_LABELLEN + SMK_LABELLEN, NULL, rule,
0375 import, SMK_LABELLEN);
0376 return rc;
0377 }
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388 static ssize_t smk_parse_long_rule(char *data, struct smack_parsed_rule *rule,
0389 int import, int tokens)
0390 {
0391 ssize_t cnt = 0;
0392 char *tok[4];
0393 int rc;
0394 int i;
0395
0396
0397
0398
0399 for (i = 0; i < tokens; ++i) {
0400 while (isspace(data[cnt]))
0401 data[cnt++] = '\0';
0402
0403 if (data[cnt] == '\0')
0404
0405 return -EINVAL;
0406
0407 tok[i] = data + cnt;
0408
0409 while (data[cnt] && !isspace(data[cnt]))
0410 ++cnt;
0411 }
0412 while (isspace(data[cnt]))
0413 data[cnt++] = '\0';
0414
0415 while (i < 4)
0416 tok[i++] = NULL;
0417
0418 rc = smk_fill_rule(tok[0], tok[1], tok[2], tok[3], rule, import, 0);
0419 return rc == 0 ? cnt : rc;
0420 }
0421
0422 #define SMK_FIXED24_FMT 0
0423 #define SMK_LONG_FMT 1
0424 #define SMK_CHANGE_FMT 2
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444 static ssize_t smk_write_rules_list(struct file *file, const char __user *buf,
0445 size_t count, loff_t *ppos,
0446 struct list_head *rule_list,
0447 struct mutex *rule_lock, int format)
0448 {
0449 struct smack_parsed_rule rule;
0450 char *data;
0451 int rc;
0452 int trunc = 0;
0453 int tokens;
0454 ssize_t cnt = 0;
0455
0456
0457
0458
0459
0460 if (*ppos != 0)
0461 return -EINVAL;
0462
0463 if (format == SMK_FIXED24_FMT) {
0464
0465
0466
0467 if (count < SMK_OLOADLEN || count > SMK_LOADLEN)
0468 return -EINVAL;
0469 } else {
0470 if (count >= PAGE_SIZE) {
0471 count = PAGE_SIZE - 1;
0472 trunc = 1;
0473 }
0474 }
0475
0476 data = memdup_user_nul(buf, count);
0477 if (IS_ERR(data))
0478 return PTR_ERR(data);
0479
0480
0481
0482
0483
0484 if (trunc) {
0485 while (count > 0 && (data[count - 1] != '\n'))
0486 --count;
0487 if (count == 0) {
0488 rc = -EINVAL;
0489 goto out;
0490 }
0491 }
0492
0493 data[count] = '\0';
0494 tokens = (format == SMK_CHANGE_FMT ? 4 : 3);
0495 while (cnt < count) {
0496 if (format == SMK_FIXED24_FMT) {
0497 rc = smk_parse_rule(data, &rule, 1);
0498 if (rc < 0)
0499 goto out;
0500 cnt = count;
0501 } else {
0502 rc = smk_parse_long_rule(data + cnt, &rule, 1, tokens);
0503 if (rc < 0)
0504 goto out;
0505 if (rc == 0) {
0506 rc = -EINVAL;
0507 goto out;
0508 }
0509 cnt += rc;
0510 }
0511
0512 if (rule_list == NULL)
0513 rc = smk_set_access(&rule, &rule.smk_subject->smk_rules,
0514 &rule.smk_subject->smk_rules_lock);
0515 else
0516 rc = smk_set_access(&rule, rule_list, rule_lock);
0517
0518 if (rc)
0519 goto out;
0520 }
0521
0522 rc = cnt;
0523 out:
0524 kfree(data);
0525 return rc;
0526 }
0527
0528
0529
0530
0531
0532 static void *smk_seq_start(struct seq_file *s, loff_t *pos,
0533 struct list_head *head)
0534 {
0535 struct list_head *list;
0536 int i = *pos;
0537
0538 rcu_read_lock();
0539 for (list = rcu_dereference(list_next_rcu(head));
0540 list != head;
0541 list = rcu_dereference(list_next_rcu(list))) {
0542 if (i-- == 0)
0543 return list;
0544 }
0545
0546 return NULL;
0547 }
0548
0549 static void *smk_seq_next(struct seq_file *s, void *v, loff_t *pos,
0550 struct list_head *head)
0551 {
0552 struct list_head *list = v;
0553
0554 ++*pos;
0555 list = rcu_dereference(list_next_rcu(list));
0556
0557 return (list == head) ? NULL : list;
0558 }
0559
0560 static void smk_seq_stop(struct seq_file *s, void *v)
0561 {
0562 rcu_read_unlock();
0563 }
0564
0565 static void smk_rule_show(struct seq_file *s, struct smack_rule *srp, int max)
0566 {
0567
0568
0569
0570
0571
0572
0573 if (strlen(srp->smk_subject->smk_known) >= max ||
0574 strlen(srp->smk_object->smk_known) >= max)
0575 return;
0576
0577 if (srp->smk_access == 0)
0578 return;
0579
0580 seq_printf(s, "%s %s",
0581 srp->smk_subject->smk_known,
0582 srp->smk_object->smk_known);
0583
0584 seq_putc(s, ' ');
0585
0586 if (srp->smk_access & MAY_READ)
0587 seq_putc(s, 'r');
0588 if (srp->smk_access & MAY_WRITE)
0589 seq_putc(s, 'w');
0590 if (srp->smk_access & MAY_EXEC)
0591 seq_putc(s, 'x');
0592 if (srp->smk_access & MAY_APPEND)
0593 seq_putc(s, 'a');
0594 if (srp->smk_access & MAY_TRANSMUTE)
0595 seq_putc(s, 't');
0596 if (srp->smk_access & MAY_LOCK)
0597 seq_putc(s, 'l');
0598 if (srp->smk_access & MAY_BRINGUP)
0599 seq_putc(s, 'b');
0600
0601 seq_putc(s, '\n');
0602 }
0603
0604
0605
0606
0607
0608 static void *load2_seq_start(struct seq_file *s, loff_t *pos)
0609 {
0610 return smk_seq_start(s, pos, &smack_known_list);
0611 }
0612
0613 static void *load2_seq_next(struct seq_file *s, void *v, loff_t *pos)
0614 {
0615 return smk_seq_next(s, v, pos, &smack_known_list);
0616 }
0617
0618 static int load_seq_show(struct seq_file *s, void *v)
0619 {
0620 struct list_head *list = v;
0621 struct smack_rule *srp;
0622 struct smack_known *skp =
0623 list_entry_rcu(list, struct smack_known, list);
0624
0625 list_for_each_entry_rcu(srp, &skp->smk_rules, list)
0626 smk_rule_show(s, srp, SMK_LABELLEN);
0627
0628 return 0;
0629 }
0630
0631 static const struct seq_operations load_seq_ops = {
0632 .start = load2_seq_start,
0633 .next = load2_seq_next,
0634 .show = load_seq_show,
0635 .stop = smk_seq_stop,
0636 };
0637
0638
0639
0640
0641
0642
0643
0644
0645 static int smk_open_load(struct inode *inode, struct file *file)
0646 {
0647 return seq_open(file, &load_seq_ops);
0648 }
0649
0650
0651
0652
0653
0654
0655
0656
0657
0658 static ssize_t smk_write_load(struct file *file, const char __user *buf,
0659 size_t count, loff_t *ppos)
0660 {
0661
0662
0663
0664
0665
0666 if (!smack_privileged(CAP_MAC_ADMIN))
0667 return -EPERM;
0668
0669 return smk_write_rules_list(file, buf, count, ppos, NULL, NULL,
0670 SMK_FIXED24_FMT);
0671 }
0672
0673 static const struct file_operations smk_load_ops = {
0674 .open = smk_open_load,
0675 .read = seq_read,
0676 .llseek = seq_lseek,
0677 .write = smk_write_load,
0678 .release = seq_release,
0679 };
0680
0681
0682
0683
0684 static void smk_cipso_doi(void)
0685 {
0686 int rc;
0687 struct cipso_v4_doi *doip;
0688 struct netlbl_audit nai;
0689
0690 smk_netlabel_audit_set(&nai);
0691
0692 rc = netlbl_cfg_map_del(NULL, PF_INET, NULL, NULL, &nai);
0693 if (rc != 0)
0694 printk(KERN_WARNING "%s:%d remove rc = %d\n",
0695 __func__, __LINE__, rc);
0696
0697 doip = kmalloc(sizeof(struct cipso_v4_doi), GFP_KERNEL | __GFP_NOFAIL);
0698 doip->map.std = NULL;
0699 doip->doi = smk_cipso_doi_value;
0700 doip->type = CIPSO_V4_MAP_PASS;
0701 doip->tags[0] = CIPSO_V4_TAG_RBITMAP;
0702 for (rc = 1; rc < CIPSO_V4_TAG_MAXCNT; rc++)
0703 doip->tags[rc] = CIPSO_V4_TAG_INVALID;
0704
0705 rc = netlbl_cfg_cipsov4_add(doip, &nai);
0706 if (rc != 0) {
0707 printk(KERN_WARNING "%s:%d cipso add rc = %d\n",
0708 __func__, __LINE__, rc);
0709 kfree(doip);
0710 return;
0711 }
0712 rc = netlbl_cfg_cipsov4_map_add(doip->doi, NULL, NULL, NULL, &nai);
0713 if (rc != 0) {
0714 printk(KERN_WARNING "%s:%d map add rc = %d\n",
0715 __func__, __LINE__, rc);
0716 netlbl_cfg_cipsov4_del(doip->doi, &nai);
0717 return;
0718 }
0719 }
0720
0721
0722
0723
0724
0725 static void smk_unlbl_ambient(char *oldambient)
0726 {
0727 int rc;
0728 struct netlbl_audit nai;
0729
0730 smk_netlabel_audit_set(&nai);
0731
0732 if (oldambient != NULL) {
0733 rc = netlbl_cfg_map_del(oldambient, PF_INET, NULL, NULL, &nai);
0734 if (rc != 0)
0735 printk(KERN_WARNING "%s:%d remove rc = %d\n",
0736 __func__, __LINE__, rc);
0737 }
0738 if (smack_net_ambient == NULL)
0739 smack_net_ambient = &smack_known_floor;
0740
0741 rc = netlbl_cfg_unlbl_map_add(smack_net_ambient->smk_known, PF_INET,
0742 NULL, NULL, &nai);
0743 if (rc != 0)
0744 printk(KERN_WARNING "%s:%d add rc = %d\n",
0745 __func__, __LINE__, rc);
0746 }
0747
0748
0749
0750
0751
0752 static void *cipso_seq_start(struct seq_file *s, loff_t *pos)
0753 {
0754 return smk_seq_start(s, pos, &smack_known_list);
0755 }
0756
0757 static void *cipso_seq_next(struct seq_file *s, void *v, loff_t *pos)
0758 {
0759 return smk_seq_next(s, v, pos, &smack_known_list);
0760 }
0761
0762
0763
0764
0765
0766 static int cipso_seq_show(struct seq_file *s, void *v)
0767 {
0768 struct list_head *list = v;
0769 struct smack_known *skp =
0770 list_entry_rcu(list, struct smack_known, list);
0771 struct netlbl_lsm_catmap *cmp = skp->smk_netlabel.attr.mls.cat;
0772 char sep = '/';
0773 int i;
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783 if (strlen(skp->smk_known) >= SMK_LABELLEN)
0784 return 0;
0785
0786 seq_printf(s, "%s %3d", skp->smk_known, skp->smk_netlabel.attr.mls.lvl);
0787
0788 for (i = netlbl_catmap_walk(cmp, 0); i >= 0;
0789 i = netlbl_catmap_walk(cmp, i + 1)) {
0790 seq_printf(s, "%c%d", sep, i);
0791 sep = ',';
0792 }
0793
0794 seq_putc(s, '\n');
0795
0796 return 0;
0797 }
0798
0799 static const struct seq_operations cipso_seq_ops = {
0800 .start = cipso_seq_start,
0801 .next = cipso_seq_next,
0802 .show = cipso_seq_show,
0803 .stop = smk_seq_stop,
0804 };
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814 static int smk_open_cipso(struct inode *inode, struct file *file)
0815 {
0816 return seq_open(file, &cipso_seq_ops);
0817 }
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830 static ssize_t smk_set_cipso(struct file *file, const char __user *buf,
0831 size_t count, loff_t *ppos, int format)
0832 {
0833 struct netlbl_lsm_catmap *old_cat;
0834 struct smack_known *skp;
0835 struct netlbl_lsm_secattr ncats;
0836 char mapcatset[SMK_CIPSOLEN];
0837 int maplevel;
0838 unsigned int cat;
0839 int catlen;
0840 ssize_t rc = -EINVAL;
0841 char *data = NULL;
0842 char *rule;
0843 int ret;
0844 int i;
0845
0846
0847
0848
0849
0850
0851 if (!smack_privileged(CAP_MAC_ADMIN))
0852 return -EPERM;
0853 if (*ppos != 0)
0854 return -EINVAL;
0855 if (format == SMK_FIXED24_FMT &&
0856 (count < SMK_CIPSOMIN || count > SMK_CIPSOMAX))
0857 return -EINVAL;
0858 if (count > PAGE_SIZE)
0859 return -EINVAL;
0860
0861 data = memdup_user_nul(buf, count);
0862 if (IS_ERR(data))
0863 return PTR_ERR(data);
0864
0865 rule = data;
0866
0867
0868
0869
0870 mutex_lock(&smack_cipso_lock);
0871
0872 skp = smk_import_entry(rule, 0);
0873 if (IS_ERR(skp)) {
0874 rc = PTR_ERR(skp);
0875 goto out;
0876 }
0877
0878 if (format == SMK_FIXED24_FMT)
0879 rule += SMK_LABELLEN;
0880 else
0881 rule += strlen(skp->smk_known) + 1;
0882
0883 if (rule > data + count) {
0884 rc = -EOVERFLOW;
0885 goto out;
0886 }
0887
0888 ret = sscanf(rule, "%d", &maplevel);
0889 if (ret != 1 || maplevel < 0 || maplevel > SMACK_CIPSO_MAXLEVEL)
0890 goto out;
0891
0892 rule += SMK_DIGITLEN;
0893 if (rule > data + count) {
0894 rc = -EOVERFLOW;
0895 goto out;
0896 }
0897
0898 ret = sscanf(rule, "%d", &catlen);
0899 if (ret != 1 || catlen > SMACK_CIPSO_MAXCATNUM)
0900 goto out;
0901
0902 if (format == SMK_FIXED24_FMT &&
0903 count != (SMK_CIPSOMIN + catlen * SMK_DIGITLEN))
0904 goto out;
0905
0906 memset(mapcatset, 0, sizeof(mapcatset));
0907
0908 for (i = 0; i < catlen; i++) {
0909 rule += SMK_DIGITLEN;
0910 if (rule > data + count) {
0911 rc = -EOVERFLOW;
0912 goto out;
0913 }
0914 ret = sscanf(rule, "%u", &cat);
0915 if (ret != 1 || cat > SMACK_CIPSO_MAXCATNUM)
0916 goto out;
0917
0918 smack_catset_bit(cat, mapcatset);
0919 }
0920
0921 rc = smk_netlbl_mls(maplevel, mapcatset, &ncats, SMK_CIPSOLEN);
0922 if (rc >= 0) {
0923 old_cat = skp->smk_netlabel.attr.mls.cat;
0924 skp->smk_netlabel.attr.mls.cat = ncats.attr.mls.cat;
0925 skp->smk_netlabel.attr.mls.lvl = ncats.attr.mls.lvl;
0926 synchronize_rcu();
0927 netlbl_catmap_free(old_cat);
0928 rc = count;
0929
0930
0931
0932 netlbl_cache_invalidate();
0933 }
0934
0935 out:
0936 mutex_unlock(&smack_cipso_lock);
0937 kfree(data);
0938 return rc;
0939 }
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949
0950
0951 static ssize_t smk_write_cipso(struct file *file, const char __user *buf,
0952 size_t count, loff_t *ppos)
0953 {
0954 return smk_set_cipso(file, buf, count, ppos, SMK_FIXED24_FMT);
0955 }
0956
0957 static const struct file_operations smk_cipso_ops = {
0958 .open = smk_open_cipso,
0959 .read = seq_read,
0960 .llseek = seq_lseek,
0961 .write = smk_write_cipso,
0962 .release = seq_release,
0963 };
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973 static int cipso2_seq_show(struct seq_file *s, void *v)
0974 {
0975 struct list_head *list = v;
0976 struct smack_known *skp =
0977 list_entry_rcu(list, struct smack_known, list);
0978 struct netlbl_lsm_catmap *cmp = skp->smk_netlabel.attr.mls.cat;
0979 char sep = '/';
0980 int i;
0981
0982 seq_printf(s, "%s %3d", skp->smk_known, skp->smk_netlabel.attr.mls.lvl);
0983
0984 for (i = netlbl_catmap_walk(cmp, 0); i >= 0;
0985 i = netlbl_catmap_walk(cmp, i + 1)) {
0986 seq_printf(s, "%c%d", sep, i);
0987 sep = ',';
0988 }
0989
0990 seq_putc(s, '\n');
0991
0992 return 0;
0993 }
0994
0995 static const struct seq_operations cipso2_seq_ops = {
0996 .start = cipso_seq_start,
0997 .next = cipso_seq_next,
0998 .show = cipso2_seq_show,
0999 .stop = smk_seq_stop,
1000 };
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010 static int smk_open_cipso2(struct inode *inode, struct file *file)
1011 {
1012 return seq_open(file, &cipso2_seq_ops);
1013 }
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025 static ssize_t smk_write_cipso2(struct file *file, const char __user *buf,
1026 size_t count, loff_t *ppos)
1027 {
1028 return smk_set_cipso(file, buf, count, ppos, SMK_LONG_FMT);
1029 }
1030
1031 static const struct file_operations smk_cipso2_ops = {
1032 .open = smk_open_cipso2,
1033 .read = seq_read,
1034 .llseek = seq_lseek,
1035 .write = smk_write_cipso2,
1036 .release = seq_release,
1037 };
1038
1039
1040
1041
1042
1043 static void *net4addr_seq_start(struct seq_file *s, loff_t *pos)
1044 {
1045 return smk_seq_start(s, pos, &smk_net4addr_list);
1046 }
1047
1048 static void *net4addr_seq_next(struct seq_file *s, void *v, loff_t *pos)
1049 {
1050 return smk_seq_next(s, v, pos, &smk_net4addr_list);
1051 }
1052
1053
1054
1055
1056 static int net4addr_seq_show(struct seq_file *s, void *v)
1057 {
1058 struct list_head *list = v;
1059 struct smk_net4addr *skp =
1060 list_entry_rcu(list, struct smk_net4addr, list);
1061 char *kp = SMACK_CIPSO_OPTION;
1062
1063 if (skp->smk_label != NULL)
1064 kp = skp->smk_label->smk_known;
1065 seq_printf(s, "%pI4/%d %s\n", &skp->smk_host.s_addr,
1066 skp->smk_masks, kp);
1067
1068 return 0;
1069 }
1070
1071 static const struct seq_operations net4addr_seq_ops = {
1072 .start = net4addr_seq_start,
1073 .next = net4addr_seq_next,
1074 .show = net4addr_seq_show,
1075 .stop = smk_seq_stop,
1076 };
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086 static int smk_open_net4addr(struct inode *inode, struct file *file)
1087 {
1088 return seq_open(file, &net4addr_seq_ops);
1089 }
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100 static void smk_net4addr_insert(struct smk_net4addr *new)
1101 {
1102 struct smk_net4addr *m;
1103 struct smk_net4addr *m_next;
1104
1105 if (list_empty(&smk_net4addr_list)) {
1106 list_add_rcu(&new->list, &smk_net4addr_list);
1107 return;
1108 }
1109
1110 m = list_entry_rcu(smk_net4addr_list.next,
1111 struct smk_net4addr, list);
1112
1113
1114 if (new->smk_masks > m->smk_masks) {
1115 list_add_rcu(&new->list, &smk_net4addr_list);
1116 return;
1117 }
1118
1119 list_for_each_entry_rcu(m, &smk_net4addr_list, list) {
1120 if (list_is_last(&m->list, &smk_net4addr_list)) {
1121 list_add_rcu(&new->list, &m->list);
1122 return;
1123 }
1124 m_next = list_entry_rcu(m->list.next,
1125 struct smk_net4addr, list);
1126 if (new->smk_masks > m_next->smk_masks) {
1127 list_add_rcu(&new->list, &m->list);
1128 return;
1129 }
1130 }
1131 }
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144 static ssize_t smk_write_net4addr(struct file *file, const char __user *buf,
1145 size_t count, loff_t *ppos)
1146 {
1147 struct smk_net4addr *snp;
1148 struct sockaddr_in newname;
1149 char *smack;
1150 struct smack_known *skp = NULL;
1151 char *data;
1152 char *host = (char *)&newname.sin_addr.s_addr;
1153 int rc;
1154 struct netlbl_audit audit_info;
1155 struct in_addr mask;
1156 unsigned int m;
1157 unsigned int masks;
1158 int found;
1159 u32 mask_bits = (1<<31);
1160 __be32 nsa;
1161 u32 temp_mask;
1162
1163
1164
1165
1166
1167
1168
1169
1170 if (!smack_privileged(CAP_MAC_ADMIN))
1171 return -EPERM;
1172 if (*ppos != 0)
1173 return -EINVAL;
1174 if (count < SMK_NETLBLADDRMIN || count > PAGE_SIZE - 1)
1175 return -EINVAL;
1176
1177 data = memdup_user_nul(buf, count);
1178 if (IS_ERR(data))
1179 return PTR_ERR(data);
1180
1181 smack = kzalloc(count + 1, GFP_KERNEL);
1182 if (smack == NULL) {
1183 rc = -ENOMEM;
1184 goto free_data_out;
1185 }
1186
1187 rc = sscanf(data, "%hhd.%hhd.%hhd.%hhd/%u %s",
1188 &host[0], &host[1], &host[2], &host[3], &masks, smack);
1189 if (rc != 6) {
1190 rc = sscanf(data, "%hhd.%hhd.%hhd.%hhd %s",
1191 &host[0], &host[1], &host[2], &host[3], smack);
1192 if (rc != 5) {
1193 rc = -EINVAL;
1194 goto free_out;
1195 }
1196 masks = 32;
1197 }
1198 if (masks > BEBITS) {
1199 rc = -EINVAL;
1200 goto free_out;
1201 }
1202
1203
1204
1205
1206 if (smack[0] != '-') {
1207 skp = smk_import_entry(smack, 0);
1208 if (IS_ERR(skp)) {
1209 rc = PTR_ERR(skp);
1210 goto free_out;
1211 }
1212 } else {
1213
1214
1215
1216 if (strcmp(smack, SMACK_CIPSO_OPTION) != 0) {
1217 rc = -EINVAL;
1218 goto free_out;
1219 }
1220 }
1221
1222 for (m = masks, temp_mask = 0; m > 0; m--) {
1223 temp_mask |= mask_bits;
1224 mask_bits >>= 1;
1225 }
1226 mask.s_addr = cpu_to_be32(temp_mask);
1227
1228 newname.sin_addr.s_addr &= mask.s_addr;
1229
1230
1231
1232
1233 mutex_lock(&smk_net4addr_lock);
1234
1235 nsa = newname.sin_addr.s_addr;
1236
1237 found = 0;
1238 list_for_each_entry_rcu(snp, &smk_net4addr_list, list) {
1239 if (snp->smk_host.s_addr == nsa && snp->smk_masks == masks) {
1240 found = 1;
1241 break;
1242 }
1243 }
1244 smk_netlabel_audit_set(&audit_info);
1245
1246 if (found == 0) {
1247 snp = kzalloc(sizeof(*snp), GFP_KERNEL);
1248 if (snp == NULL)
1249 rc = -ENOMEM;
1250 else {
1251 rc = 0;
1252 snp->smk_host.s_addr = newname.sin_addr.s_addr;
1253 snp->smk_mask.s_addr = mask.s_addr;
1254 snp->smk_label = skp;
1255 snp->smk_masks = masks;
1256 smk_net4addr_insert(snp);
1257 }
1258 } else {
1259
1260
1261
1262
1263 if (snp->smk_label != NULL)
1264 rc = netlbl_cfg_unlbl_static_del(&init_net, NULL,
1265 &snp->smk_host, &snp->smk_mask,
1266 PF_INET, &audit_info);
1267 else
1268 rc = 0;
1269 snp->smk_label = skp;
1270 }
1271
1272
1273
1274
1275
1276
1277 if (rc == 0 && skp != NULL)
1278 rc = netlbl_cfg_unlbl_static_add(&init_net, NULL,
1279 &snp->smk_host, &snp->smk_mask, PF_INET,
1280 snp->smk_label->smk_secid, &audit_info);
1281
1282 if (rc == 0)
1283 rc = count;
1284
1285 mutex_unlock(&smk_net4addr_lock);
1286
1287 free_out:
1288 kfree(smack);
1289 free_data_out:
1290 kfree(data);
1291
1292 return rc;
1293 }
1294
1295 static const struct file_operations smk_net4addr_ops = {
1296 .open = smk_open_net4addr,
1297 .read = seq_read,
1298 .llseek = seq_lseek,
1299 .write = smk_write_net4addr,
1300 .release = seq_release,
1301 };
1302
1303 #if IS_ENABLED(CONFIG_IPV6)
1304
1305
1306
1307
1308 static void *net6addr_seq_start(struct seq_file *s, loff_t *pos)
1309 {
1310 return smk_seq_start(s, pos, &smk_net6addr_list);
1311 }
1312
1313 static void *net6addr_seq_next(struct seq_file *s, void *v, loff_t *pos)
1314 {
1315 return smk_seq_next(s, v, pos, &smk_net6addr_list);
1316 }
1317
1318
1319
1320
1321 static int net6addr_seq_show(struct seq_file *s, void *v)
1322 {
1323 struct list_head *list = v;
1324 struct smk_net6addr *skp =
1325 list_entry(list, struct smk_net6addr, list);
1326
1327 if (skp->smk_label != NULL)
1328 seq_printf(s, "%pI6/%d %s\n", &skp->smk_host, skp->smk_masks,
1329 skp->smk_label->smk_known);
1330
1331 return 0;
1332 }
1333
1334 static const struct seq_operations net6addr_seq_ops = {
1335 .start = net6addr_seq_start,
1336 .next = net6addr_seq_next,
1337 .show = net6addr_seq_show,
1338 .stop = smk_seq_stop,
1339 };
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349 static int smk_open_net6addr(struct inode *inode, struct file *file)
1350 {
1351 return seq_open(file, &net6addr_seq_ops);
1352 }
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363 static void smk_net6addr_insert(struct smk_net6addr *new)
1364 {
1365 struct smk_net6addr *m_next;
1366 struct smk_net6addr *m;
1367
1368 if (list_empty(&smk_net6addr_list)) {
1369 list_add_rcu(&new->list, &smk_net6addr_list);
1370 return;
1371 }
1372
1373 m = list_entry_rcu(smk_net6addr_list.next,
1374 struct smk_net6addr, list);
1375
1376 if (new->smk_masks > m->smk_masks) {
1377 list_add_rcu(&new->list, &smk_net6addr_list);
1378 return;
1379 }
1380
1381 list_for_each_entry_rcu(m, &smk_net6addr_list, list) {
1382 if (list_is_last(&m->list, &smk_net6addr_list)) {
1383 list_add_rcu(&new->list, &m->list);
1384 return;
1385 }
1386 m_next = list_entry_rcu(m->list.next,
1387 struct smk_net6addr, list);
1388 if (new->smk_masks > m_next->smk_masks) {
1389 list_add_rcu(&new->list, &m->list);
1390 return;
1391 }
1392 }
1393 }
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406 static ssize_t smk_write_net6addr(struct file *file, const char __user *buf,
1407 size_t count, loff_t *ppos)
1408 {
1409 struct smk_net6addr *snp;
1410 struct in6_addr newname;
1411 struct in6_addr fullmask;
1412 struct smack_known *skp = NULL;
1413 char *smack;
1414 char *data;
1415 int rc = 0;
1416 int found = 0;
1417 int i;
1418 unsigned int scanned[8];
1419 unsigned int m;
1420 unsigned int mask = 128;
1421
1422
1423
1424
1425
1426
1427
1428
1429 if (!smack_privileged(CAP_MAC_ADMIN))
1430 return -EPERM;
1431 if (*ppos != 0)
1432 return -EINVAL;
1433 if (count < SMK_NETLBLADDRMIN || count > PAGE_SIZE - 1)
1434 return -EINVAL;
1435
1436 data = memdup_user_nul(buf, count);
1437 if (IS_ERR(data))
1438 return PTR_ERR(data);
1439
1440 smack = kzalloc(count + 1, GFP_KERNEL);
1441 if (smack == NULL) {
1442 rc = -ENOMEM;
1443 goto free_data_out;
1444 }
1445
1446 i = sscanf(data, "%x:%x:%x:%x:%x:%x:%x:%x/%u %s",
1447 &scanned[0], &scanned[1], &scanned[2], &scanned[3],
1448 &scanned[4], &scanned[5], &scanned[6], &scanned[7],
1449 &mask, smack);
1450 if (i != 10) {
1451 i = sscanf(data, "%x:%x:%x:%x:%x:%x:%x:%x %s",
1452 &scanned[0], &scanned[1], &scanned[2],
1453 &scanned[3], &scanned[4], &scanned[5],
1454 &scanned[6], &scanned[7], smack);
1455 if (i != 9) {
1456 rc = -EINVAL;
1457 goto free_out;
1458 }
1459 }
1460 if (mask > 128) {
1461 rc = -EINVAL;
1462 goto free_out;
1463 }
1464 for (i = 0; i < 8; i++) {
1465 if (scanned[i] > 0xffff) {
1466 rc = -EINVAL;
1467 goto free_out;
1468 }
1469 newname.s6_addr16[i] = htons(scanned[i]);
1470 }
1471
1472
1473
1474
1475 if (smack[0] != '-') {
1476 skp = smk_import_entry(smack, 0);
1477 if (IS_ERR(skp)) {
1478 rc = PTR_ERR(skp);
1479 goto free_out;
1480 }
1481 } else {
1482
1483
1484
1485 if (strcmp(smack, SMACK_DELETE_OPTION) != 0) {
1486 rc = -EINVAL;
1487 goto free_out;
1488 }
1489 }
1490
1491 for (i = 0, m = mask; i < 8; i++) {
1492 if (m >= 16) {
1493 fullmask.s6_addr16[i] = 0xffff;
1494 m -= 16;
1495 } else if (m > 0) {
1496 fullmask.s6_addr16[i] = (1 << m) - 1;
1497 m = 0;
1498 } else
1499 fullmask.s6_addr16[i] = 0;
1500 newname.s6_addr16[i] &= fullmask.s6_addr16[i];
1501 }
1502
1503
1504
1505
1506
1507 mutex_lock(&smk_net6addr_lock);
1508
1509
1510
1511 list_for_each_entry_rcu(snp, &smk_net6addr_list, list) {
1512 if (mask != snp->smk_masks)
1513 continue;
1514 for (found = 1, i = 0; i < 8; i++) {
1515 if (newname.s6_addr16[i] !=
1516 snp->smk_host.s6_addr16[i]) {
1517 found = 0;
1518 break;
1519 }
1520 }
1521 if (found == 1)
1522 break;
1523 }
1524 if (found == 0) {
1525 snp = kzalloc(sizeof(*snp), GFP_KERNEL);
1526 if (snp == NULL)
1527 rc = -ENOMEM;
1528 else {
1529 snp->smk_host = newname;
1530 snp->smk_mask = fullmask;
1531 snp->smk_masks = mask;
1532 snp->smk_label = skp;
1533 smk_net6addr_insert(snp);
1534 }
1535 } else {
1536 snp->smk_label = skp;
1537 }
1538
1539 if (rc == 0)
1540 rc = count;
1541
1542 mutex_unlock(&smk_net6addr_lock);
1543
1544 free_out:
1545 kfree(smack);
1546 free_data_out:
1547 kfree(data);
1548
1549 return rc;
1550 }
1551
1552 static const struct file_operations smk_net6addr_ops = {
1553 .open = smk_open_net6addr,
1554 .read = seq_read,
1555 .llseek = seq_lseek,
1556 .write = smk_write_net6addr,
1557 .release = seq_release,
1558 };
1559 #endif
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570 static ssize_t smk_read_doi(struct file *filp, char __user *buf,
1571 size_t count, loff_t *ppos)
1572 {
1573 char temp[80];
1574 ssize_t rc;
1575
1576 if (*ppos != 0)
1577 return 0;
1578
1579 sprintf(temp, "%d", smk_cipso_doi_value);
1580 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
1581
1582 return rc;
1583 }
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594 static ssize_t smk_write_doi(struct file *file, const char __user *buf,
1595 size_t count, loff_t *ppos)
1596 {
1597 char temp[80];
1598 int i;
1599
1600 if (!smack_privileged(CAP_MAC_ADMIN))
1601 return -EPERM;
1602
1603 if (count >= sizeof(temp) || count == 0)
1604 return -EINVAL;
1605
1606 if (copy_from_user(temp, buf, count) != 0)
1607 return -EFAULT;
1608
1609 temp[count] = '\0';
1610
1611 if (sscanf(temp, "%d", &i) != 1)
1612 return -EINVAL;
1613
1614 smk_cipso_doi_value = i;
1615
1616 smk_cipso_doi();
1617
1618 return count;
1619 }
1620
1621 static const struct file_operations smk_doi_ops = {
1622 .read = smk_read_doi,
1623 .write = smk_write_doi,
1624 .llseek = default_llseek,
1625 };
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636 static ssize_t smk_read_direct(struct file *filp, char __user *buf,
1637 size_t count, loff_t *ppos)
1638 {
1639 char temp[80];
1640 ssize_t rc;
1641
1642 if (*ppos != 0)
1643 return 0;
1644
1645 sprintf(temp, "%d", smack_cipso_direct);
1646 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
1647
1648 return rc;
1649 }
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660 static ssize_t smk_write_direct(struct file *file, const char __user *buf,
1661 size_t count, loff_t *ppos)
1662 {
1663 struct smack_known *skp;
1664 char temp[80];
1665 int i;
1666
1667 if (!smack_privileged(CAP_MAC_ADMIN))
1668 return -EPERM;
1669
1670 if (count >= sizeof(temp) || count == 0)
1671 return -EINVAL;
1672
1673 if (copy_from_user(temp, buf, count) != 0)
1674 return -EFAULT;
1675
1676 temp[count] = '\0';
1677
1678 if (sscanf(temp, "%d", &i) != 1)
1679 return -EINVAL;
1680
1681
1682
1683
1684
1685
1686 if (smack_cipso_direct != i) {
1687 mutex_lock(&smack_known_lock);
1688 list_for_each_entry_rcu(skp, &smack_known_list, list)
1689 if (skp->smk_netlabel.attr.mls.lvl ==
1690 smack_cipso_direct)
1691 skp->smk_netlabel.attr.mls.lvl = i;
1692 smack_cipso_direct = i;
1693 mutex_unlock(&smack_known_lock);
1694 }
1695
1696 return count;
1697 }
1698
1699 static const struct file_operations smk_direct_ops = {
1700 .read = smk_read_direct,
1701 .write = smk_write_direct,
1702 .llseek = default_llseek,
1703 };
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714 static ssize_t smk_read_mapped(struct file *filp, char __user *buf,
1715 size_t count, loff_t *ppos)
1716 {
1717 char temp[80];
1718 ssize_t rc;
1719
1720 if (*ppos != 0)
1721 return 0;
1722
1723 sprintf(temp, "%d", smack_cipso_mapped);
1724 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
1725
1726 return rc;
1727 }
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738 static ssize_t smk_write_mapped(struct file *file, const char __user *buf,
1739 size_t count, loff_t *ppos)
1740 {
1741 struct smack_known *skp;
1742 char temp[80];
1743 int i;
1744
1745 if (!smack_privileged(CAP_MAC_ADMIN))
1746 return -EPERM;
1747
1748 if (count >= sizeof(temp) || count == 0)
1749 return -EINVAL;
1750
1751 if (copy_from_user(temp, buf, count) != 0)
1752 return -EFAULT;
1753
1754 temp[count] = '\0';
1755
1756 if (sscanf(temp, "%d", &i) != 1)
1757 return -EINVAL;
1758
1759
1760
1761
1762
1763
1764 if (smack_cipso_mapped != i) {
1765 mutex_lock(&smack_known_lock);
1766 list_for_each_entry_rcu(skp, &smack_known_list, list)
1767 if (skp->smk_netlabel.attr.mls.lvl ==
1768 smack_cipso_mapped)
1769 skp->smk_netlabel.attr.mls.lvl = i;
1770 smack_cipso_mapped = i;
1771 mutex_unlock(&smack_known_lock);
1772 }
1773
1774 return count;
1775 }
1776
1777 static const struct file_operations smk_mapped_ops = {
1778 .read = smk_read_mapped,
1779 .write = smk_write_mapped,
1780 .llseek = default_llseek,
1781 };
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792 static ssize_t smk_read_ambient(struct file *filp, char __user *buf,
1793 size_t cn, loff_t *ppos)
1794 {
1795 ssize_t rc;
1796 int asize;
1797
1798 if (*ppos != 0)
1799 return 0;
1800
1801
1802
1803
1804 mutex_lock(&smack_ambient_lock);
1805
1806 asize = strlen(smack_net_ambient->smk_known) + 1;
1807
1808 if (cn >= asize)
1809 rc = simple_read_from_buffer(buf, cn, ppos,
1810 smack_net_ambient->smk_known,
1811 asize);
1812 else
1813 rc = -EINVAL;
1814
1815 mutex_unlock(&smack_ambient_lock);
1816
1817 return rc;
1818 }
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829 static ssize_t smk_write_ambient(struct file *file, const char __user *buf,
1830 size_t count, loff_t *ppos)
1831 {
1832 struct smack_known *skp;
1833 char *oldambient;
1834 char *data;
1835 int rc = count;
1836
1837 if (!smack_privileged(CAP_MAC_ADMIN))
1838 return -EPERM;
1839
1840
1841 if (count == 0 || count > PAGE_SIZE)
1842 return -EINVAL;
1843
1844 data = memdup_user_nul(buf, count);
1845 if (IS_ERR(data))
1846 return PTR_ERR(data);
1847
1848 skp = smk_import_entry(data, count);
1849 if (IS_ERR(skp)) {
1850 rc = PTR_ERR(skp);
1851 goto out;
1852 }
1853
1854 mutex_lock(&smack_ambient_lock);
1855
1856 oldambient = smack_net_ambient->smk_known;
1857 smack_net_ambient = skp;
1858 smk_unlbl_ambient(oldambient);
1859
1860 mutex_unlock(&smack_ambient_lock);
1861
1862 out:
1863 kfree(data);
1864 return rc;
1865 }
1866
1867 static const struct file_operations smk_ambient_ops = {
1868 .read = smk_read_ambient,
1869 .write = smk_write_ambient,
1870 .llseek = default_llseek,
1871 };
1872
1873
1874
1875
1876 static void *onlycap_seq_start(struct seq_file *s, loff_t *pos)
1877 {
1878 return smk_seq_start(s, pos, &smack_onlycap_list);
1879 }
1880
1881 static void *onlycap_seq_next(struct seq_file *s, void *v, loff_t *pos)
1882 {
1883 return smk_seq_next(s, v, pos, &smack_onlycap_list);
1884 }
1885
1886 static int onlycap_seq_show(struct seq_file *s, void *v)
1887 {
1888 struct list_head *list = v;
1889 struct smack_known_list_elem *sklep =
1890 list_entry_rcu(list, struct smack_known_list_elem, list);
1891
1892 seq_puts(s, sklep->smk_label->smk_known);
1893 seq_putc(s, ' ');
1894
1895 return 0;
1896 }
1897
1898 static const struct seq_operations onlycap_seq_ops = {
1899 .start = onlycap_seq_start,
1900 .next = onlycap_seq_next,
1901 .show = onlycap_seq_show,
1902 .stop = smk_seq_stop,
1903 };
1904
1905 static int smk_open_onlycap(struct inode *inode, struct file *file)
1906 {
1907 return seq_open(file, &onlycap_seq_ops);
1908 }
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919 static void smk_list_swap_rcu(struct list_head *public,
1920 struct list_head *private)
1921 {
1922 struct list_head *first, *last;
1923
1924 if (list_empty(public)) {
1925 list_splice_init_rcu(private, public, synchronize_rcu);
1926 } else {
1927
1928 first = public->next;
1929 last = public->prev;
1930
1931
1932 private->prev->next = public;
1933 private->next->prev = public;
1934 rcu_assign_pointer(public->next, private->next);
1935 public->prev = private->prev;
1936
1937 synchronize_rcu();
1938
1939
1940
1941 private->next = first;
1942 private->prev = last;
1943 first->prev = private;
1944 last->next = private;
1945 }
1946 }
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956 static int smk_parse_label_list(char *data, struct list_head *list)
1957 {
1958 char *tok;
1959 struct smack_known *skp;
1960 struct smack_known_list_elem *sklep;
1961
1962 while ((tok = strsep(&data, " ")) != NULL) {
1963 if (!*tok)
1964 continue;
1965
1966 skp = smk_import_entry(tok, 0);
1967 if (IS_ERR(skp))
1968 return PTR_ERR(skp);
1969
1970 sklep = kzalloc(sizeof(*sklep), GFP_KERNEL);
1971 if (sklep == NULL)
1972 return -ENOMEM;
1973
1974 sklep->smk_label = skp;
1975 list_add(&sklep->list, list);
1976 }
1977
1978 return 0;
1979 }
1980
1981
1982
1983
1984
1985 void smk_destroy_label_list(struct list_head *list)
1986 {
1987 struct smack_known_list_elem *sklep;
1988 struct smack_known_list_elem *sklep2;
1989
1990 list_for_each_entry_safe(sklep, sklep2, list, list)
1991 kfree(sklep);
1992
1993 INIT_LIST_HEAD(list);
1994 }
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005 static ssize_t smk_write_onlycap(struct file *file, const char __user *buf,
2006 size_t count, loff_t *ppos)
2007 {
2008 char *data;
2009 LIST_HEAD(list_tmp);
2010 int rc;
2011
2012 if (!smack_privileged(CAP_MAC_ADMIN))
2013 return -EPERM;
2014
2015 if (count > PAGE_SIZE)
2016 return -EINVAL;
2017
2018 data = memdup_user_nul(buf, count);
2019 if (IS_ERR(data))
2020 return PTR_ERR(data);
2021
2022 rc = smk_parse_label_list(data, &list_tmp);
2023 kfree(data);
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035 if (!rc || (rc == -EINVAL && list_empty(&list_tmp))) {
2036 mutex_lock(&smack_onlycap_lock);
2037 smk_list_swap_rcu(&smack_onlycap_list, &list_tmp);
2038 mutex_unlock(&smack_onlycap_lock);
2039 rc = count;
2040 }
2041
2042 smk_destroy_label_list(&list_tmp);
2043
2044 return rc;
2045 }
2046
2047 static const struct file_operations smk_onlycap_ops = {
2048 .open = smk_open_onlycap,
2049 .read = seq_read,
2050 .write = smk_write_onlycap,
2051 .llseek = seq_lseek,
2052 .release = seq_release,
2053 };
2054
2055 #ifdef CONFIG_SECURITY_SMACK_BRINGUP
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065 static ssize_t smk_read_unconfined(struct file *filp, char __user *buf,
2066 size_t cn, loff_t *ppos)
2067 {
2068 char *smack = "";
2069 ssize_t rc = -EINVAL;
2070 int asize;
2071
2072 if (*ppos != 0)
2073 return 0;
2074
2075 if (smack_unconfined != NULL)
2076 smack = smack_unconfined->smk_known;
2077
2078 asize = strlen(smack) + 1;
2079
2080 if (cn >= asize)
2081 rc = simple_read_from_buffer(buf, cn, ppos, smack, asize);
2082
2083 return rc;
2084 }
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095 static ssize_t smk_write_unconfined(struct file *file, const char __user *buf,
2096 size_t count, loff_t *ppos)
2097 {
2098 char *data;
2099 struct smack_known *skp;
2100 int rc = count;
2101
2102 if (!smack_privileged(CAP_MAC_ADMIN))
2103 return -EPERM;
2104
2105 if (count > PAGE_SIZE)
2106 return -EINVAL;
2107
2108 data = memdup_user_nul(buf, count);
2109 if (IS_ERR(data))
2110 return PTR_ERR(data);
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121 skp = smk_import_entry(data, count);
2122 if (PTR_ERR(skp) == -EINVAL)
2123 skp = NULL;
2124 else if (IS_ERR(skp)) {
2125 rc = PTR_ERR(skp);
2126 goto freeout;
2127 }
2128
2129 smack_unconfined = skp;
2130
2131 freeout:
2132 kfree(data);
2133 return rc;
2134 }
2135
2136 static const struct file_operations smk_unconfined_ops = {
2137 .read = smk_read_unconfined,
2138 .write = smk_write_unconfined,
2139 .llseek = default_llseek,
2140 };
2141 #endif
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152 static ssize_t smk_read_logging(struct file *filp, char __user *buf,
2153 size_t count, loff_t *ppos)
2154 {
2155 char temp[32];
2156 ssize_t rc;
2157
2158 if (*ppos != 0)
2159 return 0;
2160
2161 sprintf(temp, "%d\n", log_policy);
2162 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
2163 return rc;
2164 }
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175 static ssize_t smk_write_logging(struct file *file, const char __user *buf,
2176 size_t count, loff_t *ppos)
2177 {
2178 char temp[32];
2179 int i;
2180
2181 if (!smack_privileged(CAP_MAC_ADMIN))
2182 return -EPERM;
2183
2184 if (count >= sizeof(temp) || count == 0)
2185 return -EINVAL;
2186
2187 if (copy_from_user(temp, buf, count) != 0)
2188 return -EFAULT;
2189
2190 temp[count] = '\0';
2191
2192 if (sscanf(temp, "%d", &i) != 1)
2193 return -EINVAL;
2194 if (i < 0 || i > 3)
2195 return -EINVAL;
2196 log_policy = i;
2197 return count;
2198 }
2199
2200
2201
2202 static const struct file_operations smk_logging_ops = {
2203 .read = smk_read_logging,
2204 .write = smk_write_logging,
2205 .llseek = default_llseek,
2206 };
2207
2208
2209
2210
2211
2212 static void *load_self_seq_start(struct seq_file *s, loff_t *pos)
2213 {
2214 struct task_smack *tsp = smack_cred(current_cred());
2215
2216 return smk_seq_start(s, pos, &tsp->smk_rules);
2217 }
2218
2219 static void *load_self_seq_next(struct seq_file *s, void *v, loff_t *pos)
2220 {
2221 struct task_smack *tsp = smack_cred(current_cred());
2222
2223 return smk_seq_next(s, v, pos, &tsp->smk_rules);
2224 }
2225
2226 static int load_self_seq_show(struct seq_file *s, void *v)
2227 {
2228 struct list_head *list = v;
2229 struct smack_rule *srp =
2230 list_entry_rcu(list, struct smack_rule, list);
2231
2232 smk_rule_show(s, srp, SMK_LABELLEN);
2233
2234 return 0;
2235 }
2236
2237 static const struct seq_operations load_self_seq_ops = {
2238 .start = load_self_seq_start,
2239 .next = load_self_seq_next,
2240 .show = load_self_seq_show,
2241 .stop = smk_seq_stop,
2242 };
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252 static int smk_open_load_self(struct inode *inode, struct file *file)
2253 {
2254 return seq_open(file, &load_self_seq_ops);
2255 }
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265 static ssize_t smk_write_load_self(struct file *file, const char __user *buf,
2266 size_t count, loff_t *ppos)
2267 {
2268 struct task_smack *tsp = smack_cred(current_cred());
2269
2270 return smk_write_rules_list(file, buf, count, ppos, &tsp->smk_rules,
2271 &tsp->smk_rules_lock, SMK_FIXED24_FMT);
2272 }
2273
2274 static const struct file_operations smk_load_self_ops = {
2275 .open = smk_open_load_self,
2276 .read = seq_read,
2277 .llseek = seq_lseek,
2278 .write = smk_write_load_self,
2279 .release = seq_release,
2280 };
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290 static ssize_t smk_user_access(struct file *file, const char __user *buf,
2291 size_t count, loff_t *ppos, int format)
2292 {
2293 struct smack_parsed_rule rule;
2294 char *data;
2295 int res;
2296
2297 data = simple_transaction_get(file, buf, count);
2298 if (IS_ERR(data))
2299 return PTR_ERR(data);
2300
2301 if (format == SMK_FIXED24_FMT) {
2302 if (count < SMK_LOADLEN)
2303 return -EINVAL;
2304 res = smk_parse_rule(data, &rule, 0);
2305 } else {
2306
2307
2308
2309 res = smk_parse_long_rule(data, &rule, 0, 3);
2310 }
2311
2312 if (res >= 0)
2313 res = smk_access(rule.smk_subject, rule.smk_object,
2314 rule.smk_access1, NULL);
2315 else if (res != -ENOENT)
2316 return res;
2317
2318
2319
2320
2321 data[0] = res >= 0 ? '1' : '0';
2322 data[1] = '\0';
2323
2324 simple_transaction_set(file, 2);
2325
2326 if (format == SMK_FIXED24_FMT)
2327 return SMK_LOADLEN;
2328 return count;
2329 }
2330
2331
2332
2333
2334
2335
2336
2337
2338 static ssize_t smk_write_access(struct file *file, const char __user *buf,
2339 size_t count, loff_t *ppos)
2340 {
2341 return smk_user_access(file, buf, count, ppos, SMK_FIXED24_FMT);
2342 }
2343
2344 static const struct file_operations smk_access_ops = {
2345 .write = smk_write_access,
2346 .read = simple_transaction_read,
2347 .release = simple_transaction_release,
2348 .llseek = generic_file_llseek,
2349 };
2350
2351
2352
2353
2354
2355
2356 static int load2_seq_show(struct seq_file *s, void *v)
2357 {
2358 struct list_head *list = v;
2359 struct smack_rule *srp;
2360 struct smack_known *skp =
2361 list_entry_rcu(list, struct smack_known, list);
2362
2363 list_for_each_entry_rcu(srp, &skp->smk_rules, list)
2364 smk_rule_show(s, srp, SMK_LONGLABEL);
2365
2366 return 0;
2367 }
2368
2369 static const struct seq_operations load2_seq_ops = {
2370 .start = load2_seq_start,
2371 .next = load2_seq_next,
2372 .show = load2_seq_show,
2373 .stop = smk_seq_stop,
2374 };
2375
2376
2377
2378
2379
2380
2381
2382
2383 static int smk_open_load2(struct inode *inode, struct file *file)
2384 {
2385 return seq_open(file, &load2_seq_ops);
2386 }
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396 static ssize_t smk_write_load2(struct file *file, const char __user *buf,
2397 size_t count, loff_t *ppos)
2398 {
2399
2400
2401
2402 if (!smack_privileged(CAP_MAC_ADMIN))
2403 return -EPERM;
2404
2405 return smk_write_rules_list(file, buf, count, ppos, NULL, NULL,
2406 SMK_LONG_FMT);
2407 }
2408
2409 static const struct file_operations smk_load2_ops = {
2410 .open = smk_open_load2,
2411 .read = seq_read,
2412 .llseek = seq_lseek,
2413 .write = smk_write_load2,
2414 .release = seq_release,
2415 };
2416
2417
2418
2419
2420
2421 static void *load_self2_seq_start(struct seq_file *s, loff_t *pos)
2422 {
2423 struct task_smack *tsp = smack_cred(current_cred());
2424
2425 return smk_seq_start(s, pos, &tsp->smk_rules);
2426 }
2427
2428 static void *load_self2_seq_next(struct seq_file *s, void *v, loff_t *pos)
2429 {
2430 struct task_smack *tsp = smack_cred(current_cred());
2431
2432 return smk_seq_next(s, v, pos, &tsp->smk_rules);
2433 }
2434
2435 static int load_self2_seq_show(struct seq_file *s, void *v)
2436 {
2437 struct list_head *list = v;
2438 struct smack_rule *srp =
2439 list_entry_rcu(list, struct smack_rule, list);
2440
2441 smk_rule_show(s, srp, SMK_LONGLABEL);
2442
2443 return 0;
2444 }
2445
2446 static const struct seq_operations load_self2_seq_ops = {
2447 .start = load_self2_seq_start,
2448 .next = load_self2_seq_next,
2449 .show = load_self2_seq_show,
2450 .stop = smk_seq_stop,
2451 };
2452
2453
2454
2455
2456
2457
2458
2459
2460 static int smk_open_load_self2(struct inode *inode, struct file *file)
2461 {
2462 return seq_open(file, &load_self2_seq_ops);
2463 }
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473 static ssize_t smk_write_load_self2(struct file *file, const char __user *buf,
2474 size_t count, loff_t *ppos)
2475 {
2476 struct task_smack *tsp = smack_cred(current_cred());
2477
2478 return smk_write_rules_list(file, buf, count, ppos, &tsp->smk_rules,
2479 &tsp->smk_rules_lock, SMK_LONG_FMT);
2480 }
2481
2482 static const struct file_operations smk_load_self2_ops = {
2483 .open = smk_open_load_self2,
2484 .read = seq_read,
2485 .llseek = seq_lseek,
2486 .write = smk_write_load_self2,
2487 .release = seq_release,
2488 };
2489
2490
2491
2492
2493
2494
2495
2496
2497 static ssize_t smk_write_access2(struct file *file, const char __user *buf,
2498 size_t count, loff_t *ppos)
2499 {
2500 return smk_user_access(file, buf, count, ppos, SMK_LONG_FMT);
2501 }
2502
2503 static const struct file_operations smk_access2_ops = {
2504 .write = smk_write_access2,
2505 .read = simple_transaction_read,
2506 .release = simple_transaction_release,
2507 .llseek = generic_file_llseek,
2508 };
2509
2510
2511
2512
2513
2514
2515
2516
2517 static ssize_t smk_write_revoke_subj(struct file *file, const char __user *buf,
2518 size_t count, loff_t *ppos)
2519 {
2520 char *data;
2521 const char *cp;
2522 struct smack_known *skp;
2523 struct smack_rule *sp;
2524 struct list_head *rule_list;
2525 struct mutex *rule_lock;
2526 int rc = count;
2527
2528 if (*ppos != 0)
2529 return -EINVAL;
2530
2531 if (!smack_privileged(CAP_MAC_ADMIN))
2532 return -EPERM;
2533
2534 if (count == 0 || count > SMK_LONGLABEL)
2535 return -EINVAL;
2536
2537 data = memdup_user(buf, count);
2538 if (IS_ERR(data))
2539 return PTR_ERR(data);
2540
2541 cp = smk_parse_smack(data, count);
2542 if (IS_ERR(cp)) {
2543 rc = PTR_ERR(cp);
2544 goto out_data;
2545 }
2546
2547 skp = smk_find_entry(cp);
2548 if (skp == NULL)
2549 goto out_cp;
2550
2551 rule_list = &skp->smk_rules;
2552 rule_lock = &skp->smk_rules_lock;
2553
2554 mutex_lock(rule_lock);
2555
2556 list_for_each_entry_rcu(sp, rule_list, list)
2557 sp->smk_access = 0;
2558
2559 mutex_unlock(rule_lock);
2560
2561 out_cp:
2562 kfree(cp);
2563 out_data:
2564 kfree(data);
2565
2566 return rc;
2567 }
2568
2569 static const struct file_operations smk_revoke_subj_ops = {
2570 .write = smk_write_revoke_subj,
2571 .read = simple_transaction_read,
2572 .release = simple_transaction_release,
2573 .llseek = generic_file_llseek,
2574 };
2575
2576
2577
2578
2579
2580 static int smk_init_sysfs(void)
2581 {
2582 return sysfs_create_mount_point(fs_kobj, "smackfs");
2583 }
2584
2585
2586
2587
2588
2589
2590
2591
2592 static ssize_t smk_write_change_rule(struct file *file, const char __user *buf,
2593 size_t count, loff_t *ppos)
2594 {
2595
2596
2597
2598 if (!smack_privileged(CAP_MAC_ADMIN))
2599 return -EPERM;
2600
2601 return smk_write_rules_list(file, buf, count, ppos, NULL, NULL,
2602 SMK_CHANGE_FMT);
2603 }
2604
2605 static const struct file_operations smk_change_rule_ops = {
2606 .write = smk_write_change_rule,
2607 .read = simple_transaction_read,
2608 .release = simple_transaction_release,
2609 .llseek = generic_file_llseek,
2610 };
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621 static ssize_t smk_read_syslog(struct file *filp, char __user *buf,
2622 size_t cn, loff_t *ppos)
2623 {
2624 struct smack_known *skp;
2625 ssize_t rc = -EINVAL;
2626 int asize;
2627
2628 if (*ppos != 0)
2629 return 0;
2630
2631 if (smack_syslog_label == NULL)
2632 skp = &smack_known_star;
2633 else
2634 skp = smack_syslog_label;
2635
2636 asize = strlen(skp->smk_known) + 1;
2637
2638 if (cn >= asize)
2639 rc = simple_read_from_buffer(buf, cn, ppos, skp->smk_known,
2640 asize);
2641
2642 return rc;
2643 }
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654 static ssize_t smk_write_syslog(struct file *file, const char __user *buf,
2655 size_t count, loff_t *ppos)
2656 {
2657 char *data;
2658 struct smack_known *skp;
2659 int rc = count;
2660
2661 if (!smack_privileged(CAP_MAC_ADMIN))
2662 return -EPERM;
2663
2664
2665 if (count == 0 || count > PAGE_SIZE)
2666 return -EINVAL;
2667
2668 data = memdup_user_nul(buf, count);
2669 if (IS_ERR(data))
2670 return PTR_ERR(data);
2671
2672 skp = smk_import_entry(data, count);
2673 if (IS_ERR(skp))
2674 rc = PTR_ERR(skp);
2675 else
2676 smack_syslog_label = skp;
2677
2678 kfree(data);
2679 return rc;
2680 }
2681
2682 static const struct file_operations smk_syslog_ops = {
2683 .read = smk_read_syslog,
2684 .write = smk_write_syslog,
2685 .llseek = default_llseek,
2686 };
2687
2688
2689
2690
2691
2692 static void *relabel_self_seq_start(struct seq_file *s, loff_t *pos)
2693 {
2694 struct task_smack *tsp = smack_cred(current_cred());
2695
2696 return smk_seq_start(s, pos, &tsp->smk_relabel);
2697 }
2698
2699 static void *relabel_self_seq_next(struct seq_file *s, void *v, loff_t *pos)
2700 {
2701 struct task_smack *tsp = smack_cred(current_cred());
2702
2703 return smk_seq_next(s, v, pos, &tsp->smk_relabel);
2704 }
2705
2706 static int relabel_self_seq_show(struct seq_file *s, void *v)
2707 {
2708 struct list_head *list = v;
2709 struct smack_known_list_elem *sklep =
2710 list_entry(list, struct smack_known_list_elem, list);
2711
2712 seq_puts(s, sklep->smk_label->smk_known);
2713 seq_putc(s, ' ');
2714
2715 return 0;
2716 }
2717
2718 static const struct seq_operations relabel_self_seq_ops = {
2719 .start = relabel_self_seq_start,
2720 .next = relabel_self_seq_next,
2721 .show = relabel_self_seq_show,
2722 .stop = smk_seq_stop,
2723 };
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733 static int smk_open_relabel_self(struct inode *inode, struct file *file)
2734 {
2735 return seq_open(file, &relabel_self_seq_ops);
2736 }
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746 static ssize_t smk_write_relabel_self(struct file *file, const char __user *buf,
2747 size_t count, loff_t *ppos)
2748 {
2749 char *data;
2750 int rc;
2751 LIST_HEAD(list_tmp);
2752
2753
2754
2755
2756 if (!smack_privileged(CAP_MAC_ADMIN))
2757 return -EPERM;
2758
2759
2760
2761
2762
2763 if (*ppos != 0)
2764 return -EINVAL;
2765 if (count == 0 || count > PAGE_SIZE)
2766 return -EINVAL;
2767
2768 data = memdup_user_nul(buf, count);
2769 if (IS_ERR(data))
2770 return PTR_ERR(data);
2771
2772 rc = smk_parse_label_list(data, &list_tmp);
2773 kfree(data);
2774
2775 if (!rc || (rc == -EINVAL && list_empty(&list_tmp))) {
2776 struct cred *new;
2777 struct task_smack *tsp;
2778
2779 new = prepare_creds();
2780 if (!new) {
2781 rc = -ENOMEM;
2782 goto out;
2783 }
2784 tsp = smack_cred(new);
2785 smk_destroy_label_list(&tsp->smk_relabel);
2786 list_splice(&list_tmp, &tsp->smk_relabel);
2787 commit_creds(new);
2788 return count;
2789 }
2790 out:
2791 smk_destroy_label_list(&list_tmp);
2792 return rc;
2793 }
2794
2795 static const struct file_operations smk_relabel_self_ops = {
2796 .open = smk_open_relabel_self,
2797 .read = seq_read,
2798 .llseek = seq_lseek,
2799 .write = smk_write_relabel_self,
2800 .release = seq_release,
2801 };
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812 static ssize_t smk_read_ptrace(struct file *filp, char __user *buf,
2813 size_t count, loff_t *ppos)
2814 {
2815 char temp[32];
2816 ssize_t rc;
2817
2818 if (*ppos != 0)
2819 return 0;
2820
2821 sprintf(temp, "%d\n", smack_ptrace_rule);
2822 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
2823 return rc;
2824 }
2825
2826
2827
2828
2829
2830
2831
2832
2833 static ssize_t smk_write_ptrace(struct file *file, const char __user *buf,
2834 size_t count, loff_t *ppos)
2835 {
2836 char temp[32];
2837 int i;
2838
2839 if (!smack_privileged(CAP_MAC_ADMIN))
2840 return -EPERM;
2841
2842 if (*ppos != 0 || count >= sizeof(temp) || count == 0)
2843 return -EINVAL;
2844
2845 if (copy_from_user(temp, buf, count) != 0)
2846 return -EFAULT;
2847
2848 temp[count] = '\0';
2849
2850 if (sscanf(temp, "%d", &i) != 1)
2851 return -EINVAL;
2852 if (i < SMACK_PTRACE_DEFAULT || i > SMACK_PTRACE_MAX)
2853 return -EINVAL;
2854 smack_ptrace_rule = i;
2855
2856 return count;
2857 }
2858
2859 static const struct file_operations smk_ptrace_ops = {
2860 .write = smk_write_ptrace,
2861 .read = smk_read_ptrace,
2862 .llseek = default_llseek,
2863 };
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874 static int smk_fill_super(struct super_block *sb, struct fs_context *fc)
2875 {
2876 int rc;
2877
2878 static const struct tree_descr smack_files[] = {
2879 [SMK_LOAD] = {
2880 "load", &smk_load_ops, S_IRUGO|S_IWUSR},
2881 [SMK_CIPSO] = {
2882 "cipso", &smk_cipso_ops, S_IRUGO|S_IWUSR},
2883 [SMK_DOI] = {
2884 "doi", &smk_doi_ops, S_IRUGO|S_IWUSR},
2885 [SMK_DIRECT] = {
2886 "direct", &smk_direct_ops, S_IRUGO|S_IWUSR},
2887 [SMK_AMBIENT] = {
2888 "ambient", &smk_ambient_ops, S_IRUGO|S_IWUSR},
2889 [SMK_NET4ADDR] = {
2890 "netlabel", &smk_net4addr_ops, S_IRUGO|S_IWUSR},
2891 [SMK_ONLYCAP] = {
2892 "onlycap", &smk_onlycap_ops, S_IRUGO|S_IWUSR},
2893 [SMK_LOGGING] = {
2894 "logging", &smk_logging_ops, S_IRUGO|S_IWUSR},
2895 [SMK_LOAD_SELF] = {
2896 "load-self", &smk_load_self_ops, S_IRUGO|S_IWUGO},
2897 [SMK_ACCESSES] = {
2898 "access", &smk_access_ops, S_IRUGO|S_IWUGO},
2899 [SMK_MAPPED] = {
2900 "mapped", &smk_mapped_ops, S_IRUGO|S_IWUSR},
2901 [SMK_LOAD2] = {
2902 "load2", &smk_load2_ops, S_IRUGO|S_IWUSR},
2903 [SMK_LOAD_SELF2] = {
2904 "load-self2", &smk_load_self2_ops, S_IRUGO|S_IWUGO},
2905 [SMK_ACCESS2] = {
2906 "access2", &smk_access2_ops, S_IRUGO|S_IWUGO},
2907 [SMK_CIPSO2] = {
2908 "cipso2", &smk_cipso2_ops, S_IRUGO|S_IWUSR},
2909 [SMK_REVOKE_SUBJ] = {
2910 "revoke-subject", &smk_revoke_subj_ops,
2911 S_IRUGO|S_IWUSR},
2912 [SMK_CHANGE_RULE] = {
2913 "change-rule", &smk_change_rule_ops, S_IRUGO|S_IWUSR},
2914 [SMK_SYSLOG] = {
2915 "syslog", &smk_syslog_ops, S_IRUGO|S_IWUSR},
2916 [SMK_PTRACE] = {
2917 "ptrace", &smk_ptrace_ops, S_IRUGO|S_IWUSR},
2918 #ifdef CONFIG_SECURITY_SMACK_BRINGUP
2919 [SMK_UNCONFINED] = {
2920 "unconfined", &smk_unconfined_ops, S_IRUGO|S_IWUSR},
2921 #endif
2922 #if IS_ENABLED(CONFIG_IPV6)
2923 [SMK_NET6ADDR] = {
2924 "ipv6host", &smk_net6addr_ops, S_IRUGO|S_IWUSR},
2925 #endif
2926 [SMK_RELABEL_SELF] = {
2927 "relabel-self", &smk_relabel_self_ops,
2928 S_IRUGO|S_IWUGO},
2929
2930 {""}
2931 };
2932
2933 rc = simple_fill_super(sb, SMACK_MAGIC, smack_files);
2934 if (rc != 0) {
2935 printk(KERN_ERR "%s failed %d while creating inodes\n",
2936 __func__, rc);
2937 return rc;
2938 }
2939
2940 return 0;
2941 }
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951 static int smk_get_tree(struct fs_context *fc)
2952 {
2953 return get_tree_single(fc, smk_fill_super);
2954 }
2955
2956 static const struct fs_context_operations smk_context_ops = {
2957 .get_tree = smk_get_tree,
2958 };
2959
2960
2961
2962
2963
2964 static int smk_init_fs_context(struct fs_context *fc)
2965 {
2966 fc->ops = &smk_context_ops;
2967 return 0;
2968 }
2969
2970 static struct file_system_type smk_fs_type = {
2971 .name = "smackfs",
2972 .init_fs_context = smk_init_fs_context,
2973 .kill_sb = kill_litter_super,
2974 };
2975
2976 static struct vfsmount *smackfs_mount;
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991 static int __init init_smk_fs(void)
2992 {
2993 int err;
2994 int rc;
2995
2996 if (smack_enabled == 0)
2997 return 0;
2998
2999 err = smk_init_sysfs();
3000 if (err)
3001 printk(KERN_ERR "smackfs: sysfs mountpoint problem.\n");
3002
3003 err = register_filesystem(&smk_fs_type);
3004 if (!err) {
3005 smackfs_mount = kern_mount(&smk_fs_type);
3006 if (IS_ERR(smackfs_mount)) {
3007 printk(KERN_ERR "smackfs: could not mount!\n");
3008 err = PTR_ERR(smackfs_mount);
3009 smackfs_mount = NULL;
3010 }
3011 }
3012
3013 smk_cipso_doi();
3014 smk_unlbl_ambient(NULL);
3015
3016 rc = smack_populate_secattr(&smack_known_floor);
3017 if (err == 0 && rc < 0)
3018 err = rc;
3019 rc = smack_populate_secattr(&smack_known_hat);
3020 if (err == 0 && rc < 0)
3021 err = rc;
3022 rc = smack_populate_secattr(&smack_known_huh);
3023 if (err == 0 && rc < 0)
3024 err = rc;
3025 rc = smack_populate_secattr(&smack_known_star);
3026 if (err == 0 && rc < 0)
3027 err = rc;
3028 rc = smack_populate_secattr(&smack_known_web);
3029 if (err == 0 && rc < 0)
3030 err = rc;
3031
3032 return err;
3033 }
3034
3035 __initcall(init_smk_fs);