Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/security/selinux/hooks.c
10814 views
1
/*
2
* NSA Security-Enhanced Linux (SELinux) security module
3
*
4
* This file contains the SELinux hook function implementations.
5
*
6
* Authors: Stephen Smalley, <[email protected]>
7
* Chris Vance, <[email protected]>
8
* Wayne Salamon, <[email protected]>
9
* James Morris <[email protected]>
10
*
11
* Copyright (C) 2001,2002 Networks Associates Technology, Inc.
12
* Copyright (C) 2003-2008 Red Hat, Inc., James Morris <[email protected]>
13
* Eric Paris <[email protected]>
14
* Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
15
* <[email protected]>
16
* Copyright (C) 2006, 2007, 2009 Hewlett-Packard Development Company, L.P.
17
* Paul Moore <[email protected]>
18
* Copyright (C) 2007 Hitachi Software Engineering Co., Ltd.
19
* Yuichi Nakamura <[email protected]>
20
*
21
* This program is free software; you can redistribute it and/or modify
22
* it under the terms of the GNU General Public License version 2,
23
* as published by the Free Software Foundation.
24
*/
25
26
#include <linux/init.h>
27
#include <linux/kd.h>
28
#include <linux/kernel.h>
29
#include <linux/tracehook.h>
30
#include <linux/errno.h>
31
#include <linux/ext2_fs.h>
32
#include <linux/sched.h>
33
#include <linux/security.h>
34
#include <linux/xattr.h>
35
#include <linux/capability.h>
36
#include <linux/unistd.h>
37
#include <linux/mm.h>
38
#include <linux/mman.h>
39
#include <linux/slab.h>
40
#include <linux/pagemap.h>
41
#include <linux/proc_fs.h>
42
#include <linux/swap.h>
43
#include <linux/spinlock.h>
44
#include <linux/syscalls.h>
45
#include <linux/dcache.h>
46
#include <linux/file.h>
47
#include <linux/fdtable.h>
48
#include <linux/namei.h>
49
#include <linux/mount.h>
50
#include <linux/netfilter_ipv4.h>
51
#include <linux/netfilter_ipv6.h>
52
#include <linux/tty.h>
53
#include <net/icmp.h>
54
#include <net/ip.h> /* for local_port_range[] */
55
#include <net/tcp.h> /* struct or_callable used in sock_rcv_skb */
56
#include <net/net_namespace.h>
57
#include <net/netlabel.h>
58
#include <linux/uaccess.h>
59
#include <asm/ioctls.h>
60
#include <asm/atomic.h>
61
#include <linux/bitops.h>
62
#include <linux/interrupt.h>
63
#include <linux/netdevice.h> /* for network interface checks */
64
#include <linux/netlink.h>
65
#include <linux/tcp.h>
66
#include <linux/udp.h>
67
#include <linux/dccp.h>
68
#include <linux/quota.h>
69
#include <linux/un.h> /* for Unix socket types */
70
#include <net/af_unix.h> /* for Unix socket types */
71
#include <linux/parser.h>
72
#include <linux/nfs_mount.h>
73
#include <net/ipv6.h>
74
#include <linux/hugetlb.h>
75
#include <linux/personality.h>
76
#include <linux/audit.h>
77
#include <linux/string.h>
78
#include <linux/selinux.h>
79
#include <linux/mutex.h>
80
#include <linux/posix-timers.h>
81
#include <linux/syslog.h>
82
#include <linux/user_namespace.h>
83
84
#include "avc.h"
85
#include "objsec.h"
86
#include "netif.h"
87
#include "netnode.h"
88
#include "netport.h"
89
#include "xfrm.h"
90
#include "netlabel.h"
91
#include "audit.h"
92
93
#define NUM_SEL_MNT_OPTS 5
94
95
extern int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm);
96
extern struct security_operations *security_ops;
97
98
/* SECMARK reference count */
99
atomic_t selinux_secmark_refcount = ATOMIC_INIT(0);
100
101
#ifdef CONFIG_SECURITY_SELINUX_DEVELOP
102
int selinux_enforcing;
103
104
static int __init enforcing_setup(char *str)
105
{
106
unsigned long enforcing;
107
if (!strict_strtoul(str, 0, &enforcing))
108
selinux_enforcing = enforcing ? 1 : 0;
109
return 1;
110
}
111
__setup("enforcing=", enforcing_setup);
112
#endif
113
114
#ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM
115
int selinux_enabled = CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE;
116
117
static int __init selinux_enabled_setup(char *str)
118
{
119
unsigned long enabled;
120
if (!strict_strtoul(str, 0, &enabled))
121
selinux_enabled = enabled ? 1 : 0;
122
return 1;
123
}
124
__setup("selinux=", selinux_enabled_setup);
125
#else
126
int selinux_enabled = 1;
127
#endif
128
129
static struct kmem_cache *sel_inode_cache;
130
131
/**
132
* selinux_secmark_enabled - Check to see if SECMARK is currently enabled
133
*
134
* Description:
135
* This function checks the SECMARK reference counter to see if any SECMARK
136
* targets are currently configured, if the reference counter is greater than
137
* zero SECMARK is considered to be enabled. Returns true (1) if SECMARK is
138
* enabled, false (0) if SECMARK is disabled.
139
*
140
*/
141
static int selinux_secmark_enabled(void)
142
{
143
return (atomic_read(&selinux_secmark_refcount) > 0);
144
}
145
146
/*
147
* initialise the security for the init task
148
*/
149
static void cred_init_security(void)
150
{
151
struct cred *cred = (struct cred *) current->real_cred;
152
struct task_security_struct *tsec;
153
154
tsec = kzalloc(sizeof(struct task_security_struct), GFP_KERNEL);
155
if (!tsec)
156
panic("SELinux: Failed to initialize initial task.\n");
157
158
tsec->osid = tsec->sid = SECINITSID_KERNEL;
159
cred->security = tsec;
160
}
161
162
/*
163
* get the security ID of a set of credentials
164
*/
165
static inline u32 cred_sid(const struct cred *cred)
166
{
167
const struct task_security_struct *tsec;
168
169
tsec = cred->security;
170
return tsec->sid;
171
}
172
173
/*
174
* get the objective security ID of a task
175
*/
176
static inline u32 task_sid(const struct task_struct *task)
177
{
178
u32 sid;
179
180
rcu_read_lock();
181
sid = cred_sid(__task_cred(task));
182
rcu_read_unlock();
183
return sid;
184
}
185
186
/*
187
* get the subjective security ID of the current task
188
*/
189
static inline u32 current_sid(void)
190
{
191
const struct task_security_struct *tsec = current_security();
192
193
return tsec->sid;
194
}
195
196
/* Allocate and free functions for each kind of security blob. */
197
198
static int inode_alloc_security(struct inode *inode)
199
{
200
struct inode_security_struct *isec;
201
u32 sid = current_sid();
202
203
isec = kmem_cache_zalloc(sel_inode_cache, GFP_NOFS);
204
if (!isec)
205
return -ENOMEM;
206
207
mutex_init(&isec->lock);
208
INIT_LIST_HEAD(&isec->list);
209
isec->inode = inode;
210
isec->sid = SECINITSID_UNLABELED;
211
isec->sclass = SECCLASS_FILE;
212
isec->task_sid = sid;
213
inode->i_security = isec;
214
215
return 0;
216
}
217
218
static void inode_free_security(struct inode *inode)
219
{
220
struct inode_security_struct *isec = inode->i_security;
221
struct superblock_security_struct *sbsec = inode->i_sb->s_security;
222
223
spin_lock(&sbsec->isec_lock);
224
if (!list_empty(&isec->list))
225
list_del_init(&isec->list);
226
spin_unlock(&sbsec->isec_lock);
227
228
inode->i_security = NULL;
229
kmem_cache_free(sel_inode_cache, isec);
230
}
231
232
static int file_alloc_security(struct file *file)
233
{
234
struct file_security_struct *fsec;
235
u32 sid = current_sid();
236
237
fsec = kzalloc(sizeof(struct file_security_struct), GFP_KERNEL);
238
if (!fsec)
239
return -ENOMEM;
240
241
fsec->sid = sid;
242
fsec->fown_sid = sid;
243
file->f_security = fsec;
244
245
return 0;
246
}
247
248
static void file_free_security(struct file *file)
249
{
250
struct file_security_struct *fsec = file->f_security;
251
file->f_security = NULL;
252
kfree(fsec);
253
}
254
255
static int superblock_alloc_security(struct super_block *sb)
256
{
257
struct superblock_security_struct *sbsec;
258
259
sbsec = kzalloc(sizeof(struct superblock_security_struct), GFP_KERNEL);
260
if (!sbsec)
261
return -ENOMEM;
262
263
mutex_init(&sbsec->lock);
264
INIT_LIST_HEAD(&sbsec->isec_head);
265
spin_lock_init(&sbsec->isec_lock);
266
sbsec->sb = sb;
267
sbsec->sid = SECINITSID_UNLABELED;
268
sbsec->def_sid = SECINITSID_FILE;
269
sbsec->mntpoint_sid = SECINITSID_UNLABELED;
270
sb->s_security = sbsec;
271
272
return 0;
273
}
274
275
static void superblock_free_security(struct super_block *sb)
276
{
277
struct superblock_security_struct *sbsec = sb->s_security;
278
sb->s_security = NULL;
279
kfree(sbsec);
280
}
281
282
/* The security server must be initialized before
283
any labeling or access decisions can be provided. */
284
extern int ss_initialized;
285
286
/* The file system's label must be initialized prior to use. */
287
288
static const char *labeling_behaviors[6] = {
289
"uses xattr",
290
"uses transition SIDs",
291
"uses task SIDs",
292
"uses genfs_contexts",
293
"not configured for labeling",
294
"uses mountpoint labeling",
295
};
296
297
static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry);
298
299
static inline int inode_doinit(struct inode *inode)
300
{
301
return inode_doinit_with_dentry(inode, NULL);
302
}
303
304
enum {
305
Opt_error = -1,
306
Opt_context = 1,
307
Opt_fscontext = 2,
308
Opt_defcontext = 3,
309
Opt_rootcontext = 4,
310
Opt_labelsupport = 5,
311
};
312
313
static const match_table_t tokens = {
314
{Opt_context, CONTEXT_STR "%s"},
315
{Opt_fscontext, FSCONTEXT_STR "%s"},
316
{Opt_defcontext, DEFCONTEXT_STR "%s"},
317
{Opt_rootcontext, ROOTCONTEXT_STR "%s"},
318
{Opt_labelsupport, LABELSUPP_STR},
319
{Opt_error, NULL},
320
};
321
322
#define SEL_MOUNT_FAIL_MSG "SELinux: duplicate or incompatible mount options\n"
323
324
static int may_context_mount_sb_relabel(u32 sid,
325
struct superblock_security_struct *sbsec,
326
const struct cred *cred)
327
{
328
const struct task_security_struct *tsec = cred->security;
329
int rc;
330
331
rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
332
FILESYSTEM__RELABELFROM, NULL);
333
if (rc)
334
return rc;
335
336
rc = avc_has_perm(tsec->sid, sid, SECCLASS_FILESYSTEM,
337
FILESYSTEM__RELABELTO, NULL);
338
return rc;
339
}
340
341
static int may_context_mount_inode_relabel(u32 sid,
342
struct superblock_security_struct *sbsec,
343
const struct cred *cred)
344
{
345
const struct task_security_struct *tsec = cred->security;
346
int rc;
347
rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
348
FILESYSTEM__RELABELFROM, NULL);
349
if (rc)
350
return rc;
351
352
rc = avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM,
353
FILESYSTEM__ASSOCIATE, NULL);
354
return rc;
355
}
356
357
static int sb_finish_set_opts(struct super_block *sb)
358
{
359
struct superblock_security_struct *sbsec = sb->s_security;
360
struct dentry *root = sb->s_root;
361
struct inode *root_inode = root->d_inode;
362
int rc = 0;
363
364
if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
365
/* Make sure that the xattr handler exists and that no
366
error other than -ENODATA is returned by getxattr on
367
the root directory. -ENODATA is ok, as this may be
368
the first boot of the SELinux kernel before we have
369
assigned xattr values to the filesystem. */
370
if (!root_inode->i_op->getxattr) {
371
printk(KERN_WARNING "SELinux: (dev %s, type %s) has no "
372
"xattr support\n", sb->s_id, sb->s_type->name);
373
rc = -EOPNOTSUPP;
374
goto out;
375
}
376
rc = root_inode->i_op->getxattr(root, XATTR_NAME_SELINUX, NULL, 0);
377
if (rc < 0 && rc != -ENODATA) {
378
if (rc == -EOPNOTSUPP)
379
printk(KERN_WARNING "SELinux: (dev %s, type "
380
"%s) has no security xattr handler\n",
381
sb->s_id, sb->s_type->name);
382
else
383
printk(KERN_WARNING "SELinux: (dev %s, type "
384
"%s) getxattr errno %d\n", sb->s_id,
385
sb->s_type->name, -rc);
386
goto out;
387
}
388
}
389
390
sbsec->flags |= (SE_SBINITIALIZED | SE_SBLABELSUPP);
391
392
if (sbsec->behavior > ARRAY_SIZE(labeling_behaviors))
393
printk(KERN_ERR "SELinux: initialized (dev %s, type %s), unknown behavior\n",
394
sb->s_id, sb->s_type->name);
395
else
396
printk(KERN_DEBUG "SELinux: initialized (dev %s, type %s), %s\n",
397
sb->s_id, sb->s_type->name,
398
labeling_behaviors[sbsec->behavior-1]);
399
400
if (sbsec->behavior == SECURITY_FS_USE_GENFS ||
401
sbsec->behavior == SECURITY_FS_USE_MNTPOINT ||
402
sbsec->behavior == SECURITY_FS_USE_NONE ||
403
sbsec->behavior > ARRAY_SIZE(labeling_behaviors))
404
sbsec->flags &= ~SE_SBLABELSUPP;
405
406
/* Special handling for sysfs. Is genfs but also has setxattr handler*/
407
if (strncmp(sb->s_type->name, "sysfs", sizeof("sysfs")) == 0)
408
sbsec->flags |= SE_SBLABELSUPP;
409
410
/* Initialize the root inode. */
411
rc = inode_doinit_with_dentry(root_inode, root);
412
413
/* Initialize any other inodes associated with the superblock, e.g.
414
inodes created prior to initial policy load or inodes created
415
during get_sb by a pseudo filesystem that directly
416
populates itself. */
417
spin_lock(&sbsec->isec_lock);
418
next_inode:
419
if (!list_empty(&sbsec->isec_head)) {
420
struct inode_security_struct *isec =
421
list_entry(sbsec->isec_head.next,
422
struct inode_security_struct, list);
423
struct inode *inode = isec->inode;
424
spin_unlock(&sbsec->isec_lock);
425
inode = igrab(inode);
426
if (inode) {
427
if (!IS_PRIVATE(inode))
428
inode_doinit(inode);
429
iput(inode);
430
}
431
spin_lock(&sbsec->isec_lock);
432
list_del_init(&isec->list);
433
goto next_inode;
434
}
435
spin_unlock(&sbsec->isec_lock);
436
out:
437
return rc;
438
}
439
440
/*
441
* This function should allow an FS to ask what it's mount security
442
* options were so it can use those later for submounts, displaying
443
* mount options, or whatever.
444
*/
445
static int selinux_get_mnt_opts(const struct super_block *sb,
446
struct security_mnt_opts *opts)
447
{
448
int rc = 0, i;
449
struct superblock_security_struct *sbsec = sb->s_security;
450
char *context = NULL;
451
u32 len;
452
char tmp;
453
454
security_init_mnt_opts(opts);
455
456
if (!(sbsec->flags & SE_SBINITIALIZED))
457
return -EINVAL;
458
459
if (!ss_initialized)
460
return -EINVAL;
461
462
tmp = sbsec->flags & SE_MNTMASK;
463
/* count the number of mount options for this sb */
464
for (i = 0; i < 8; i++) {
465
if (tmp & 0x01)
466
opts->num_mnt_opts++;
467
tmp >>= 1;
468
}
469
/* Check if the Label support flag is set */
470
if (sbsec->flags & SE_SBLABELSUPP)
471
opts->num_mnt_opts++;
472
473
opts->mnt_opts = kcalloc(opts->num_mnt_opts, sizeof(char *), GFP_ATOMIC);
474
if (!opts->mnt_opts) {
475
rc = -ENOMEM;
476
goto out_free;
477
}
478
479
opts->mnt_opts_flags = kcalloc(opts->num_mnt_opts, sizeof(int), GFP_ATOMIC);
480
if (!opts->mnt_opts_flags) {
481
rc = -ENOMEM;
482
goto out_free;
483
}
484
485
i = 0;
486
if (sbsec->flags & FSCONTEXT_MNT) {
487
rc = security_sid_to_context(sbsec->sid, &context, &len);
488
if (rc)
489
goto out_free;
490
opts->mnt_opts[i] = context;
491
opts->mnt_opts_flags[i++] = FSCONTEXT_MNT;
492
}
493
if (sbsec->flags & CONTEXT_MNT) {
494
rc = security_sid_to_context(sbsec->mntpoint_sid, &context, &len);
495
if (rc)
496
goto out_free;
497
opts->mnt_opts[i] = context;
498
opts->mnt_opts_flags[i++] = CONTEXT_MNT;
499
}
500
if (sbsec->flags & DEFCONTEXT_MNT) {
501
rc = security_sid_to_context(sbsec->def_sid, &context, &len);
502
if (rc)
503
goto out_free;
504
opts->mnt_opts[i] = context;
505
opts->mnt_opts_flags[i++] = DEFCONTEXT_MNT;
506
}
507
if (sbsec->flags & ROOTCONTEXT_MNT) {
508
struct inode *root = sbsec->sb->s_root->d_inode;
509
struct inode_security_struct *isec = root->i_security;
510
511
rc = security_sid_to_context(isec->sid, &context, &len);
512
if (rc)
513
goto out_free;
514
opts->mnt_opts[i] = context;
515
opts->mnt_opts_flags[i++] = ROOTCONTEXT_MNT;
516
}
517
if (sbsec->flags & SE_SBLABELSUPP) {
518
opts->mnt_opts[i] = NULL;
519
opts->mnt_opts_flags[i++] = SE_SBLABELSUPP;
520
}
521
522
BUG_ON(i != opts->num_mnt_opts);
523
524
return 0;
525
526
out_free:
527
security_free_mnt_opts(opts);
528
return rc;
529
}
530
531
static int bad_option(struct superblock_security_struct *sbsec, char flag,
532
u32 old_sid, u32 new_sid)
533
{
534
char mnt_flags = sbsec->flags & SE_MNTMASK;
535
536
/* check if the old mount command had the same options */
537
if (sbsec->flags & SE_SBINITIALIZED)
538
if (!(sbsec->flags & flag) ||
539
(old_sid != new_sid))
540
return 1;
541
542
/* check if we were passed the same options twice,
543
* aka someone passed context=a,context=b
544
*/
545
if (!(sbsec->flags & SE_SBINITIALIZED))
546
if (mnt_flags & flag)
547
return 1;
548
return 0;
549
}
550
551
/*
552
* Allow filesystems with binary mount data to explicitly set mount point
553
* labeling information.
554
*/
555
static int selinux_set_mnt_opts(struct super_block *sb,
556
struct security_mnt_opts *opts)
557
{
558
const struct cred *cred = current_cred();
559
int rc = 0, i;
560
struct superblock_security_struct *sbsec = sb->s_security;
561
const char *name = sb->s_type->name;
562
struct inode *inode = sbsec->sb->s_root->d_inode;
563
struct inode_security_struct *root_isec = inode->i_security;
564
u32 fscontext_sid = 0, context_sid = 0, rootcontext_sid = 0;
565
u32 defcontext_sid = 0;
566
char **mount_options = opts->mnt_opts;
567
int *flags = opts->mnt_opts_flags;
568
int num_opts = opts->num_mnt_opts;
569
570
mutex_lock(&sbsec->lock);
571
572
if (!ss_initialized) {
573
if (!num_opts) {
574
/* Defer initialization until selinux_complete_init,
575
after the initial policy is loaded and the security
576
server is ready to handle calls. */
577
goto out;
578
}
579
rc = -EINVAL;
580
printk(KERN_WARNING "SELinux: Unable to set superblock options "
581
"before the security server is initialized\n");
582
goto out;
583
}
584
585
/*
586
* Binary mount data FS will come through this function twice. Once
587
* from an explicit call and once from the generic calls from the vfs.
588
* Since the generic VFS calls will not contain any security mount data
589
* we need to skip the double mount verification.
590
*
591
* This does open a hole in which we will not notice if the first
592
* mount using this sb set explict options and a second mount using
593
* this sb does not set any security options. (The first options
594
* will be used for both mounts)
595
*/
596
if ((sbsec->flags & SE_SBINITIALIZED) && (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
597
&& (num_opts == 0))
598
goto out;
599
600
/*
601
* parse the mount options, check if they are valid sids.
602
* also check if someone is trying to mount the same sb more
603
* than once with different security options.
604
*/
605
for (i = 0; i < num_opts; i++) {
606
u32 sid;
607
608
if (flags[i] == SE_SBLABELSUPP)
609
continue;
610
rc = security_context_to_sid(mount_options[i],
611
strlen(mount_options[i]), &sid);
612
if (rc) {
613
printk(KERN_WARNING "SELinux: security_context_to_sid"
614
"(%s) failed for (dev %s, type %s) errno=%d\n",
615
mount_options[i], sb->s_id, name, rc);
616
goto out;
617
}
618
switch (flags[i]) {
619
case FSCONTEXT_MNT:
620
fscontext_sid = sid;
621
622
if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid,
623
fscontext_sid))
624
goto out_double_mount;
625
626
sbsec->flags |= FSCONTEXT_MNT;
627
break;
628
case CONTEXT_MNT:
629
context_sid = sid;
630
631
if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid,
632
context_sid))
633
goto out_double_mount;
634
635
sbsec->flags |= CONTEXT_MNT;
636
break;
637
case ROOTCONTEXT_MNT:
638
rootcontext_sid = sid;
639
640
if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid,
641
rootcontext_sid))
642
goto out_double_mount;
643
644
sbsec->flags |= ROOTCONTEXT_MNT;
645
646
break;
647
case DEFCONTEXT_MNT:
648
defcontext_sid = sid;
649
650
if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid,
651
defcontext_sid))
652
goto out_double_mount;
653
654
sbsec->flags |= DEFCONTEXT_MNT;
655
656
break;
657
default:
658
rc = -EINVAL;
659
goto out;
660
}
661
}
662
663
if (sbsec->flags & SE_SBINITIALIZED) {
664
/* previously mounted with options, but not on this attempt? */
665
if ((sbsec->flags & SE_MNTMASK) && !num_opts)
666
goto out_double_mount;
667
rc = 0;
668
goto out;
669
}
670
671
if (strcmp(sb->s_type->name, "proc") == 0)
672
sbsec->flags |= SE_SBPROC;
673
674
/* Determine the labeling behavior to use for this filesystem type. */
675
rc = security_fs_use((sbsec->flags & SE_SBPROC) ? "proc" : sb->s_type->name, &sbsec->behavior, &sbsec->sid);
676
if (rc) {
677
printk(KERN_WARNING "%s: security_fs_use(%s) returned %d\n",
678
__func__, sb->s_type->name, rc);
679
goto out;
680
}
681
682
/* sets the context of the superblock for the fs being mounted. */
683
if (fscontext_sid) {
684
rc = may_context_mount_sb_relabel(fscontext_sid, sbsec, cred);
685
if (rc)
686
goto out;
687
688
sbsec->sid = fscontext_sid;
689
}
690
691
/*
692
* Switch to using mount point labeling behavior.
693
* sets the label used on all file below the mountpoint, and will set
694
* the superblock context if not already set.
695
*/
696
if (context_sid) {
697
if (!fscontext_sid) {
698
rc = may_context_mount_sb_relabel(context_sid, sbsec,
699
cred);
700
if (rc)
701
goto out;
702
sbsec->sid = context_sid;
703
} else {
704
rc = may_context_mount_inode_relabel(context_sid, sbsec,
705
cred);
706
if (rc)
707
goto out;
708
}
709
if (!rootcontext_sid)
710
rootcontext_sid = context_sid;
711
712
sbsec->mntpoint_sid = context_sid;
713
sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
714
}
715
716
if (rootcontext_sid) {
717
rc = may_context_mount_inode_relabel(rootcontext_sid, sbsec,
718
cred);
719
if (rc)
720
goto out;
721
722
root_isec->sid = rootcontext_sid;
723
root_isec->initialized = 1;
724
}
725
726
if (defcontext_sid) {
727
if (sbsec->behavior != SECURITY_FS_USE_XATTR) {
728
rc = -EINVAL;
729
printk(KERN_WARNING "SELinux: defcontext option is "
730
"invalid for this filesystem type\n");
731
goto out;
732
}
733
734
if (defcontext_sid != sbsec->def_sid) {
735
rc = may_context_mount_inode_relabel(defcontext_sid,
736
sbsec, cred);
737
if (rc)
738
goto out;
739
}
740
741
sbsec->def_sid = defcontext_sid;
742
}
743
744
rc = sb_finish_set_opts(sb);
745
out:
746
mutex_unlock(&sbsec->lock);
747
return rc;
748
out_double_mount:
749
rc = -EINVAL;
750
printk(KERN_WARNING "SELinux: mount invalid. Same superblock, different "
751
"security settings for (dev %s, type %s)\n", sb->s_id, name);
752
goto out;
753
}
754
755
static void selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
756
struct super_block *newsb)
757
{
758
const struct superblock_security_struct *oldsbsec = oldsb->s_security;
759
struct superblock_security_struct *newsbsec = newsb->s_security;
760
761
int set_fscontext = (oldsbsec->flags & FSCONTEXT_MNT);
762
int set_context = (oldsbsec->flags & CONTEXT_MNT);
763
int set_rootcontext = (oldsbsec->flags & ROOTCONTEXT_MNT);
764
765
/*
766
* if the parent was able to be mounted it clearly had no special lsm
767
* mount options. thus we can safely deal with this superblock later
768
*/
769
if (!ss_initialized)
770
return;
771
772
/* how can we clone if the old one wasn't set up?? */
773
BUG_ON(!(oldsbsec->flags & SE_SBINITIALIZED));
774
775
/* if fs is reusing a sb, just let its options stand... */
776
if (newsbsec->flags & SE_SBINITIALIZED)
777
return;
778
779
mutex_lock(&newsbsec->lock);
780
781
newsbsec->flags = oldsbsec->flags;
782
783
newsbsec->sid = oldsbsec->sid;
784
newsbsec->def_sid = oldsbsec->def_sid;
785
newsbsec->behavior = oldsbsec->behavior;
786
787
if (set_context) {
788
u32 sid = oldsbsec->mntpoint_sid;
789
790
if (!set_fscontext)
791
newsbsec->sid = sid;
792
if (!set_rootcontext) {
793
struct inode *newinode = newsb->s_root->d_inode;
794
struct inode_security_struct *newisec = newinode->i_security;
795
newisec->sid = sid;
796
}
797
newsbsec->mntpoint_sid = sid;
798
}
799
if (set_rootcontext) {
800
const struct inode *oldinode = oldsb->s_root->d_inode;
801
const struct inode_security_struct *oldisec = oldinode->i_security;
802
struct inode *newinode = newsb->s_root->d_inode;
803
struct inode_security_struct *newisec = newinode->i_security;
804
805
newisec->sid = oldisec->sid;
806
}
807
808
sb_finish_set_opts(newsb);
809
mutex_unlock(&newsbsec->lock);
810
}
811
812
static int selinux_parse_opts_str(char *options,
813
struct security_mnt_opts *opts)
814
{
815
char *p;
816
char *context = NULL, *defcontext = NULL;
817
char *fscontext = NULL, *rootcontext = NULL;
818
int rc, num_mnt_opts = 0;
819
820
opts->num_mnt_opts = 0;
821
822
/* Standard string-based options. */
823
while ((p = strsep(&options, "|")) != NULL) {
824
int token;
825
substring_t args[MAX_OPT_ARGS];
826
827
if (!*p)
828
continue;
829
830
token = match_token(p, tokens, args);
831
832
switch (token) {
833
case Opt_context:
834
if (context || defcontext) {
835
rc = -EINVAL;
836
printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
837
goto out_err;
838
}
839
context = match_strdup(&args[0]);
840
if (!context) {
841
rc = -ENOMEM;
842
goto out_err;
843
}
844
break;
845
846
case Opt_fscontext:
847
if (fscontext) {
848
rc = -EINVAL;
849
printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
850
goto out_err;
851
}
852
fscontext = match_strdup(&args[0]);
853
if (!fscontext) {
854
rc = -ENOMEM;
855
goto out_err;
856
}
857
break;
858
859
case Opt_rootcontext:
860
if (rootcontext) {
861
rc = -EINVAL;
862
printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
863
goto out_err;
864
}
865
rootcontext = match_strdup(&args[0]);
866
if (!rootcontext) {
867
rc = -ENOMEM;
868
goto out_err;
869
}
870
break;
871
872
case Opt_defcontext:
873
if (context || defcontext) {
874
rc = -EINVAL;
875
printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
876
goto out_err;
877
}
878
defcontext = match_strdup(&args[0]);
879
if (!defcontext) {
880
rc = -ENOMEM;
881
goto out_err;
882
}
883
break;
884
case Opt_labelsupport:
885
break;
886
default:
887
rc = -EINVAL;
888
printk(KERN_WARNING "SELinux: unknown mount option\n");
889
goto out_err;
890
891
}
892
}
893
894
rc = -ENOMEM;
895
opts->mnt_opts = kcalloc(NUM_SEL_MNT_OPTS, sizeof(char *), GFP_ATOMIC);
896
if (!opts->mnt_opts)
897
goto out_err;
898
899
opts->mnt_opts_flags = kcalloc(NUM_SEL_MNT_OPTS, sizeof(int), GFP_ATOMIC);
900
if (!opts->mnt_opts_flags) {
901
kfree(opts->mnt_opts);
902
goto out_err;
903
}
904
905
if (fscontext) {
906
opts->mnt_opts[num_mnt_opts] = fscontext;
907
opts->mnt_opts_flags[num_mnt_opts++] = FSCONTEXT_MNT;
908
}
909
if (context) {
910
opts->mnt_opts[num_mnt_opts] = context;
911
opts->mnt_opts_flags[num_mnt_opts++] = CONTEXT_MNT;
912
}
913
if (rootcontext) {
914
opts->mnt_opts[num_mnt_opts] = rootcontext;
915
opts->mnt_opts_flags[num_mnt_opts++] = ROOTCONTEXT_MNT;
916
}
917
if (defcontext) {
918
opts->mnt_opts[num_mnt_opts] = defcontext;
919
opts->mnt_opts_flags[num_mnt_opts++] = DEFCONTEXT_MNT;
920
}
921
922
opts->num_mnt_opts = num_mnt_opts;
923
return 0;
924
925
out_err:
926
kfree(context);
927
kfree(defcontext);
928
kfree(fscontext);
929
kfree(rootcontext);
930
return rc;
931
}
932
/*
933
* string mount options parsing and call set the sbsec
934
*/
935
static int superblock_doinit(struct super_block *sb, void *data)
936
{
937
int rc = 0;
938
char *options = data;
939
struct security_mnt_opts opts;
940
941
security_init_mnt_opts(&opts);
942
943
if (!data)
944
goto out;
945
946
BUG_ON(sb->s_type->fs_flags & FS_BINARY_MOUNTDATA);
947
948
rc = selinux_parse_opts_str(options, &opts);
949
if (rc)
950
goto out_err;
951
952
out:
953
rc = selinux_set_mnt_opts(sb, &opts);
954
955
out_err:
956
security_free_mnt_opts(&opts);
957
return rc;
958
}
959
960
static void selinux_write_opts(struct seq_file *m,
961
struct security_mnt_opts *opts)
962
{
963
int i;
964
char *prefix;
965
966
for (i = 0; i < opts->num_mnt_opts; i++) {
967
char *has_comma;
968
969
if (opts->mnt_opts[i])
970
has_comma = strchr(opts->mnt_opts[i], ',');
971
else
972
has_comma = NULL;
973
974
switch (opts->mnt_opts_flags[i]) {
975
case CONTEXT_MNT:
976
prefix = CONTEXT_STR;
977
break;
978
case FSCONTEXT_MNT:
979
prefix = FSCONTEXT_STR;
980
break;
981
case ROOTCONTEXT_MNT:
982
prefix = ROOTCONTEXT_STR;
983
break;
984
case DEFCONTEXT_MNT:
985
prefix = DEFCONTEXT_STR;
986
break;
987
case SE_SBLABELSUPP:
988
seq_putc(m, ',');
989
seq_puts(m, LABELSUPP_STR);
990
continue;
991
default:
992
BUG();
993
return;
994
};
995
/* we need a comma before each option */
996
seq_putc(m, ',');
997
seq_puts(m, prefix);
998
if (has_comma)
999
seq_putc(m, '\"');
1000
seq_puts(m, opts->mnt_opts[i]);
1001
if (has_comma)
1002
seq_putc(m, '\"');
1003
}
1004
}
1005
1006
static int selinux_sb_show_options(struct seq_file *m, struct super_block *sb)
1007
{
1008
struct security_mnt_opts opts;
1009
int rc;
1010
1011
rc = selinux_get_mnt_opts(sb, &opts);
1012
if (rc) {
1013
/* before policy load we may get EINVAL, don't show anything */
1014
if (rc == -EINVAL)
1015
rc = 0;
1016
return rc;
1017
}
1018
1019
selinux_write_opts(m, &opts);
1020
1021
security_free_mnt_opts(&opts);
1022
1023
return rc;
1024
}
1025
1026
static inline u16 inode_mode_to_security_class(umode_t mode)
1027
{
1028
switch (mode & S_IFMT) {
1029
case S_IFSOCK:
1030
return SECCLASS_SOCK_FILE;
1031
case S_IFLNK:
1032
return SECCLASS_LNK_FILE;
1033
case S_IFREG:
1034
return SECCLASS_FILE;
1035
case S_IFBLK:
1036
return SECCLASS_BLK_FILE;
1037
case S_IFDIR:
1038
return SECCLASS_DIR;
1039
case S_IFCHR:
1040
return SECCLASS_CHR_FILE;
1041
case S_IFIFO:
1042
return SECCLASS_FIFO_FILE;
1043
1044
}
1045
1046
return SECCLASS_FILE;
1047
}
1048
1049
static inline int default_protocol_stream(int protocol)
1050
{
1051
return (protocol == IPPROTO_IP || protocol == IPPROTO_TCP);
1052
}
1053
1054
static inline int default_protocol_dgram(int protocol)
1055
{
1056
return (protocol == IPPROTO_IP || protocol == IPPROTO_UDP);
1057
}
1058
1059
static inline u16 socket_type_to_security_class(int family, int type, int protocol)
1060
{
1061
switch (family) {
1062
case PF_UNIX:
1063
switch (type) {
1064
case SOCK_STREAM:
1065
case SOCK_SEQPACKET:
1066
return SECCLASS_UNIX_STREAM_SOCKET;
1067
case SOCK_DGRAM:
1068
return SECCLASS_UNIX_DGRAM_SOCKET;
1069
}
1070
break;
1071
case PF_INET:
1072
case PF_INET6:
1073
switch (type) {
1074
case SOCK_STREAM:
1075
if (default_protocol_stream(protocol))
1076
return SECCLASS_TCP_SOCKET;
1077
else
1078
return SECCLASS_RAWIP_SOCKET;
1079
case SOCK_DGRAM:
1080
if (default_protocol_dgram(protocol))
1081
return SECCLASS_UDP_SOCKET;
1082
else
1083
return SECCLASS_RAWIP_SOCKET;
1084
case SOCK_DCCP:
1085
return SECCLASS_DCCP_SOCKET;
1086
default:
1087
return SECCLASS_RAWIP_SOCKET;
1088
}
1089
break;
1090
case PF_NETLINK:
1091
switch (protocol) {
1092
case NETLINK_ROUTE:
1093
return SECCLASS_NETLINK_ROUTE_SOCKET;
1094
case NETLINK_FIREWALL:
1095
return SECCLASS_NETLINK_FIREWALL_SOCKET;
1096
case NETLINK_INET_DIAG:
1097
return SECCLASS_NETLINK_TCPDIAG_SOCKET;
1098
case NETLINK_NFLOG:
1099
return SECCLASS_NETLINK_NFLOG_SOCKET;
1100
case NETLINK_XFRM:
1101
return SECCLASS_NETLINK_XFRM_SOCKET;
1102
case NETLINK_SELINUX:
1103
return SECCLASS_NETLINK_SELINUX_SOCKET;
1104
case NETLINK_AUDIT:
1105
return SECCLASS_NETLINK_AUDIT_SOCKET;
1106
case NETLINK_IP6_FW:
1107
return SECCLASS_NETLINK_IP6FW_SOCKET;
1108
case NETLINK_DNRTMSG:
1109
return SECCLASS_NETLINK_DNRT_SOCKET;
1110
case NETLINK_KOBJECT_UEVENT:
1111
return SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET;
1112
default:
1113
return SECCLASS_NETLINK_SOCKET;
1114
}
1115
case PF_PACKET:
1116
return SECCLASS_PACKET_SOCKET;
1117
case PF_KEY:
1118
return SECCLASS_KEY_SOCKET;
1119
case PF_APPLETALK:
1120
return SECCLASS_APPLETALK_SOCKET;
1121
}
1122
1123
return SECCLASS_SOCKET;
1124
}
1125
1126
#ifdef CONFIG_PROC_FS
1127
static int selinux_proc_get_sid(struct dentry *dentry,
1128
u16 tclass,
1129
u32 *sid)
1130
{
1131
int rc;
1132
char *buffer, *path;
1133
1134
buffer = (char *)__get_free_page(GFP_KERNEL);
1135
if (!buffer)
1136
return -ENOMEM;
1137
1138
path = dentry_path_raw(dentry, buffer, PAGE_SIZE);
1139
if (IS_ERR(path))
1140
rc = PTR_ERR(path);
1141
else {
1142
/* each process gets a /proc/PID/ entry. Strip off the
1143
* PID part to get a valid selinux labeling.
1144
* e.g. /proc/1/net/rpc/nfs -> /net/rpc/nfs */
1145
while (path[1] >= '0' && path[1] <= '9') {
1146
path[1] = '/';
1147
path++;
1148
}
1149
rc = security_genfs_sid("proc", path, tclass, sid);
1150
}
1151
free_page((unsigned long)buffer);
1152
return rc;
1153
}
1154
#else
1155
static int selinux_proc_get_sid(struct dentry *dentry,
1156
u16 tclass,
1157
u32 *sid)
1158
{
1159
return -EINVAL;
1160
}
1161
#endif
1162
1163
/* The inode's security attributes must be initialized before first use. */
1164
static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
1165
{
1166
struct superblock_security_struct *sbsec = NULL;
1167
struct inode_security_struct *isec = inode->i_security;
1168
u32 sid;
1169
struct dentry *dentry;
1170
#define INITCONTEXTLEN 255
1171
char *context = NULL;
1172
unsigned len = 0;
1173
int rc = 0;
1174
1175
if (isec->initialized)
1176
goto out;
1177
1178
mutex_lock(&isec->lock);
1179
if (isec->initialized)
1180
goto out_unlock;
1181
1182
sbsec = inode->i_sb->s_security;
1183
if (!(sbsec->flags & SE_SBINITIALIZED)) {
1184
/* Defer initialization until selinux_complete_init,
1185
after the initial policy is loaded and the security
1186
server is ready to handle calls. */
1187
spin_lock(&sbsec->isec_lock);
1188
if (list_empty(&isec->list))
1189
list_add(&isec->list, &sbsec->isec_head);
1190
spin_unlock(&sbsec->isec_lock);
1191
goto out_unlock;
1192
}
1193
1194
switch (sbsec->behavior) {
1195
case SECURITY_FS_USE_XATTR:
1196
if (!inode->i_op->getxattr) {
1197
isec->sid = sbsec->def_sid;
1198
break;
1199
}
1200
1201
/* Need a dentry, since the xattr API requires one.
1202
Life would be simpler if we could just pass the inode. */
1203
if (opt_dentry) {
1204
/* Called from d_instantiate or d_splice_alias. */
1205
dentry = dget(opt_dentry);
1206
} else {
1207
/* Called from selinux_complete_init, try to find a dentry. */
1208
dentry = d_find_alias(inode);
1209
}
1210
if (!dentry) {
1211
/*
1212
* this is can be hit on boot when a file is accessed
1213
* before the policy is loaded. When we load policy we
1214
* may find inodes that have no dentry on the
1215
* sbsec->isec_head list. No reason to complain as these
1216
* will get fixed up the next time we go through
1217
* inode_doinit with a dentry, before these inodes could
1218
* be used again by userspace.
1219
*/
1220
goto out_unlock;
1221
}
1222
1223
len = INITCONTEXTLEN;
1224
context = kmalloc(len+1, GFP_NOFS);
1225
if (!context) {
1226
rc = -ENOMEM;
1227
dput(dentry);
1228
goto out_unlock;
1229
}
1230
context[len] = '\0';
1231
rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
1232
context, len);
1233
if (rc == -ERANGE) {
1234
kfree(context);
1235
1236
/* Need a larger buffer. Query for the right size. */
1237
rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
1238
NULL, 0);
1239
if (rc < 0) {
1240
dput(dentry);
1241
goto out_unlock;
1242
}
1243
len = rc;
1244
context = kmalloc(len+1, GFP_NOFS);
1245
if (!context) {
1246
rc = -ENOMEM;
1247
dput(dentry);
1248
goto out_unlock;
1249
}
1250
context[len] = '\0';
1251
rc = inode->i_op->getxattr(dentry,
1252
XATTR_NAME_SELINUX,
1253
context, len);
1254
}
1255
dput(dentry);
1256
if (rc < 0) {
1257
if (rc != -ENODATA) {
1258
printk(KERN_WARNING "SELinux: %s: getxattr returned "
1259
"%d for dev=%s ino=%ld\n", __func__,
1260
-rc, inode->i_sb->s_id, inode->i_ino);
1261
kfree(context);
1262
goto out_unlock;
1263
}
1264
/* Map ENODATA to the default file SID */
1265
sid = sbsec->def_sid;
1266
rc = 0;
1267
} else {
1268
rc = security_context_to_sid_default(context, rc, &sid,
1269
sbsec->def_sid,
1270
GFP_NOFS);
1271
if (rc) {
1272
char *dev = inode->i_sb->s_id;
1273
unsigned long ino = inode->i_ino;
1274
1275
if (rc == -EINVAL) {
1276
if (printk_ratelimit())
1277
printk(KERN_NOTICE "SELinux: inode=%lu on dev=%s was found to have an invalid "
1278
"context=%s. This indicates you may need to relabel the inode or the "
1279
"filesystem in question.\n", ino, dev, context);
1280
} else {
1281
printk(KERN_WARNING "SELinux: %s: context_to_sid(%s) "
1282
"returned %d for dev=%s ino=%ld\n",
1283
__func__, context, -rc, dev, ino);
1284
}
1285
kfree(context);
1286
/* Leave with the unlabeled SID */
1287
rc = 0;
1288
break;
1289
}
1290
}
1291
kfree(context);
1292
isec->sid = sid;
1293
break;
1294
case SECURITY_FS_USE_TASK:
1295
isec->sid = isec->task_sid;
1296
break;
1297
case SECURITY_FS_USE_TRANS:
1298
/* Default to the fs SID. */
1299
isec->sid = sbsec->sid;
1300
1301
/* Try to obtain a transition SID. */
1302
isec->sclass = inode_mode_to_security_class(inode->i_mode);
1303
rc = security_transition_sid(isec->task_sid, sbsec->sid,
1304
isec->sclass, NULL, &sid);
1305
if (rc)
1306
goto out_unlock;
1307
isec->sid = sid;
1308
break;
1309
case SECURITY_FS_USE_MNTPOINT:
1310
isec->sid = sbsec->mntpoint_sid;
1311
break;
1312
default:
1313
/* Default to the fs superblock SID. */
1314
isec->sid = sbsec->sid;
1315
1316
if ((sbsec->flags & SE_SBPROC) && !S_ISLNK(inode->i_mode)) {
1317
if (opt_dentry) {
1318
isec->sclass = inode_mode_to_security_class(inode->i_mode);
1319
rc = selinux_proc_get_sid(opt_dentry,
1320
isec->sclass,
1321
&sid);
1322
if (rc)
1323
goto out_unlock;
1324
isec->sid = sid;
1325
}
1326
}
1327
break;
1328
}
1329
1330
isec->initialized = 1;
1331
1332
out_unlock:
1333
mutex_unlock(&isec->lock);
1334
out:
1335
if (isec->sclass == SECCLASS_FILE)
1336
isec->sclass = inode_mode_to_security_class(inode->i_mode);
1337
return rc;
1338
}
1339
1340
/* Convert a Linux signal to an access vector. */
1341
static inline u32 signal_to_av(int sig)
1342
{
1343
u32 perm = 0;
1344
1345
switch (sig) {
1346
case SIGCHLD:
1347
/* Commonly granted from child to parent. */
1348
perm = PROCESS__SIGCHLD;
1349
break;
1350
case SIGKILL:
1351
/* Cannot be caught or ignored */
1352
perm = PROCESS__SIGKILL;
1353
break;
1354
case SIGSTOP:
1355
/* Cannot be caught or ignored */
1356
perm = PROCESS__SIGSTOP;
1357
break;
1358
default:
1359
/* All other signals. */
1360
perm = PROCESS__SIGNAL;
1361
break;
1362
}
1363
1364
return perm;
1365
}
1366
1367
/*
1368
* Check permission between a pair of credentials
1369
* fork check, ptrace check, etc.
1370
*/
1371
static int cred_has_perm(const struct cred *actor,
1372
const struct cred *target,
1373
u32 perms)
1374
{
1375
u32 asid = cred_sid(actor), tsid = cred_sid(target);
1376
1377
return avc_has_perm(asid, tsid, SECCLASS_PROCESS, perms, NULL);
1378
}
1379
1380
/*
1381
* Check permission between a pair of tasks, e.g. signal checks,
1382
* fork check, ptrace check, etc.
1383
* tsk1 is the actor and tsk2 is the target
1384
* - this uses the default subjective creds of tsk1
1385
*/
1386
static int task_has_perm(const struct task_struct *tsk1,
1387
const struct task_struct *tsk2,
1388
u32 perms)
1389
{
1390
const struct task_security_struct *__tsec1, *__tsec2;
1391
u32 sid1, sid2;
1392
1393
rcu_read_lock();
1394
__tsec1 = __task_cred(tsk1)->security; sid1 = __tsec1->sid;
1395
__tsec2 = __task_cred(tsk2)->security; sid2 = __tsec2->sid;
1396
rcu_read_unlock();
1397
return avc_has_perm(sid1, sid2, SECCLASS_PROCESS, perms, NULL);
1398
}
1399
1400
/*
1401
* Check permission between current and another task, e.g. signal checks,
1402
* fork check, ptrace check, etc.
1403
* current is the actor and tsk2 is the target
1404
* - this uses current's subjective creds
1405
*/
1406
static int current_has_perm(const struct task_struct *tsk,
1407
u32 perms)
1408
{
1409
u32 sid, tsid;
1410
1411
sid = current_sid();
1412
tsid = task_sid(tsk);
1413
return avc_has_perm(sid, tsid, SECCLASS_PROCESS, perms, NULL);
1414
}
1415
1416
#if CAP_LAST_CAP > 63
1417
#error Fix SELinux to handle capabilities > 63.
1418
#endif
1419
1420
/* Check whether a task is allowed to use a capability. */
1421
static int task_has_capability(struct task_struct *tsk,
1422
const struct cred *cred,
1423
int cap, int audit)
1424
{
1425
struct common_audit_data ad;
1426
struct av_decision avd;
1427
u16 sclass;
1428
u32 sid = cred_sid(cred);
1429
u32 av = CAP_TO_MASK(cap);
1430
int rc;
1431
1432
COMMON_AUDIT_DATA_INIT(&ad, CAP);
1433
ad.tsk = tsk;
1434
ad.u.cap = cap;
1435
1436
switch (CAP_TO_INDEX(cap)) {
1437
case 0:
1438
sclass = SECCLASS_CAPABILITY;
1439
break;
1440
case 1:
1441
sclass = SECCLASS_CAPABILITY2;
1442
break;
1443
default:
1444
printk(KERN_ERR
1445
"SELinux: out of range capability %d\n", cap);
1446
BUG();
1447
return -EINVAL;
1448
}
1449
1450
rc = avc_has_perm_noaudit(sid, sid, sclass, av, 0, &avd);
1451
if (audit == SECURITY_CAP_AUDIT) {
1452
int rc2 = avc_audit(sid, sid, sclass, av, &avd, rc, &ad, 0);
1453
if (rc2)
1454
return rc2;
1455
}
1456
return rc;
1457
}
1458
1459
/* Check whether a task is allowed to use a system operation. */
1460
static int task_has_system(struct task_struct *tsk,
1461
u32 perms)
1462
{
1463
u32 sid = task_sid(tsk);
1464
1465
return avc_has_perm(sid, SECINITSID_KERNEL,
1466
SECCLASS_SYSTEM, perms, NULL);
1467
}
1468
1469
/* Check whether a task has a particular permission to an inode.
1470
The 'adp' parameter is optional and allows other audit
1471
data to be passed (e.g. the dentry). */
1472
static int inode_has_perm(const struct cred *cred,
1473
struct inode *inode,
1474
u32 perms,
1475
struct common_audit_data *adp,
1476
unsigned flags)
1477
{
1478
struct inode_security_struct *isec;
1479
u32 sid;
1480
1481
validate_creds(cred);
1482
1483
if (unlikely(IS_PRIVATE(inode)))
1484
return 0;
1485
1486
sid = cred_sid(cred);
1487
isec = inode->i_security;
1488
1489
return avc_has_perm_flags(sid, isec->sid, isec->sclass, perms, adp, flags);
1490
}
1491
1492
static int inode_has_perm_noadp(const struct cred *cred,
1493
struct inode *inode,
1494
u32 perms,
1495
unsigned flags)
1496
{
1497
struct common_audit_data ad;
1498
1499
COMMON_AUDIT_DATA_INIT(&ad, INODE);
1500
ad.u.inode = inode;
1501
return inode_has_perm(cred, inode, perms, &ad, flags);
1502
}
1503
1504
/* Same as inode_has_perm, but pass explicit audit data containing
1505
the dentry to help the auditing code to more easily generate the
1506
pathname if needed. */
1507
static inline int dentry_has_perm(const struct cred *cred,
1508
struct dentry *dentry,
1509
u32 av)
1510
{
1511
struct inode *inode = dentry->d_inode;
1512
struct common_audit_data ad;
1513
1514
COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
1515
ad.u.dentry = dentry;
1516
return inode_has_perm(cred, inode, av, &ad, 0);
1517
}
1518
1519
/* Same as inode_has_perm, but pass explicit audit data containing
1520
the path to help the auditing code to more easily generate the
1521
pathname if needed. */
1522
static inline int path_has_perm(const struct cred *cred,
1523
struct path *path,
1524
u32 av)
1525
{
1526
struct inode *inode = path->dentry->d_inode;
1527
struct common_audit_data ad;
1528
1529
COMMON_AUDIT_DATA_INIT(&ad, PATH);
1530
ad.u.path = *path;
1531
return inode_has_perm(cred, inode, av, &ad, 0);
1532
}
1533
1534
/* Check whether a task can use an open file descriptor to
1535
access an inode in a given way. Check access to the
1536
descriptor itself, and then use dentry_has_perm to
1537
check a particular permission to the file.
1538
Access to the descriptor is implicitly granted if it
1539
has the same SID as the process. If av is zero, then
1540
access to the file is not checked, e.g. for cases
1541
where only the descriptor is affected like seek. */
1542
static int file_has_perm(const struct cred *cred,
1543
struct file *file,
1544
u32 av)
1545
{
1546
struct file_security_struct *fsec = file->f_security;
1547
struct inode *inode = file->f_path.dentry->d_inode;
1548
struct common_audit_data ad;
1549
u32 sid = cred_sid(cred);
1550
int rc;
1551
1552
COMMON_AUDIT_DATA_INIT(&ad, PATH);
1553
ad.u.path = file->f_path;
1554
1555
if (sid != fsec->sid) {
1556
rc = avc_has_perm(sid, fsec->sid,
1557
SECCLASS_FD,
1558
FD__USE,
1559
&ad);
1560
if (rc)
1561
goto out;
1562
}
1563
1564
/* av is zero if only checking access to the descriptor. */
1565
rc = 0;
1566
if (av)
1567
rc = inode_has_perm(cred, inode, av, &ad, 0);
1568
1569
out:
1570
return rc;
1571
}
1572
1573
/* Check whether a task can create a file. */
1574
static int may_create(struct inode *dir,
1575
struct dentry *dentry,
1576
u16 tclass)
1577
{
1578
const struct task_security_struct *tsec = current_security();
1579
struct inode_security_struct *dsec;
1580
struct superblock_security_struct *sbsec;
1581
u32 sid, newsid;
1582
struct common_audit_data ad;
1583
int rc;
1584
1585
dsec = dir->i_security;
1586
sbsec = dir->i_sb->s_security;
1587
1588
sid = tsec->sid;
1589
newsid = tsec->create_sid;
1590
1591
COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
1592
ad.u.dentry = dentry;
1593
1594
rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR,
1595
DIR__ADD_NAME | DIR__SEARCH,
1596
&ad);
1597
if (rc)
1598
return rc;
1599
1600
if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) {
1601
rc = security_transition_sid(sid, dsec->sid, tclass,
1602
&dentry->d_name, &newsid);
1603
if (rc)
1604
return rc;
1605
}
1606
1607
rc = avc_has_perm(sid, newsid, tclass, FILE__CREATE, &ad);
1608
if (rc)
1609
return rc;
1610
1611
return avc_has_perm(newsid, sbsec->sid,
1612
SECCLASS_FILESYSTEM,
1613
FILESYSTEM__ASSOCIATE, &ad);
1614
}
1615
1616
/* Check whether a task can create a key. */
1617
static int may_create_key(u32 ksid,
1618
struct task_struct *ctx)
1619
{
1620
u32 sid = task_sid(ctx);
1621
1622
return avc_has_perm(sid, ksid, SECCLASS_KEY, KEY__CREATE, NULL);
1623
}
1624
1625
#define MAY_LINK 0
1626
#define MAY_UNLINK 1
1627
#define MAY_RMDIR 2
1628
1629
/* Check whether a task can link, unlink, or rmdir a file/directory. */
1630
static int may_link(struct inode *dir,
1631
struct dentry *dentry,
1632
int kind)
1633
1634
{
1635
struct inode_security_struct *dsec, *isec;
1636
struct common_audit_data ad;
1637
u32 sid = current_sid();
1638
u32 av;
1639
int rc;
1640
1641
dsec = dir->i_security;
1642
isec = dentry->d_inode->i_security;
1643
1644
COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
1645
ad.u.dentry = dentry;
1646
1647
av = DIR__SEARCH;
1648
av |= (kind ? DIR__REMOVE_NAME : DIR__ADD_NAME);
1649
rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR, av, &ad);
1650
if (rc)
1651
return rc;
1652
1653
switch (kind) {
1654
case MAY_LINK:
1655
av = FILE__LINK;
1656
break;
1657
case MAY_UNLINK:
1658
av = FILE__UNLINK;
1659
break;
1660
case MAY_RMDIR:
1661
av = DIR__RMDIR;
1662
break;
1663
default:
1664
printk(KERN_WARNING "SELinux: %s: unrecognized kind %d\n",
1665
__func__, kind);
1666
return 0;
1667
}
1668
1669
rc = avc_has_perm(sid, isec->sid, isec->sclass, av, &ad);
1670
return rc;
1671
}
1672
1673
static inline int may_rename(struct inode *old_dir,
1674
struct dentry *old_dentry,
1675
struct inode *new_dir,
1676
struct dentry *new_dentry)
1677
{
1678
struct inode_security_struct *old_dsec, *new_dsec, *old_isec, *new_isec;
1679
struct common_audit_data ad;
1680
u32 sid = current_sid();
1681
u32 av;
1682
int old_is_dir, new_is_dir;
1683
int rc;
1684
1685
old_dsec = old_dir->i_security;
1686
old_isec = old_dentry->d_inode->i_security;
1687
old_is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
1688
new_dsec = new_dir->i_security;
1689
1690
COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
1691
1692
ad.u.dentry = old_dentry;
1693
rc = avc_has_perm(sid, old_dsec->sid, SECCLASS_DIR,
1694
DIR__REMOVE_NAME | DIR__SEARCH, &ad);
1695
if (rc)
1696
return rc;
1697
rc = avc_has_perm(sid, old_isec->sid,
1698
old_isec->sclass, FILE__RENAME, &ad);
1699
if (rc)
1700
return rc;
1701
if (old_is_dir && new_dir != old_dir) {
1702
rc = avc_has_perm(sid, old_isec->sid,
1703
old_isec->sclass, DIR__REPARENT, &ad);
1704
if (rc)
1705
return rc;
1706
}
1707
1708
ad.u.dentry = new_dentry;
1709
av = DIR__ADD_NAME | DIR__SEARCH;
1710
if (new_dentry->d_inode)
1711
av |= DIR__REMOVE_NAME;
1712
rc = avc_has_perm(sid, new_dsec->sid, SECCLASS_DIR, av, &ad);
1713
if (rc)
1714
return rc;
1715
if (new_dentry->d_inode) {
1716
new_isec = new_dentry->d_inode->i_security;
1717
new_is_dir = S_ISDIR(new_dentry->d_inode->i_mode);
1718
rc = avc_has_perm(sid, new_isec->sid,
1719
new_isec->sclass,
1720
(new_is_dir ? DIR__RMDIR : FILE__UNLINK), &ad);
1721
if (rc)
1722
return rc;
1723
}
1724
1725
return 0;
1726
}
1727
1728
/* Check whether a task can perform a filesystem operation. */
1729
static int superblock_has_perm(const struct cred *cred,
1730
struct super_block *sb,
1731
u32 perms,
1732
struct common_audit_data *ad)
1733
{
1734
struct superblock_security_struct *sbsec;
1735
u32 sid = cred_sid(cred);
1736
1737
sbsec = sb->s_security;
1738
return avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM, perms, ad);
1739
}
1740
1741
/* Convert a Linux mode and permission mask to an access vector. */
1742
static inline u32 file_mask_to_av(int mode, int mask)
1743
{
1744
u32 av = 0;
1745
1746
if ((mode & S_IFMT) != S_IFDIR) {
1747
if (mask & MAY_EXEC)
1748
av |= FILE__EXECUTE;
1749
if (mask & MAY_READ)
1750
av |= FILE__READ;
1751
1752
if (mask & MAY_APPEND)
1753
av |= FILE__APPEND;
1754
else if (mask & MAY_WRITE)
1755
av |= FILE__WRITE;
1756
1757
} else {
1758
if (mask & MAY_EXEC)
1759
av |= DIR__SEARCH;
1760
if (mask & MAY_WRITE)
1761
av |= DIR__WRITE;
1762
if (mask & MAY_READ)
1763
av |= DIR__READ;
1764
}
1765
1766
return av;
1767
}
1768
1769
/* Convert a Linux file to an access vector. */
1770
static inline u32 file_to_av(struct file *file)
1771
{
1772
u32 av = 0;
1773
1774
if (file->f_mode & FMODE_READ)
1775
av |= FILE__READ;
1776
if (file->f_mode & FMODE_WRITE) {
1777
if (file->f_flags & O_APPEND)
1778
av |= FILE__APPEND;
1779
else
1780
av |= FILE__WRITE;
1781
}
1782
if (!av) {
1783
/*
1784
* Special file opened with flags 3 for ioctl-only use.
1785
*/
1786
av = FILE__IOCTL;
1787
}
1788
1789
return av;
1790
}
1791
1792
/*
1793
* Convert a file to an access vector and include the correct open
1794
* open permission.
1795
*/
1796
static inline u32 open_file_to_av(struct file *file)
1797
{
1798
u32 av = file_to_av(file);
1799
1800
if (selinux_policycap_openperm)
1801
av |= FILE__OPEN;
1802
1803
return av;
1804
}
1805
1806
/* Hook functions begin here. */
1807
1808
static int selinux_ptrace_access_check(struct task_struct *child,
1809
unsigned int mode)
1810
{
1811
int rc;
1812
1813
rc = cap_ptrace_access_check(child, mode);
1814
if (rc)
1815
return rc;
1816
1817
if (mode == PTRACE_MODE_READ) {
1818
u32 sid = current_sid();
1819
u32 csid = task_sid(child);
1820
return avc_has_perm(sid, csid, SECCLASS_FILE, FILE__READ, NULL);
1821
}
1822
1823
return current_has_perm(child, PROCESS__PTRACE);
1824
}
1825
1826
static int selinux_ptrace_traceme(struct task_struct *parent)
1827
{
1828
int rc;
1829
1830
rc = cap_ptrace_traceme(parent);
1831
if (rc)
1832
return rc;
1833
1834
return task_has_perm(parent, current, PROCESS__PTRACE);
1835
}
1836
1837
static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
1838
kernel_cap_t *inheritable, kernel_cap_t *permitted)
1839
{
1840
int error;
1841
1842
error = current_has_perm(target, PROCESS__GETCAP);
1843
if (error)
1844
return error;
1845
1846
return cap_capget(target, effective, inheritable, permitted);
1847
}
1848
1849
static int selinux_capset(struct cred *new, const struct cred *old,
1850
const kernel_cap_t *effective,
1851
const kernel_cap_t *inheritable,
1852
const kernel_cap_t *permitted)
1853
{
1854
int error;
1855
1856
error = cap_capset(new, old,
1857
effective, inheritable, permitted);
1858
if (error)
1859
return error;
1860
1861
return cred_has_perm(old, new, PROCESS__SETCAP);
1862
}
1863
1864
/*
1865
* (This comment used to live with the selinux_task_setuid hook,
1866
* which was removed).
1867
*
1868
* Since setuid only affects the current process, and since the SELinux
1869
* controls are not based on the Linux identity attributes, SELinux does not
1870
* need to control this operation. However, SELinux does control the use of
1871
* the CAP_SETUID and CAP_SETGID capabilities using the capable hook.
1872
*/
1873
1874
static int selinux_capable(struct task_struct *tsk, const struct cred *cred,
1875
struct user_namespace *ns, int cap, int audit)
1876
{
1877
int rc;
1878
1879
rc = cap_capable(tsk, cred, ns, cap, audit);
1880
if (rc)
1881
return rc;
1882
1883
return task_has_capability(tsk, cred, cap, audit);
1884
}
1885
1886
static int selinux_quotactl(int cmds, int type, int id, struct super_block *sb)
1887
{
1888
const struct cred *cred = current_cred();
1889
int rc = 0;
1890
1891
if (!sb)
1892
return 0;
1893
1894
switch (cmds) {
1895
case Q_SYNC:
1896
case Q_QUOTAON:
1897
case Q_QUOTAOFF:
1898
case Q_SETINFO:
1899
case Q_SETQUOTA:
1900
rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAMOD, NULL);
1901
break;
1902
case Q_GETFMT:
1903
case Q_GETINFO:
1904
case Q_GETQUOTA:
1905
rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAGET, NULL);
1906
break;
1907
default:
1908
rc = 0; /* let the kernel handle invalid cmds */
1909
break;
1910
}
1911
return rc;
1912
}
1913
1914
static int selinux_quota_on(struct dentry *dentry)
1915
{
1916
const struct cred *cred = current_cred();
1917
1918
return dentry_has_perm(cred, dentry, FILE__QUOTAON);
1919
}
1920
1921
static int selinux_syslog(int type)
1922
{
1923
int rc;
1924
1925
switch (type) {
1926
case SYSLOG_ACTION_READ_ALL: /* Read last kernel messages */
1927
case SYSLOG_ACTION_SIZE_BUFFER: /* Return size of the log buffer */
1928
rc = task_has_system(current, SYSTEM__SYSLOG_READ);
1929
break;
1930
case SYSLOG_ACTION_CONSOLE_OFF: /* Disable logging to console */
1931
case SYSLOG_ACTION_CONSOLE_ON: /* Enable logging to console */
1932
/* Set level of messages printed to console */
1933
case SYSLOG_ACTION_CONSOLE_LEVEL:
1934
rc = task_has_system(current, SYSTEM__SYSLOG_CONSOLE);
1935
break;
1936
case SYSLOG_ACTION_CLOSE: /* Close log */
1937
case SYSLOG_ACTION_OPEN: /* Open log */
1938
case SYSLOG_ACTION_READ: /* Read from log */
1939
case SYSLOG_ACTION_READ_CLEAR: /* Read/clear last kernel messages */
1940
case SYSLOG_ACTION_CLEAR: /* Clear ring buffer */
1941
default:
1942
rc = task_has_system(current, SYSTEM__SYSLOG_MOD);
1943
break;
1944
}
1945
return rc;
1946
}
1947
1948
/*
1949
* Check that a process has enough memory to allocate a new virtual
1950
* mapping. 0 means there is enough memory for the allocation to
1951
* succeed and -ENOMEM implies there is not.
1952
*
1953
* Do not audit the selinux permission check, as this is applied to all
1954
* processes that allocate mappings.
1955
*/
1956
static int selinux_vm_enough_memory(struct mm_struct *mm, long pages)
1957
{
1958
int rc, cap_sys_admin = 0;
1959
1960
rc = selinux_capable(current, current_cred(),
1961
&init_user_ns, CAP_SYS_ADMIN,
1962
SECURITY_CAP_NOAUDIT);
1963
if (rc == 0)
1964
cap_sys_admin = 1;
1965
1966
return __vm_enough_memory(mm, pages, cap_sys_admin);
1967
}
1968
1969
/* binprm security operations */
1970
1971
static int selinux_bprm_set_creds(struct linux_binprm *bprm)
1972
{
1973
const struct task_security_struct *old_tsec;
1974
struct task_security_struct *new_tsec;
1975
struct inode_security_struct *isec;
1976
struct common_audit_data ad;
1977
struct inode *inode = bprm->file->f_path.dentry->d_inode;
1978
int rc;
1979
1980
rc = cap_bprm_set_creds(bprm);
1981
if (rc)
1982
return rc;
1983
1984
/* SELinux context only depends on initial program or script and not
1985
* the script interpreter */
1986
if (bprm->cred_prepared)
1987
return 0;
1988
1989
old_tsec = current_security();
1990
new_tsec = bprm->cred->security;
1991
isec = inode->i_security;
1992
1993
/* Default to the current task SID. */
1994
new_tsec->sid = old_tsec->sid;
1995
new_tsec->osid = old_tsec->sid;
1996
1997
/* Reset fs, key, and sock SIDs on execve. */
1998
new_tsec->create_sid = 0;
1999
new_tsec->keycreate_sid = 0;
2000
new_tsec->sockcreate_sid = 0;
2001
2002
if (old_tsec->exec_sid) {
2003
new_tsec->sid = old_tsec->exec_sid;
2004
/* Reset exec SID on execve. */
2005
new_tsec->exec_sid = 0;
2006
} else {
2007
/* Check for a default transition on this program. */
2008
rc = security_transition_sid(old_tsec->sid, isec->sid,
2009
SECCLASS_PROCESS, NULL,
2010
&new_tsec->sid);
2011
if (rc)
2012
return rc;
2013
}
2014
2015
COMMON_AUDIT_DATA_INIT(&ad, PATH);
2016
ad.u.path = bprm->file->f_path;
2017
2018
if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID)
2019
new_tsec->sid = old_tsec->sid;
2020
2021
if (new_tsec->sid == old_tsec->sid) {
2022
rc = avc_has_perm(old_tsec->sid, isec->sid,
2023
SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, &ad);
2024
if (rc)
2025
return rc;
2026
} else {
2027
/* Check permissions for the transition. */
2028
rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2029
SECCLASS_PROCESS, PROCESS__TRANSITION, &ad);
2030
if (rc)
2031
return rc;
2032
2033
rc = avc_has_perm(new_tsec->sid, isec->sid,
2034
SECCLASS_FILE, FILE__ENTRYPOINT, &ad);
2035
if (rc)
2036
return rc;
2037
2038
/* Check for shared state */
2039
if (bprm->unsafe & LSM_UNSAFE_SHARE) {
2040
rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2041
SECCLASS_PROCESS, PROCESS__SHARE,
2042
NULL);
2043
if (rc)
2044
return -EPERM;
2045
}
2046
2047
/* Make sure that anyone attempting to ptrace over a task that
2048
* changes its SID has the appropriate permit */
2049
if (bprm->unsafe &
2050
(LSM_UNSAFE_PTRACE | LSM_UNSAFE_PTRACE_CAP)) {
2051
struct task_struct *tracer;
2052
struct task_security_struct *sec;
2053
u32 ptsid = 0;
2054
2055
rcu_read_lock();
2056
tracer = tracehook_tracer_task(current);
2057
if (likely(tracer != NULL)) {
2058
sec = __task_cred(tracer)->security;
2059
ptsid = sec->sid;
2060
}
2061
rcu_read_unlock();
2062
2063
if (ptsid != 0) {
2064
rc = avc_has_perm(ptsid, new_tsec->sid,
2065
SECCLASS_PROCESS,
2066
PROCESS__PTRACE, NULL);
2067
if (rc)
2068
return -EPERM;
2069
}
2070
}
2071
2072
/* Clear any possibly unsafe personality bits on exec: */
2073
bprm->per_clear |= PER_CLEAR_ON_SETID;
2074
}
2075
2076
return 0;
2077
}
2078
2079
static int selinux_bprm_secureexec(struct linux_binprm *bprm)
2080
{
2081
const struct task_security_struct *tsec = current_security();
2082
u32 sid, osid;
2083
int atsecure = 0;
2084
2085
sid = tsec->sid;
2086
osid = tsec->osid;
2087
2088
if (osid != sid) {
2089
/* Enable secure mode for SIDs transitions unless
2090
the noatsecure permission is granted between
2091
the two SIDs, i.e. ahp returns 0. */
2092
atsecure = avc_has_perm(osid, sid,
2093
SECCLASS_PROCESS,
2094
PROCESS__NOATSECURE, NULL);
2095
}
2096
2097
return (atsecure || cap_bprm_secureexec(bprm));
2098
}
2099
2100
extern struct vfsmount *selinuxfs_mount;
2101
extern struct dentry *selinux_null;
2102
2103
/* Derived from fs/exec.c:flush_old_files. */
2104
static inline void flush_unauthorized_files(const struct cred *cred,
2105
struct files_struct *files)
2106
{
2107
struct common_audit_data ad;
2108
struct file *file, *devnull = NULL;
2109
struct tty_struct *tty;
2110
struct fdtable *fdt;
2111
long j = -1;
2112
int drop_tty = 0;
2113
2114
tty = get_current_tty();
2115
if (tty) {
2116
spin_lock(&tty_files_lock);
2117
if (!list_empty(&tty->tty_files)) {
2118
struct tty_file_private *file_priv;
2119
struct inode *inode;
2120
2121
/* Revalidate access to controlling tty.
2122
Use inode_has_perm on the tty inode directly rather
2123
than using file_has_perm, as this particular open
2124
file may belong to another process and we are only
2125
interested in the inode-based check here. */
2126
file_priv = list_first_entry(&tty->tty_files,
2127
struct tty_file_private, list);
2128
file = file_priv->file;
2129
inode = file->f_path.dentry->d_inode;
2130
if (inode_has_perm_noadp(cred, inode,
2131
FILE__READ | FILE__WRITE, 0)) {
2132
drop_tty = 1;
2133
}
2134
}
2135
spin_unlock(&tty_files_lock);
2136
tty_kref_put(tty);
2137
}
2138
/* Reset controlling tty. */
2139
if (drop_tty)
2140
no_tty();
2141
2142
/* Revalidate access to inherited open files. */
2143
2144
COMMON_AUDIT_DATA_INIT(&ad, INODE);
2145
2146
spin_lock(&files->file_lock);
2147
for (;;) {
2148
unsigned long set, i;
2149
int fd;
2150
2151
j++;
2152
i = j * __NFDBITS;
2153
fdt = files_fdtable(files);
2154
if (i >= fdt->max_fds)
2155
break;
2156
set = fdt->open_fds->fds_bits[j];
2157
if (!set)
2158
continue;
2159
spin_unlock(&files->file_lock);
2160
for ( ; set ; i++, set >>= 1) {
2161
if (set & 1) {
2162
file = fget(i);
2163
if (!file)
2164
continue;
2165
if (file_has_perm(cred,
2166
file,
2167
file_to_av(file))) {
2168
sys_close(i);
2169
fd = get_unused_fd();
2170
if (fd != i) {
2171
if (fd >= 0)
2172
put_unused_fd(fd);
2173
fput(file);
2174
continue;
2175
}
2176
if (devnull) {
2177
get_file(devnull);
2178
} else {
2179
devnull = dentry_open(
2180
dget(selinux_null),
2181
mntget(selinuxfs_mount),
2182
O_RDWR, cred);
2183
if (IS_ERR(devnull)) {
2184
devnull = NULL;
2185
put_unused_fd(fd);
2186
fput(file);
2187
continue;
2188
}
2189
}
2190
fd_install(fd, devnull);
2191
}
2192
fput(file);
2193
}
2194
}
2195
spin_lock(&files->file_lock);
2196
2197
}
2198
spin_unlock(&files->file_lock);
2199
}
2200
2201
/*
2202
* Prepare a process for imminent new credential changes due to exec
2203
*/
2204
static void selinux_bprm_committing_creds(struct linux_binprm *bprm)
2205
{
2206
struct task_security_struct *new_tsec;
2207
struct rlimit *rlim, *initrlim;
2208
int rc, i;
2209
2210
new_tsec = bprm->cred->security;
2211
if (new_tsec->sid == new_tsec->osid)
2212
return;
2213
2214
/* Close files for which the new task SID is not authorized. */
2215
flush_unauthorized_files(bprm->cred, current->files);
2216
2217
/* Always clear parent death signal on SID transitions. */
2218
current->pdeath_signal = 0;
2219
2220
/* Check whether the new SID can inherit resource limits from the old
2221
* SID. If not, reset all soft limits to the lower of the current
2222
* task's hard limit and the init task's soft limit.
2223
*
2224
* Note that the setting of hard limits (even to lower them) can be
2225
* controlled by the setrlimit check. The inclusion of the init task's
2226
* soft limit into the computation is to avoid resetting soft limits
2227
* higher than the default soft limit for cases where the default is
2228
* lower than the hard limit, e.g. RLIMIT_CORE or RLIMIT_STACK.
2229
*/
2230
rc = avc_has_perm(new_tsec->osid, new_tsec->sid, SECCLASS_PROCESS,
2231
PROCESS__RLIMITINH, NULL);
2232
if (rc) {
2233
/* protect against do_prlimit() */
2234
task_lock(current);
2235
for (i = 0; i < RLIM_NLIMITS; i++) {
2236
rlim = current->signal->rlim + i;
2237
initrlim = init_task.signal->rlim + i;
2238
rlim->rlim_cur = min(rlim->rlim_max, initrlim->rlim_cur);
2239
}
2240
task_unlock(current);
2241
update_rlimit_cpu(current, rlimit(RLIMIT_CPU));
2242
}
2243
}
2244
2245
/*
2246
* Clean up the process immediately after the installation of new credentials
2247
* due to exec
2248
*/
2249
static void selinux_bprm_committed_creds(struct linux_binprm *bprm)
2250
{
2251
const struct task_security_struct *tsec = current_security();
2252
struct itimerval itimer;
2253
u32 osid, sid;
2254
int rc, i;
2255
2256
osid = tsec->osid;
2257
sid = tsec->sid;
2258
2259
if (sid == osid)
2260
return;
2261
2262
/* Check whether the new SID can inherit signal state from the old SID.
2263
* If not, clear itimers to avoid subsequent signal generation and
2264
* flush and unblock signals.
2265
*
2266
* This must occur _after_ the task SID has been updated so that any
2267
* kill done after the flush will be checked against the new SID.
2268
*/
2269
rc = avc_has_perm(osid, sid, SECCLASS_PROCESS, PROCESS__SIGINH, NULL);
2270
if (rc) {
2271
memset(&itimer, 0, sizeof itimer);
2272
for (i = 0; i < 3; i++)
2273
do_setitimer(i, &itimer, NULL);
2274
spin_lock_irq(&current->sighand->siglock);
2275
if (!(current->signal->flags & SIGNAL_GROUP_EXIT)) {
2276
__flush_signals(current);
2277
flush_signal_handlers(current, 1);
2278
sigemptyset(&current->blocked);
2279
}
2280
spin_unlock_irq(&current->sighand->siglock);
2281
}
2282
2283
/* Wake up the parent if it is waiting so that it can recheck
2284
* wait permission to the new task SID. */
2285
read_lock(&tasklist_lock);
2286
__wake_up_parent(current, current->real_parent);
2287
read_unlock(&tasklist_lock);
2288
}
2289
2290
/* superblock security operations */
2291
2292
static int selinux_sb_alloc_security(struct super_block *sb)
2293
{
2294
return superblock_alloc_security(sb);
2295
}
2296
2297
static void selinux_sb_free_security(struct super_block *sb)
2298
{
2299
superblock_free_security(sb);
2300
}
2301
2302
static inline int match_prefix(char *prefix, int plen, char *option, int olen)
2303
{
2304
if (plen > olen)
2305
return 0;
2306
2307
return !memcmp(prefix, option, plen);
2308
}
2309
2310
static inline int selinux_option(char *option, int len)
2311
{
2312
return (match_prefix(CONTEXT_STR, sizeof(CONTEXT_STR)-1, option, len) ||
2313
match_prefix(FSCONTEXT_STR, sizeof(FSCONTEXT_STR)-1, option, len) ||
2314
match_prefix(DEFCONTEXT_STR, sizeof(DEFCONTEXT_STR)-1, option, len) ||
2315
match_prefix(ROOTCONTEXT_STR, sizeof(ROOTCONTEXT_STR)-1, option, len) ||
2316
match_prefix(LABELSUPP_STR, sizeof(LABELSUPP_STR)-1, option, len));
2317
}
2318
2319
static inline void take_option(char **to, char *from, int *first, int len)
2320
{
2321
if (!*first) {
2322
**to = ',';
2323
*to += 1;
2324
} else
2325
*first = 0;
2326
memcpy(*to, from, len);
2327
*to += len;
2328
}
2329
2330
static inline void take_selinux_option(char **to, char *from, int *first,
2331
int len)
2332
{
2333
int current_size = 0;
2334
2335
if (!*first) {
2336
**to = '|';
2337
*to += 1;
2338
} else
2339
*first = 0;
2340
2341
while (current_size < len) {
2342
if (*from != '"') {
2343
**to = *from;
2344
*to += 1;
2345
}
2346
from += 1;
2347
current_size += 1;
2348
}
2349
}
2350
2351
static int selinux_sb_copy_data(char *orig, char *copy)
2352
{
2353
int fnosec, fsec, rc = 0;
2354
char *in_save, *in_curr, *in_end;
2355
char *sec_curr, *nosec_save, *nosec;
2356
int open_quote = 0;
2357
2358
in_curr = orig;
2359
sec_curr = copy;
2360
2361
nosec = (char *)get_zeroed_page(GFP_KERNEL);
2362
if (!nosec) {
2363
rc = -ENOMEM;
2364
goto out;
2365
}
2366
2367
nosec_save = nosec;
2368
fnosec = fsec = 1;
2369
in_save = in_end = orig;
2370
2371
do {
2372
if (*in_end == '"')
2373
open_quote = !open_quote;
2374
if ((*in_end == ',' && open_quote == 0) ||
2375
*in_end == '\0') {
2376
int len = in_end - in_curr;
2377
2378
if (selinux_option(in_curr, len))
2379
take_selinux_option(&sec_curr, in_curr, &fsec, len);
2380
else
2381
take_option(&nosec, in_curr, &fnosec, len);
2382
2383
in_curr = in_end + 1;
2384
}
2385
} while (*in_end++);
2386
2387
strcpy(in_save, nosec_save);
2388
free_page((unsigned long)nosec_save);
2389
out:
2390
return rc;
2391
}
2392
2393
static int selinux_sb_remount(struct super_block *sb, void *data)
2394
{
2395
int rc, i, *flags;
2396
struct security_mnt_opts opts;
2397
char *secdata, **mount_options;
2398
struct superblock_security_struct *sbsec = sb->s_security;
2399
2400
if (!(sbsec->flags & SE_SBINITIALIZED))
2401
return 0;
2402
2403
if (!data)
2404
return 0;
2405
2406
if (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
2407
return 0;
2408
2409
security_init_mnt_opts(&opts);
2410
secdata = alloc_secdata();
2411
if (!secdata)
2412
return -ENOMEM;
2413
rc = selinux_sb_copy_data(data, secdata);
2414
if (rc)
2415
goto out_free_secdata;
2416
2417
rc = selinux_parse_opts_str(secdata, &opts);
2418
if (rc)
2419
goto out_free_secdata;
2420
2421
mount_options = opts.mnt_opts;
2422
flags = opts.mnt_opts_flags;
2423
2424
for (i = 0; i < opts.num_mnt_opts; i++) {
2425
u32 sid;
2426
size_t len;
2427
2428
if (flags[i] == SE_SBLABELSUPP)
2429
continue;
2430
len = strlen(mount_options[i]);
2431
rc = security_context_to_sid(mount_options[i], len, &sid);
2432
if (rc) {
2433
printk(KERN_WARNING "SELinux: security_context_to_sid"
2434
"(%s) failed for (dev %s, type %s) errno=%d\n",
2435
mount_options[i], sb->s_id, sb->s_type->name, rc);
2436
goto out_free_opts;
2437
}
2438
rc = -EINVAL;
2439
switch (flags[i]) {
2440
case FSCONTEXT_MNT:
2441
if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid, sid))
2442
goto out_bad_option;
2443
break;
2444
case CONTEXT_MNT:
2445
if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid, sid))
2446
goto out_bad_option;
2447
break;
2448
case ROOTCONTEXT_MNT: {
2449
struct inode_security_struct *root_isec;
2450
root_isec = sb->s_root->d_inode->i_security;
2451
2452
if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid, sid))
2453
goto out_bad_option;
2454
break;
2455
}
2456
case DEFCONTEXT_MNT:
2457
if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid, sid))
2458
goto out_bad_option;
2459
break;
2460
default:
2461
goto out_free_opts;
2462
}
2463
}
2464
2465
rc = 0;
2466
out_free_opts:
2467
security_free_mnt_opts(&opts);
2468
out_free_secdata:
2469
free_secdata(secdata);
2470
return rc;
2471
out_bad_option:
2472
printk(KERN_WARNING "SELinux: unable to change security options "
2473
"during remount (dev %s, type=%s)\n", sb->s_id,
2474
sb->s_type->name);
2475
goto out_free_opts;
2476
}
2477
2478
static int selinux_sb_kern_mount(struct super_block *sb, int flags, void *data)
2479
{
2480
const struct cred *cred = current_cred();
2481
struct common_audit_data ad;
2482
int rc;
2483
2484
rc = superblock_doinit(sb, data);
2485
if (rc)
2486
return rc;
2487
2488
/* Allow all mounts performed by the kernel */
2489
if (flags & MS_KERNMOUNT)
2490
return 0;
2491
2492
COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
2493
ad.u.dentry = sb->s_root;
2494
return superblock_has_perm(cred, sb, FILESYSTEM__MOUNT, &ad);
2495
}
2496
2497
static int selinux_sb_statfs(struct dentry *dentry)
2498
{
2499
const struct cred *cred = current_cred();
2500
struct common_audit_data ad;
2501
2502
COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
2503
ad.u.dentry = dentry->d_sb->s_root;
2504
return superblock_has_perm(cred, dentry->d_sb, FILESYSTEM__GETATTR, &ad);
2505
}
2506
2507
static int selinux_mount(char *dev_name,
2508
struct path *path,
2509
char *type,
2510
unsigned long flags,
2511
void *data)
2512
{
2513
const struct cred *cred = current_cred();
2514
2515
if (flags & MS_REMOUNT)
2516
return superblock_has_perm(cred, path->mnt->mnt_sb,
2517
FILESYSTEM__REMOUNT, NULL);
2518
else
2519
return path_has_perm(cred, path, FILE__MOUNTON);
2520
}
2521
2522
static int selinux_umount(struct vfsmount *mnt, int flags)
2523
{
2524
const struct cred *cred = current_cred();
2525
2526
return superblock_has_perm(cred, mnt->mnt_sb,
2527
FILESYSTEM__UNMOUNT, NULL);
2528
}
2529
2530
/* inode security operations */
2531
2532
static int selinux_inode_alloc_security(struct inode *inode)
2533
{
2534
return inode_alloc_security(inode);
2535
}
2536
2537
static void selinux_inode_free_security(struct inode *inode)
2538
{
2539
inode_free_security(inode);
2540
}
2541
2542
static int selinux_inode_init_security(struct inode *inode, struct inode *dir,
2543
const struct qstr *qstr, char **name,
2544
void **value, size_t *len)
2545
{
2546
const struct task_security_struct *tsec = current_security();
2547
struct inode_security_struct *dsec;
2548
struct superblock_security_struct *sbsec;
2549
u32 sid, newsid, clen;
2550
int rc;
2551
char *namep = NULL, *context;
2552
2553
dsec = dir->i_security;
2554
sbsec = dir->i_sb->s_security;
2555
2556
sid = tsec->sid;
2557
newsid = tsec->create_sid;
2558
2559
if ((sbsec->flags & SE_SBINITIALIZED) &&
2560
(sbsec->behavior == SECURITY_FS_USE_MNTPOINT))
2561
newsid = sbsec->mntpoint_sid;
2562
else if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) {
2563
rc = security_transition_sid(sid, dsec->sid,
2564
inode_mode_to_security_class(inode->i_mode),
2565
qstr, &newsid);
2566
if (rc) {
2567
printk(KERN_WARNING "%s: "
2568
"security_transition_sid failed, rc=%d (dev=%s "
2569
"ino=%ld)\n",
2570
__func__,
2571
-rc, inode->i_sb->s_id, inode->i_ino);
2572
return rc;
2573
}
2574
}
2575
2576
/* Possibly defer initialization to selinux_complete_init. */
2577
if (sbsec->flags & SE_SBINITIALIZED) {
2578
struct inode_security_struct *isec = inode->i_security;
2579
isec->sclass = inode_mode_to_security_class(inode->i_mode);
2580
isec->sid = newsid;
2581
isec->initialized = 1;
2582
}
2583
2584
if (!ss_initialized || !(sbsec->flags & SE_SBLABELSUPP))
2585
return -EOPNOTSUPP;
2586
2587
if (name) {
2588
namep = kstrdup(XATTR_SELINUX_SUFFIX, GFP_NOFS);
2589
if (!namep)
2590
return -ENOMEM;
2591
*name = namep;
2592
}
2593
2594
if (value && len) {
2595
rc = security_sid_to_context_force(newsid, &context, &clen);
2596
if (rc) {
2597
kfree(namep);
2598
return rc;
2599
}
2600
*value = context;
2601
*len = clen;
2602
}
2603
2604
return 0;
2605
}
2606
2607
static int selinux_inode_create(struct inode *dir, struct dentry *dentry, int mask)
2608
{
2609
return may_create(dir, dentry, SECCLASS_FILE);
2610
}
2611
2612
static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
2613
{
2614
return may_link(dir, old_dentry, MAY_LINK);
2615
}
2616
2617
static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
2618
{
2619
return may_link(dir, dentry, MAY_UNLINK);
2620
}
2621
2622
static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
2623
{
2624
return may_create(dir, dentry, SECCLASS_LNK_FILE);
2625
}
2626
2627
static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, int mask)
2628
{
2629
return may_create(dir, dentry, SECCLASS_DIR);
2630
}
2631
2632
static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
2633
{
2634
return may_link(dir, dentry, MAY_RMDIR);
2635
}
2636
2637
static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
2638
{
2639
return may_create(dir, dentry, inode_mode_to_security_class(mode));
2640
}
2641
2642
static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
2643
struct inode *new_inode, struct dentry *new_dentry)
2644
{
2645
return may_rename(old_inode, old_dentry, new_inode, new_dentry);
2646
}
2647
2648
static int selinux_inode_readlink(struct dentry *dentry)
2649
{
2650
const struct cred *cred = current_cred();
2651
2652
return dentry_has_perm(cred, dentry, FILE__READ);
2653
}
2654
2655
static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *nameidata)
2656
{
2657
const struct cred *cred = current_cred();
2658
2659
return dentry_has_perm(cred, dentry, FILE__READ);
2660
}
2661
2662
static int selinux_inode_permission(struct inode *inode, int mask, unsigned flags)
2663
{
2664
const struct cred *cred = current_cred();
2665
struct common_audit_data ad;
2666
u32 perms;
2667
bool from_access;
2668
2669
from_access = mask & MAY_ACCESS;
2670
mask &= (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND);
2671
2672
/* No permission to check. Existence test. */
2673
if (!mask)
2674
return 0;
2675
2676
COMMON_AUDIT_DATA_INIT(&ad, INODE);
2677
ad.u.inode = inode;
2678
2679
if (from_access)
2680
ad.selinux_audit_data.auditdeny |= FILE__AUDIT_ACCESS;
2681
2682
perms = file_mask_to_av(inode->i_mode, mask);
2683
2684
return inode_has_perm(cred, inode, perms, &ad, flags);
2685
}
2686
2687
static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
2688
{
2689
const struct cred *cred = current_cred();
2690
unsigned int ia_valid = iattr->ia_valid;
2691
2692
/* ATTR_FORCE is just used for ATTR_KILL_S[UG]ID. */
2693
if (ia_valid & ATTR_FORCE) {
2694
ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_MODE |
2695
ATTR_FORCE);
2696
if (!ia_valid)
2697
return 0;
2698
}
2699
2700
if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
2701
ATTR_ATIME_SET | ATTR_MTIME_SET | ATTR_TIMES_SET))
2702
return dentry_has_perm(cred, dentry, FILE__SETATTR);
2703
2704
return dentry_has_perm(cred, dentry, FILE__WRITE);
2705
}
2706
2707
static int selinux_inode_getattr(struct vfsmount *mnt, struct dentry *dentry)
2708
{
2709
const struct cred *cred = current_cred();
2710
struct path path;
2711
2712
path.dentry = dentry;
2713
path.mnt = mnt;
2714
2715
return path_has_perm(cred, &path, FILE__GETATTR);
2716
}
2717
2718
static int selinux_inode_setotherxattr(struct dentry *dentry, const char *name)
2719
{
2720
const struct cred *cred = current_cred();
2721
2722
if (!strncmp(name, XATTR_SECURITY_PREFIX,
2723
sizeof XATTR_SECURITY_PREFIX - 1)) {
2724
if (!strcmp(name, XATTR_NAME_CAPS)) {
2725
if (!capable(CAP_SETFCAP))
2726
return -EPERM;
2727
} else if (!capable(CAP_SYS_ADMIN)) {
2728
/* A different attribute in the security namespace.
2729
Restrict to administrator. */
2730
return -EPERM;
2731
}
2732
}
2733
2734
/* Not an attribute we recognize, so just check the
2735
ordinary setattr permission. */
2736
return dentry_has_perm(cred, dentry, FILE__SETATTR);
2737
}
2738
2739
static int selinux_inode_setxattr(struct dentry *dentry, const char *name,
2740
const void *value, size_t size, int flags)
2741
{
2742
struct inode *inode = dentry->d_inode;
2743
struct inode_security_struct *isec = inode->i_security;
2744
struct superblock_security_struct *sbsec;
2745
struct common_audit_data ad;
2746
u32 newsid, sid = current_sid();
2747
int rc = 0;
2748
2749
if (strcmp(name, XATTR_NAME_SELINUX))
2750
return selinux_inode_setotherxattr(dentry, name);
2751
2752
sbsec = inode->i_sb->s_security;
2753
if (!(sbsec->flags & SE_SBLABELSUPP))
2754
return -EOPNOTSUPP;
2755
2756
if (!inode_owner_or_capable(inode))
2757
return -EPERM;
2758
2759
COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
2760
ad.u.dentry = dentry;
2761
2762
rc = avc_has_perm(sid, isec->sid, isec->sclass,
2763
FILE__RELABELFROM, &ad);
2764
if (rc)
2765
return rc;
2766
2767
rc = security_context_to_sid(value, size, &newsid);
2768
if (rc == -EINVAL) {
2769
if (!capable(CAP_MAC_ADMIN))
2770
return rc;
2771
rc = security_context_to_sid_force(value, size, &newsid);
2772
}
2773
if (rc)
2774
return rc;
2775
2776
rc = avc_has_perm(sid, newsid, isec->sclass,
2777
FILE__RELABELTO, &ad);
2778
if (rc)
2779
return rc;
2780
2781
rc = security_validate_transition(isec->sid, newsid, sid,
2782
isec->sclass);
2783
if (rc)
2784
return rc;
2785
2786
return avc_has_perm(newsid,
2787
sbsec->sid,
2788
SECCLASS_FILESYSTEM,
2789
FILESYSTEM__ASSOCIATE,
2790
&ad);
2791
}
2792
2793
static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
2794
const void *value, size_t size,
2795
int flags)
2796
{
2797
struct inode *inode = dentry->d_inode;
2798
struct inode_security_struct *isec = inode->i_security;
2799
u32 newsid;
2800
int rc;
2801
2802
if (strcmp(name, XATTR_NAME_SELINUX)) {
2803
/* Not an attribute we recognize, so nothing to do. */
2804
return;
2805
}
2806
2807
rc = security_context_to_sid_force(value, size, &newsid);
2808
if (rc) {
2809
printk(KERN_ERR "SELinux: unable to map context to SID"
2810
"for (%s, %lu), rc=%d\n",
2811
inode->i_sb->s_id, inode->i_ino, -rc);
2812
return;
2813
}
2814
2815
isec->sid = newsid;
2816
return;
2817
}
2818
2819
static int selinux_inode_getxattr(struct dentry *dentry, const char *name)
2820
{
2821
const struct cred *cred = current_cred();
2822
2823
return dentry_has_perm(cred, dentry, FILE__GETATTR);
2824
}
2825
2826
static int selinux_inode_listxattr(struct dentry *dentry)
2827
{
2828
const struct cred *cred = current_cred();
2829
2830
return dentry_has_perm(cred, dentry, FILE__GETATTR);
2831
}
2832
2833
static int selinux_inode_removexattr(struct dentry *dentry, const char *name)
2834
{
2835
if (strcmp(name, XATTR_NAME_SELINUX))
2836
return selinux_inode_setotherxattr(dentry, name);
2837
2838
/* No one is allowed to remove a SELinux security label.
2839
You can change the label, but all data must be labeled. */
2840
return -EACCES;
2841
}
2842
2843
/*
2844
* Copy the inode security context value to the user.
2845
*
2846
* Permission check is handled by selinux_inode_getxattr hook.
2847
*/
2848
static int selinux_inode_getsecurity(const struct inode *inode, const char *name, void **buffer, bool alloc)
2849
{
2850
u32 size;
2851
int error;
2852
char *context = NULL;
2853
struct inode_security_struct *isec = inode->i_security;
2854
2855
if (strcmp(name, XATTR_SELINUX_SUFFIX))
2856
return -EOPNOTSUPP;
2857
2858
/*
2859
* If the caller has CAP_MAC_ADMIN, then get the raw context
2860
* value even if it is not defined by current policy; otherwise,
2861
* use the in-core value under current policy.
2862
* Use the non-auditing forms of the permission checks since
2863
* getxattr may be called by unprivileged processes commonly
2864
* and lack of permission just means that we fall back to the
2865
* in-core context value, not a denial.
2866
*/
2867
error = selinux_capable(current, current_cred(),
2868
&init_user_ns, CAP_MAC_ADMIN,
2869
SECURITY_CAP_NOAUDIT);
2870
if (!error)
2871
error = security_sid_to_context_force(isec->sid, &context,
2872
&size);
2873
else
2874
error = security_sid_to_context(isec->sid, &context, &size);
2875
if (error)
2876
return error;
2877
error = size;
2878
if (alloc) {
2879
*buffer = context;
2880
goto out_nofree;
2881
}
2882
kfree(context);
2883
out_nofree:
2884
return error;
2885
}
2886
2887
static int selinux_inode_setsecurity(struct inode *inode, const char *name,
2888
const void *value, size_t size, int flags)
2889
{
2890
struct inode_security_struct *isec = inode->i_security;
2891
u32 newsid;
2892
int rc;
2893
2894
if (strcmp(name, XATTR_SELINUX_SUFFIX))
2895
return -EOPNOTSUPP;
2896
2897
if (!value || !size)
2898
return -EACCES;
2899
2900
rc = security_context_to_sid((void *)value, size, &newsid);
2901
if (rc)
2902
return rc;
2903
2904
isec->sid = newsid;
2905
isec->initialized = 1;
2906
return 0;
2907
}
2908
2909
static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
2910
{
2911
const int len = sizeof(XATTR_NAME_SELINUX);
2912
if (buffer && len <= buffer_size)
2913
memcpy(buffer, XATTR_NAME_SELINUX, len);
2914
return len;
2915
}
2916
2917
static void selinux_inode_getsecid(const struct inode *inode, u32 *secid)
2918
{
2919
struct inode_security_struct *isec = inode->i_security;
2920
*secid = isec->sid;
2921
}
2922
2923
/* file security operations */
2924
2925
static int selinux_revalidate_file_permission(struct file *file, int mask)
2926
{
2927
const struct cred *cred = current_cred();
2928
struct inode *inode = file->f_path.dentry->d_inode;
2929
2930
/* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
2931
if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
2932
mask |= MAY_APPEND;
2933
2934
return file_has_perm(cred, file,
2935
file_mask_to_av(inode->i_mode, mask));
2936
}
2937
2938
static int selinux_file_permission(struct file *file, int mask)
2939
{
2940
struct inode *inode = file->f_path.dentry->d_inode;
2941
struct file_security_struct *fsec = file->f_security;
2942
struct inode_security_struct *isec = inode->i_security;
2943
u32 sid = current_sid();
2944
2945
if (!mask)
2946
/* No permission to check. Existence test. */
2947
return 0;
2948
2949
if (sid == fsec->sid && fsec->isid == isec->sid &&
2950
fsec->pseqno == avc_policy_seqno())
2951
/* No change since dentry_open check. */
2952
return 0;
2953
2954
return selinux_revalidate_file_permission(file, mask);
2955
}
2956
2957
static int selinux_file_alloc_security(struct file *file)
2958
{
2959
return file_alloc_security(file);
2960
}
2961
2962
static void selinux_file_free_security(struct file *file)
2963
{
2964
file_free_security(file);
2965
}
2966
2967
static int selinux_file_ioctl(struct file *file, unsigned int cmd,
2968
unsigned long arg)
2969
{
2970
const struct cred *cred = current_cred();
2971
int error = 0;
2972
2973
switch (cmd) {
2974
case FIONREAD:
2975
/* fall through */
2976
case FIBMAP:
2977
/* fall through */
2978
case FIGETBSZ:
2979
/* fall through */
2980
case EXT2_IOC_GETFLAGS:
2981
/* fall through */
2982
case EXT2_IOC_GETVERSION:
2983
error = file_has_perm(cred, file, FILE__GETATTR);
2984
break;
2985
2986
case EXT2_IOC_SETFLAGS:
2987
/* fall through */
2988
case EXT2_IOC_SETVERSION:
2989
error = file_has_perm(cred, file, FILE__SETATTR);
2990
break;
2991
2992
/* sys_ioctl() checks */
2993
case FIONBIO:
2994
/* fall through */
2995
case FIOASYNC:
2996
error = file_has_perm(cred, file, 0);
2997
break;
2998
2999
case KDSKBENT:
3000
case KDSKBSENT:
3001
error = task_has_capability(current, cred, CAP_SYS_TTY_CONFIG,
3002
SECURITY_CAP_AUDIT);
3003
break;
3004
3005
/* default case assumes that the command will go
3006
* to the file's ioctl() function.
3007
*/
3008
default:
3009
error = file_has_perm(cred, file, FILE__IOCTL);
3010
}
3011
return error;
3012
}
3013
3014
static int default_noexec;
3015
3016
static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
3017
{
3018
const struct cred *cred = current_cred();
3019
int rc = 0;
3020
3021
if (default_noexec &&
3022
(prot & PROT_EXEC) && (!file || (!shared && (prot & PROT_WRITE)))) {
3023
/*
3024
* We are making executable an anonymous mapping or a
3025
* private file mapping that will also be writable.
3026
* This has an additional check.
3027
*/
3028
rc = cred_has_perm(cred, cred, PROCESS__EXECMEM);
3029
if (rc)
3030
goto error;
3031
}
3032
3033
if (file) {
3034
/* read access is always possible with a mapping */
3035
u32 av = FILE__READ;
3036
3037
/* write access only matters if the mapping is shared */
3038
if (shared && (prot & PROT_WRITE))
3039
av |= FILE__WRITE;
3040
3041
if (prot & PROT_EXEC)
3042
av |= FILE__EXECUTE;
3043
3044
return file_has_perm(cred, file, av);
3045
}
3046
3047
error:
3048
return rc;
3049
}
3050
3051
static int selinux_file_mmap(struct file *file, unsigned long reqprot,
3052
unsigned long prot, unsigned long flags,
3053
unsigned long addr, unsigned long addr_only)
3054
{
3055
int rc = 0;
3056
u32 sid = current_sid();
3057
3058
/*
3059
* notice that we are intentionally putting the SELinux check before
3060
* the secondary cap_file_mmap check. This is such a likely attempt
3061
* at bad behaviour/exploit that we always want to get the AVC, even
3062
* if DAC would have also denied the operation.
3063
*/
3064
if (addr < CONFIG_LSM_MMAP_MIN_ADDR) {
3065
rc = avc_has_perm(sid, sid, SECCLASS_MEMPROTECT,
3066
MEMPROTECT__MMAP_ZERO, NULL);
3067
if (rc)
3068
return rc;
3069
}
3070
3071
/* do DAC check on address space usage */
3072
rc = cap_file_mmap(file, reqprot, prot, flags, addr, addr_only);
3073
if (rc || addr_only)
3074
return rc;
3075
3076
if (selinux_checkreqprot)
3077
prot = reqprot;
3078
3079
return file_map_prot_check(file, prot,
3080
(flags & MAP_TYPE) == MAP_SHARED);
3081
}
3082
3083
static int selinux_file_mprotect(struct vm_area_struct *vma,
3084
unsigned long reqprot,
3085
unsigned long prot)
3086
{
3087
const struct cred *cred = current_cred();
3088
3089
if (selinux_checkreqprot)
3090
prot = reqprot;
3091
3092
if (default_noexec &&
3093
(prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
3094
int rc = 0;
3095
if (vma->vm_start >= vma->vm_mm->start_brk &&
3096
vma->vm_end <= vma->vm_mm->brk) {
3097
rc = cred_has_perm(cred, cred, PROCESS__EXECHEAP);
3098
} else if (!vma->vm_file &&
3099
vma->vm_start <= vma->vm_mm->start_stack &&
3100
vma->vm_end >= vma->vm_mm->start_stack) {
3101
rc = current_has_perm(current, PROCESS__EXECSTACK);
3102
} else if (vma->vm_file && vma->anon_vma) {
3103
/*
3104
* We are making executable a file mapping that has
3105
* had some COW done. Since pages might have been
3106
* written, check ability to execute the possibly
3107
* modified content. This typically should only
3108
* occur for text relocations.
3109
*/
3110
rc = file_has_perm(cred, vma->vm_file, FILE__EXECMOD);
3111
}
3112
if (rc)
3113
return rc;
3114
}
3115
3116
return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
3117
}
3118
3119
static int selinux_file_lock(struct file *file, unsigned int cmd)
3120
{
3121
const struct cred *cred = current_cred();
3122
3123
return file_has_perm(cred, file, FILE__LOCK);
3124
}
3125
3126
static int selinux_file_fcntl(struct file *file, unsigned int cmd,
3127
unsigned long arg)
3128
{
3129
const struct cred *cred = current_cred();
3130
int err = 0;
3131
3132
switch (cmd) {
3133
case F_SETFL:
3134
if (!file->f_path.dentry || !file->f_path.dentry->d_inode) {
3135
err = -EINVAL;
3136
break;
3137
}
3138
3139
if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
3140
err = file_has_perm(cred, file, FILE__WRITE);
3141
break;
3142
}
3143
/* fall through */
3144
case F_SETOWN:
3145
case F_SETSIG:
3146
case F_GETFL:
3147
case F_GETOWN:
3148
case F_GETSIG:
3149
/* Just check FD__USE permission */
3150
err = file_has_perm(cred, file, 0);
3151
break;
3152
case F_GETLK:
3153
case F_SETLK:
3154
case F_SETLKW:
3155
#if BITS_PER_LONG == 32
3156
case F_GETLK64:
3157
case F_SETLK64:
3158
case F_SETLKW64:
3159
#endif
3160
if (!file->f_path.dentry || !file->f_path.dentry->d_inode) {
3161
err = -EINVAL;
3162
break;
3163
}
3164
err = file_has_perm(cred, file, FILE__LOCK);
3165
break;
3166
}
3167
3168
return err;
3169
}
3170
3171
static int selinux_file_set_fowner(struct file *file)
3172
{
3173
struct file_security_struct *fsec;
3174
3175
fsec = file->f_security;
3176
fsec->fown_sid = current_sid();
3177
3178
return 0;
3179
}
3180
3181
static int selinux_file_send_sigiotask(struct task_struct *tsk,
3182
struct fown_struct *fown, int signum)
3183
{
3184
struct file *file;
3185
u32 sid = task_sid(tsk);
3186
u32 perm;
3187
struct file_security_struct *fsec;
3188
3189
/* struct fown_struct is never outside the context of a struct file */
3190
file = container_of(fown, struct file, f_owner);
3191
3192
fsec = file->f_security;
3193
3194
if (!signum)
3195
perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
3196
else
3197
perm = signal_to_av(signum);
3198
3199
return avc_has_perm(fsec->fown_sid, sid,
3200
SECCLASS_PROCESS, perm, NULL);
3201
}
3202
3203
static int selinux_file_receive(struct file *file)
3204
{
3205
const struct cred *cred = current_cred();
3206
3207
return file_has_perm(cred, file, file_to_av(file));
3208
}
3209
3210
static int selinux_dentry_open(struct file *file, const struct cred *cred)
3211
{
3212
struct file_security_struct *fsec;
3213
struct inode *inode;
3214
struct inode_security_struct *isec;
3215
3216
inode = file->f_path.dentry->d_inode;
3217
fsec = file->f_security;
3218
isec = inode->i_security;
3219
/*
3220
* Save inode label and policy sequence number
3221
* at open-time so that selinux_file_permission
3222
* can determine whether revalidation is necessary.
3223
* Task label is already saved in the file security
3224
* struct as its SID.
3225
*/
3226
fsec->isid = isec->sid;
3227
fsec->pseqno = avc_policy_seqno();
3228
/*
3229
* Since the inode label or policy seqno may have changed
3230
* between the selinux_inode_permission check and the saving
3231
* of state above, recheck that access is still permitted.
3232
* Otherwise, access might never be revalidated against the
3233
* new inode label or new policy.
3234
* This check is not redundant - do not remove.
3235
*/
3236
return inode_has_perm_noadp(cred, inode, open_file_to_av(file), 0);
3237
}
3238
3239
/* task security operations */
3240
3241
static int selinux_task_create(unsigned long clone_flags)
3242
{
3243
return current_has_perm(current, PROCESS__FORK);
3244
}
3245
3246
/*
3247
* allocate the SELinux part of blank credentials
3248
*/
3249
static int selinux_cred_alloc_blank(struct cred *cred, gfp_t gfp)
3250
{
3251
struct task_security_struct *tsec;
3252
3253
tsec = kzalloc(sizeof(struct task_security_struct), gfp);
3254
if (!tsec)
3255
return -ENOMEM;
3256
3257
cred->security = tsec;
3258
return 0;
3259
}
3260
3261
/*
3262
* detach and free the LSM part of a set of credentials
3263
*/
3264
static void selinux_cred_free(struct cred *cred)
3265
{
3266
struct task_security_struct *tsec = cred->security;
3267
3268
/*
3269
* cred->security == NULL if security_cred_alloc_blank() or
3270
* security_prepare_creds() returned an error.
3271
*/
3272
BUG_ON(cred->security && (unsigned long) cred->security < PAGE_SIZE);
3273
cred->security = (void *) 0x7UL;
3274
kfree(tsec);
3275
}
3276
3277
/*
3278
* prepare a new set of credentials for modification
3279
*/
3280
static int selinux_cred_prepare(struct cred *new, const struct cred *old,
3281
gfp_t gfp)
3282
{
3283
const struct task_security_struct *old_tsec;
3284
struct task_security_struct *tsec;
3285
3286
old_tsec = old->security;
3287
3288
tsec = kmemdup(old_tsec, sizeof(struct task_security_struct), gfp);
3289
if (!tsec)
3290
return -ENOMEM;
3291
3292
new->security = tsec;
3293
return 0;
3294
}
3295
3296
/*
3297
* transfer the SELinux data to a blank set of creds
3298
*/
3299
static void selinux_cred_transfer(struct cred *new, const struct cred *old)
3300
{
3301
const struct task_security_struct *old_tsec = old->security;
3302
struct task_security_struct *tsec = new->security;
3303
3304
*tsec = *old_tsec;
3305
}
3306
3307
/*
3308
* set the security data for a kernel service
3309
* - all the creation contexts are set to unlabelled
3310
*/
3311
static int selinux_kernel_act_as(struct cred *new, u32 secid)
3312
{
3313
struct task_security_struct *tsec = new->security;
3314
u32 sid = current_sid();
3315
int ret;
3316
3317
ret = avc_has_perm(sid, secid,
3318
SECCLASS_KERNEL_SERVICE,
3319
KERNEL_SERVICE__USE_AS_OVERRIDE,
3320
NULL);
3321
if (ret == 0) {
3322
tsec->sid = secid;
3323
tsec->create_sid = 0;
3324
tsec->keycreate_sid = 0;
3325
tsec->sockcreate_sid = 0;
3326
}
3327
return ret;
3328
}
3329
3330
/*
3331
* set the file creation context in a security record to the same as the
3332
* objective context of the specified inode
3333
*/
3334
static int selinux_kernel_create_files_as(struct cred *new, struct inode *inode)
3335
{
3336
struct inode_security_struct *isec = inode->i_security;
3337
struct task_security_struct *tsec = new->security;
3338
u32 sid = current_sid();
3339
int ret;
3340
3341
ret = avc_has_perm(sid, isec->sid,
3342
SECCLASS_KERNEL_SERVICE,
3343
KERNEL_SERVICE__CREATE_FILES_AS,
3344
NULL);
3345
3346
if (ret == 0)
3347
tsec->create_sid = isec->sid;
3348
return ret;
3349
}
3350
3351
static int selinux_kernel_module_request(char *kmod_name)
3352
{
3353
u32 sid;
3354
struct common_audit_data ad;
3355
3356
sid = task_sid(current);
3357
3358
COMMON_AUDIT_DATA_INIT(&ad, KMOD);
3359
ad.u.kmod_name = kmod_name;
3360
3361
return avc_has_perm(sid, SECINITSID_KERNEL, SECCLASS_SYSTEM,
3362
SYSTEM__MODULE_REQUEST, &ad);
3363
}
3364
3365
static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
3366
{
3367
return current_has_perm(p, PROCESS__SETPGID);
3368
}
3369
3370
static int selinux_task_getpgid(struct task_struct *p)
3371
{
3372
return current_has_perm(p, PROCESS__GETPGID);
3373
}
3374
3375
static int selinux_task_getsid(struct task_struct *p)
3376
{
3377
return current_has_perm(p, PROCESS__GETSESSION);
3378
}
3379
3380
static void selinux_task_getsecid(struct task_struct *p, u32 *secid)
3381
{
3382
*secid = task_sid(p);
3383
}
3384
3385
static int selinux_task_setnice(struct task_struct *p, int nice)
3386
{
3387
int rc;
3388
3389
rc = cap_task_setnice(p, nice);
3390
if (rc)
3391
return rc;
3392
3393
return current_has_perm(p, PROCESS__SETSCHED);
3394
}
3395
3396
static int selinux_task_setioprio(struct task_struct *p, int ioprio)
3397
{
3398
int rc;
3399
3400
rc = cap_task_setioprio(p, ioprio);
3401
if (rc)
3402
return rc;
3403
3404
return current_has_perm(p, PROCESS__SETSCHED);
3405
}
3406
3407
static int selinux_task_getioprio(struct task_struct *p)
3408
{
3409
return current_has_perm(p, PROCESS__GETSCHED);
3410
}
3411
3412
static int selinux_task_setrlimit(struct task_struct *p, unsigned int resource,
3413
struct rlimit *new_rlim)
3414
{
3415
struct rlimit *old_rlim = p->signal->rlim + resource;
3416
3417
/* Control the ability to change the hard limit (whether
3418
lowering or raising it), so that the hard limit can
3419
later be used as a safe reset point for the soft limit
3420
upon context transitions. See selinux_bprm_committing_creds. */
3421
if (old_rlim->rlim_max != new_rlim->rlim_max)
3422
return current_has_perm(p, PROCESS__SETRLIMIT);
3423
3424
return 0;
3425
}
3426
3427
static int selinux_task_setscheduler(struct task_struct *p)
3428
{
3429
int rc;
3430
3431
rc = cap_task_setscheduler(p);
3432
if (rc)
3433
return rc;
3434
3435
return current_has_perm(p, PROCESS__SETSCHED);
3436
}
3437
3438
static int selinux_task_getscheduler(struct task_struct *p)
3439
{
3440
return current_has_perm(p, PROCESS__GETSCHED);
3441
}
3442
3443
static int selinux_task_movememory(struct task_struct *p)
3444
{
3445
return current_has_perm(p, PROCESS__SETSCHED);
3446
}
3447
3448
static int selinux_task_kill(struct task_struct *p, struct siginfo *info,
3449
int sig, u32 secid)
3450
{
3451
u32 perm;
3452
int rc;
3453
3454
if (!sig)
3455
perm = PROCESS__SIGNULL; /* null signal; existence test */
3456
else
3457
perm = signal_to_av(sig);
3458
if (secid)
3459
rc = avc_has_perm(secid, task_sid(p),
3460
SECCLASS_PROCESS, perm, NULL);
3461
else
3462
rc = current_has_perm(p, perm);
3463
return rc;
3464
}
3465
3466
static int selinux_task_wait(struct task_struct *p)
3467
{
3468
return task_has_perm(p, current, PROCESS__SIGCHLD);
3469
}
3470
3471
static void selinux_task_to_inode(struct task_struct *p,
3472
struct inode *inode)
3473
{
3474
struct inode_security_struct *isec = inode->i_security;
3475
u32 sid = task_sid(p);
3476
3477
isec->sid = sid;
3478
isec->initialized = 1;
3479
}
3480
3481
/* Returns error only if unable to parse addresses */
3482
static int selinux_parse_skb_ipv4(struct sk_buff *skb,
3483
struct common_audit_data *ad, u8 *proto)
3484
{
3485
int offset, ihlen, ret = -EINVAL;
3486
struct iphdr _iph, *ih;
3487
3488
offset = skb_network_offset(skb);
3489
ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
3490
if (ih == NULL)
3491
goto out;
3492
3493
ihlen = ih->ihl * 4;
3494
if (ihlen < sizeof(_iph))
3495
goto out;
3496
3497
ad->u.net.v4info.saddr = ih->saddr;
3498
ad->u.net.v4info.daddr = ih->daddr;
3499
ret = 0;
3500
3501
if (proto)
3502
*proto = ih->protocol;
3503
3504
switch (ih->protocol) {
3505
case IPPROTO_TCP: {
3506
struct tcphdr _tcph, *th;
3507
3508
if (ntohs(ih->frag_off) & IP_OFFSET)
3509
break;
3510
3511
offset += ihlen;
3512
th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
3513
if (th == NULL)
3514
break;
3515
3516
ad->u.net.sport = th->source;
3517
ad->u.net.dport = th->dest;
3518
break;
3519
}
3520
3521
case IPPROTO_UDP: {
3522
struct udphdr _udph, *uh;
3523
3524
if (ntohs(ih->frag_off) & IP_OFFSET)
3525
break;
3526
3527
offset += ihlen;
3528
uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
3529
if (uh == NULL)
3530
break;
3531
3532
ad->u.net.sport = uh->source;
3533
ad->u.net.dport = uh->dest;
3534
break;
3535
}
3536
3537
case IPPROTO_DCCP: {
3538
struct dccp_hdr _dccph, *dh;
3539
3540
if (ntohs(ih->frag_off) & IP_OFFSET)
3541
break;
3542
3543
offset += ihlen;
3544
dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
3545
if (dh == NULL)
3546
break;
3547
3548
ad->u.net.sport = dh->dccph_sport;
3549
ad->u.net.dport = dh->dccph_dport;
3550
break;
3551
}
3552
3553
default:
3554
break;
3555
}
3556
out:
3557
return ret;
3558
}
3559
3560
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3561
3562
/* Returns error only if unable to parse addresses */
3563
static int selinux_parse_skb_ipv6(struct sk_buff *skb,
3564
struct common_audit_data *ad, u8 *proto)
3565
{
3566
u8 nexthdr;
3567
int ret = -EINVAL, offset;
3568
struct ipv6hdr _ipv6h, *ip6;
3569
3570
offset = skb_network_offset(skb);
3571
ip6 = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
3572
if (ip6 == NULL)
3573
goto out;
3574
3575
ipv6_addr_copy(&ad->u.net.v6info.saddr, &ip6->saddr);
3576
ipv6_addr_copy(&ad->u.net.v6info.daddr, &ip6->daddr);
3577
ret = 0;
3578
3579
nexthdr = ip6->nexthdr;
3580
offset += sizeof(_ipv6h);
3581
offset = ipv6_skip_exthdr(skb, offset, &nexthdr);
3582
if (offset < 0)
3583
goto out;
3584
3585
if (proto)
3586
*proto = nexthdr;
3587
3588
switch (nexthdr) {
3589
case IPPROTO_TCP: {
3590
struct tcphdr _tcph, *th;
3591
3592
th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
3593
if (th == NULL)
3594
break;
3595
3596
ad->u.net.sport = th->source;
3597
ad->u.net.dport = th->dest;
3598
break;
3599
}
3600
3601
case IPPROTO_UDP: {
3602
struct udphdr _udph, *uh;
3603
3604
uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
3605
if (uh == NULL)
3606
break;
3607
3608
ad->u.net.sport = uh->source;
3609
ad->u.net.dport = uh->dest;
3610
break;
3611
}
3612
3613
case IPPROTO_DCCP: {
3614
struct dccp_hdr _dccph, *dh;
3615
3616
dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
3617
if (dh == NULL)
3618
break;
3619
3620
ad->u.net.sport = dh->dccph_sport;
3621
ad->u.net.dport = dh->dccph_dport;
3622
break;
3623
}
3624
3625
/* includes fragments */
3626
default:
3627
break;
3628
}
3629
out:
3630
return ret;
3631
}
3632
3633
#endif /* IPV6 */
3634
3635
static int selinux_parse_skb(struct sk_buff *skb, struct common_audit_data *ad,
3636
char **_addrp, int src, u8 *proto)
3637
{
3638
char *addrp;
3639
int ret;
3640
3641
switch (ad->u.net.family) {
3642
case PF_INET:
3643
ret = selinux_parse_skb_ipv4(skb, ad, proto);
3644
if (ret)
3645
goto parse_error;
3646
addrp = (char *)(src ? &ad->u.net.v4info.saddr :
3647
&ad->u.net.v4info.daddr);
3648
goto okay;
3649
3650
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3651
case PF_INET6:
3652
ret = selinux_parse_skb_ipv6(skb, ad, proto);
3653
if (ret)
3654
goto parse_error;
3655
addrp = (char *)(src ? &ad->u.net.v6info.saddr :
3656
&ad->u.net.v6info.daddr);
3657
goto okay;
3658
#endif /* IPV6 */
3659
default:
3660
addrp = NULL;
3661
goto okay;
3662
}
3663
3664
parse_error:
3665
printk(KERN_WARNING
3666
"SELinux: failure in selinux_parse_skb(),"
3667
" unable to parse packet\n");
3668
return ret;
3669
3670
okay:
3671
if (_addrp)
3672
*_addrp = addrp;
3673
return 0;
3674
}
3675
3676
/**
3677
* selinux_skb_peerlbl_sid - Determine the peer label of a packet
3678
* @skb: the packet
3679
* @family: protocol family
3680
* @sid: the packet's peer label SID
3681
*
3682
* Description:
3683
* Check the various different forms of network peer labeling and determine
3684
* the peer label/SID for the packet; most of the magic actually occurs in
3685
* the security server function security_net_peersid_cmp(). The function
3686
* returns zero if the value in @sid is valid (although it may be SECSID_NULL)
3687
* or -EACCES if @sid is invalid due to inconsistencies with the different
3688
* peer labels.
3689
*
3690
*/
3691
static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid)
3692
{
3693
int err;
3694
u32 xfrm_sid;
3695
u32 nlbl_sid;
3696
u32 nlbl_type;
3697
3698
selinux_skb_xfrm_sid(skb, &xfrm_sid);
3699
selinux_netlbl_skbuff_getsid(skb, family, &nlbl_type, &nlbl_sid);
3700
3701
err = security_net_peersid_resolve(nlbl_sid, nlbl_type, xfrm_sid, sid);
3702
if (unlikely(err)) {
3703
printk(KERN_WARNING
3704
"SELinux: failure in selinux_skb_peerlbl_sid(),"
3705
" unable to determine packet's peer label\n");
3706
return -EACCES;
3707
}
3708
3709
return 0;
3710
}
3711
3712
/* socket security operations */
3713
3714
static int socket_sockcreate_sid(const struct task_security_struct *tsec,
3715
u16 secclass, u32 *socksid)
3716
{
3717
if (tsec->sockcreate_sid > SECSID_NULL) {
3718
*socksid = tsec->sockcreate_sid;
3719
return 0;
3720
}
3721
3722
return security_transition_sid(tsec->sid, tsec->sid, secclass, NULL,
3723
socksid);
3724
}
3725
3726
static int sock_has_perm(struct task_struct *task, struct sock *sk, u32 perms)
3727
{
3728
struct sk_security_struct *sksec = sk->sk_security;
3729
struct common_audit_data ad;
3730
u32 tsid = task_sid(task);
3731
3732
if (sksec->sid == SECINITSID_KERNEL)
3733
return 0;
3734
3735
COMMON_AUDIT_DATA_INIT(&ad, NET);
3736
ad.u.net.sk = sk;
3737
3738
return avc_has_perm(tsid, sksec->sid, sksec->sclass, perms, &ad);
3739
}
3740
3741
static int selinux_socket_create(int family, int type,
3742
int protocol, int kern)
3743
{
3744
const struct task_security_struct *tsec = current_security();
3745
u32 newsid;
3746
u16 secclass;
3747
int rc;
3748
3749
if (kern)
3750
return 0;
3751
3752
secclass = socket_type_to_security_class(family, type, protocol);
3753
rc = socket_sockcreate_sid(tsec, secclass, &newsid);
3754
if (rc)
3755
return rc;
3756
3757
return avc_has_perm(tsec->sid, newsid, secclass, SOCKET__CREATE, NULL);
3758
}
3759
3760
static int selinux_socket_post_create(struct socket *sock, int family,
3761
int type, int protocol, int kern)
3762
{
3763
const struct task_security_struct *tsec = current_security();
3764
struct inode_security_struct *isec = SOCK_INODE(sock)->i_security;
3765
struct sk_security_struct *sksec;
3766
int err = 0;
3767
3768
isec->sclass = socket_type_to_security_class(family, type, protocol);
3769
3770
if (kern)
3771
isec->sid = SECINITSID_KERNEL;
3772
else {
3773
err = socket_sockcreate_sid(tsec, isec->sclass, &(isec->sid));
3774
if (err)
3775
return err;
3776
}
3777
3778
isec->initialized = 1;
3779
3780
if (sock->sk) {
3781
sksec = sock->sk->sk_security;
3782
sksec->sid = isec->sid;
3783
sksec->sclass = isec->sclass;
3784
err = selinux_netlbl_socket_post_create(sock->sk, family);
3785
}
3786
3787
return err;
3788
}
3789
3790
/* Range of port numbers used to automatically bind.
3791
Need to determine whether we should perform a name_bind
3792
permission check between the socket and the port number. */
3793
3794
static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
3795
{
3796
struct sock *sk = sock->sk;
3797
u16 family;
3798
int err;
3799
3800
err = sock_has_perm(current, sk, SOCKET__BIND);
3801
if (err)
3802
goto out;
3803
3804
/*
3805
* If PF_INET or PF_INET6, check name_bind permission for the port.
3806
* Multiple address binding for SCTP is not supported yet: we just
3807
* check the first address now.
3808
*/
3809
family = sk->sk_family;
3810
if (family == PF_INET || family == PF_INET6) {
3811
char *addrp;
3812
struct sk_security_struct *sksec = sk->sk_security;
3813
struct common_audit_data ad;
3814
struct sockaddr_in *addr4 = NULL;
3815
struct sockaddr_in6 *addr6 = NULL;
3816
unsigned short snum;
3817
u32 sid, node_perm;
3818
3819
if (family == PF_INET) {
3820
addr4 = (struct sockaddr_in *)address;
3821
snum = ntohs(addr4->sin_port);
3822
addrp = (char *)&addr4->sin_addr.s_addr;
3823
} else {
3824
addr6 = (struct sockaddr_in6 *)address;
3825
snum = ntohs(addr6->sin6_port);
3826
addrp = (char *)&addr6->sin6_addr.s6_addr;
3827
}
3828
3829
if (snum) {
3830
int low, high;
3831
3832
inet_get_local_port_range(&low, &high);
3833
3834
if (snum < max(PROT_SOCK, low) || snum > high) {
3835
err = sel_netport_sid(sk->sk_protocol,
3836
snum, &sid);
3837
if (err)
3838
goto out;
3839
COMMON_AUDIT_DATA_INIT(&ad, NET);
3840
ad.u.net.sport = htons(snum);
3841
ad.u.net.family = family;
3842
err = avc_has_perm(sksec->sid, sid,
3843
sksec->sclass,
3844
SOCKET__NAME_BIND, &ad);
3845
if (err)
3846
goto out;
3847
}
3848
}
3849
3850
switch (sksec->sclass) {
3851
case SECCLASS_TCP_SOCKET:
3852
node_perm = TCP_SOCKET__NODE_BIND;
3853
break;
3854
3855
case SECCLASS_UDP_SOCKET:
3856
node_perm = UDP_SOCKET__NODE_BIND;
3857
break;
3858
3859
case SECCLASS_DCCP_SOCKET:
3860
node_perm = DCCP_SOCKET__NODE_BIND;
3861
break;
3862
3863
default:
3864
node_perm = RAWIP_SOCKET__NODE_BIND;
3865
break;
3866
}
3867
3868
err = sel_netnode_sid(addrp, family, &sid);
3869
if (err)
3870
goto out;
3871
3872
COMMON_AUDIT_DATA_INIT(&ad, NET);
3873
ad.u.net.sport = htons(snum);
3874
ad.u.net.family = family;
3875
3876
if (family == PF_INET)
3877
ad.u.net.v4info.saddr = addr4->sin_addr.s_addr;
3878
else
3879
ipv6_addr_copy(&ad.u.net.v6info.saddr, &addr6->sin6_addr);
3880
3881
err = avc_has_perm(sksec->sid, sid,
3882
sksec->sclass, node_perm, &ad);
3883
if (err)
3884
goto out;
3885
}
3886
out:
3887
return err;
3888
}
3889
3890
static int selinux_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
3891
{
3892
struct sock *sk = sock->sk;
3893
struct sk_security_struct *sksec = sk->sk_security;
3894
int err;
3895
3896
err = sock_has_perm(current, sk, SOCKET__CONNECT);
3897
if (err)
3898
return err;
3899
3900
/*
3901
* If a TCP or DCCP socket, check name_connect permission for the port.
3902
*/
3903
if (sksec->sclass == SECCLASS_TCP_SOCKET ||
3904
sksec->sclass == SECCLASS_DCCP_SOCKET) {
3905
struct common_audit_data ad;
3906
struct sockaddr_in *addr4 = NULL;
3907
struct sockaddr_in6 *addr6 = NULL;
3908
unsigned short snum;
3909
u32 sid, perm;
3910
3911
if (sk->sk_family == PF_INET) {
3912
addr4 = (struct sockaddr_in *)address;
3913
if (addrlen < sizeof(struct sockaddr_in))
3914
return -EINVAL;
3915
snum = ntohs(addr4->sin_port);
3916
} else {
3917
addr6 = (struct sockaddr_in6 *)address;
3918
if (addrlen < SIN6_LEN_RFC2133)
3919
return -EINVAL;
3920
snum = ntohs(addr6->sin6_port);
3921
}
3922
3923
err = sel_netport_sid(sk->sk_protocol, snum, &sid);
3924
if (err)
3925
goto out;
3926
3927
perm = (sksec->sclass == SECCLASS_TCP_SOCKET) ?
3928
TCP_SOCKET__NAME_CONNECT : DCCP_SOCKET__NAME_CONNECT;
3929
3930
COMMON_AUDIT_DATA_INIT(&ad, NET);
3931
ad.u.net.dport = htons(snum);
3932
ad.u.net.family = sk->sk_family;
3933
err = avc_has_perm(sksec->sid, sid, sksec->sclass, perm, &ad);
3934
if (err)
3935
goto out;
3936
}
3937
3938
err = selinux_netlbl_socket_connect(sk, address);
3939
3940
out:
3941
return err;
3942
}
3943
3944
static int selinux_socket_listen(struct socket *sock, int backlog)
3945
{
3946
return sock_has_perm(current, sock->sk, SOCKET__LISTEN);
3947
}
3948
3949
static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
3950
{
3951
int err;
3952
struct inode_security_struct *isec;
3953
struct inode_security_struct *newisec;
3954
3955
err = sock_has_perm(current, sock->sk, SOCKET__ACCEPT);
3956
if (err)
3957
return err;
3958
3959
newisec = SOCK_INODE(newsock)->i_security;
3960
3961
isec = SOCK_INODE(sock)->i_security;
3962
newisec->sclass = isec->sclass;
3963
newisec->sid = isec->sid;
3964
newisec->initialized = 1;
3965
3966
return 0;
3967
}
3968
3969
static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
3970
int size)
3971
{
3972
return sock_has_perm(current, sock->sk, SOCKET__WRITE);
3973
}
3974
3975
static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
3976
int size, int flags)
3977
{
3978
return sock_has_perm(current, sock->sk, SOCKET__READ);
3979
}
3980
3981
static int selinux_socket_getsockname(struct socket *sock)
3982
{
3983
return sock_has_perm(current, sock->sk, SOCKET__GETATTR);
3984
}
3985
3986
static int selinux_socket_getpeername(struct socket *sock)
3987
{
3988
return sock_has_perm(current, sock->sk, SOCKET__GETATTR);
3989
}
3990
3991
static int selinux_socket_setsockopt(struct socket *sock, int level, int optname)
3992
{
3993
int err;
3994
3995
err = sock_has_perm(current, sock->sk, SOCKET__SETOPT);
3996
if (err)
3997
return err;
3998
3999
return selinux_netlbl_socket_setsockopt(sock, level, optname);
4000
}
4001
4002
static int selinux_socket_getsockopt(struct socket *sock, int level,
4003
int optname)
4004
{
4005
return sock_has_perm(current, sock->sk, SOCKET__GETOPT);
4006
}
4007
4008
static int selinux_socket_shutdown(struct socket *sock, int how)
4009
{
4010
return sock_has_perm(current, sock->sk, SOCKET__SHUTDOWN);
4011
}
4012
4013
static int selinux_socket_unix_stream_connect(struct sock *sock,
4014
struct sock *other,
4015
struct sock *newsk)
4016
{
4017
struct sk_security_struct *sksec_sock = sock->sk_security;
4018
struct sk_security_struct *sksec_other = other->sk_security;
4019
struct sk_security_struct *sksec_new = newsk->sk_security;
4020
struct common_audit_data ad;
4021
int err;
4022
4023
COMMON_AUDIT_DATA_INIT(&ad, NET);
4024
ad.u.net.sk = other;
4025
4026
err = avc_has_perm(sksec_sock->sid, sksec_other->sid,
4027
sksec_other->sclass,
4028
UNIX_STREAM_SOCKET__CONNECTTO, &ad);
4029
if (err)
4030
return err;
4031
4032
/* server child socket */
4033
sksec_new->peer_sid = sksec_sock->sid;
4034
err = security_sid_mls_copy(sksec_other->sid, sksec_sock->sid,
4035
&sksec_new->sid);
4036
if (err)
4037
return err;
4038
4039
/* connecting socket */
4040
sksec_sock->peer_sid = sksec_new->sid;
4041
4042
return 0;
4043
}
4044
4045
static int selinux_socket_unix_may_send(struct socket *sock,
4046
struct socket *other)
4047
{
4048
struct sk_security_struct *ssec = sock->sk->sk_security;
4049
struct sk_security_struct *osec = other->sk->sk_security;
4050
struct common_audit_data ad;
4051
4052
COMMON_AUDIT_DATA_INIT(&ad, NET);
4053
ad.u.net.sk = other->sk;
4054
4055
return avc_has_perm(ssec->sid, osec->sid, osec->sclass, SOCKET__SENDTO,
4056
&ad);
4057
}
4058
4059
static int selinux_inet_sys_rcv_skb(int ifindex, char *addrp, u16 family,
4060
u32 peer_sid,
4061
struct common_audit_data *ad)
4062
{
4063
int err;
4064
u32 if_sid;
4065
u32 node_sid;
4066
4067
err = sel_netif_sid(ifindex, &if_sid);
4068
if (err)
4069
return err;
4070
err = avc_has_perm(peer_sid, if_sid,
4071
SECCLASS_NETIF, NETIF__INGRESS, ad);
4072
if (err)
4073
return err;
4074
4075
err = sel_netnode_sid(addrp, family, &node_sid);
4076
if (err)
4077
return err;
4078
return avc_has_perm(peer_sid, node_sid,
4079
SECCLASS_NODE, NODE__RECVFROM, ad);
4080
}
4081
4082
static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb,
4083
u16 family)
4084
{
4085
int err = 0;
4086
struct sk_security_struct *sksec = sk->sk_security;
4087
u32 sk_sid = sksec->sid;
4088
struct common_audit_data ad;
4089
char *addrp;
4090
4091
COMMON_AUDIT_DATA_INIT(&ad, NET);
4092
ad.u.net.netif = skb->skb_iif;
4093
ad.u.net.family = family;
4094
err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4095
if (err)
4096
return err;
4097
4098
if (selinux_secmark_enabled()) {
4099
err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4100
PACKET__RECV, &ad);
4101
if (err)
4102
return err;
4103
}
4104
4105
err = selinux_netlbl_sock_rcv_skb(sksec, skb, family, &ad);
4106
if (err)
4107
return err;
4108
err = selinux_xfrm_sock_rcv_skb(sksec->sid, skb, &ad);
4109
4110
return err;
4111
}
4112
4113
static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
4114
{
4115
int err;
4116
struct sk_security_struct *sksec = sk->sk_security;
4117
u16 family = sk->sk_family;
4118
u32 sk_sid = sksec->sid;
4119
struct common_audit_data ad;
4120
char *addrp;
4121
u8 secmark_active;
4122
u8 peerlbl_active;
4123
4124
if (family != PF_INET && family != PF_INET6)
4125
return 0;
4126
4127
/* Handle mapped IPv4 packets arriving via IPv6 sockets */
4128
if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4129
family = PF_INET;
4130
4131
/* If any sort of compatibility mode is enabled then handoff processing
4132
* to the selinux_sock_rcv_skb_compat() function to deal with the
4133
* special handling. We do this in an attempt to keep this function
4134
* as fast and as clean as possible. */
4135
if (!selinux_policycap_netpeer)
4136
return selinux_sock_rcv_skb_compat(sk, skb, family);
4137
4138
secmark_active = selinux_secmark_enabled();
4139
peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled();
4140
if (!secmark_active && !peerlbl_active)
4141
return 0;
4142
4143
COMMON_AUDIT_DATA_INIT(&ad, NET);
4144
ad.u.net.netif = skb->skb_iif;
4145
ad.u.net.family = family;
4146
err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4147
if (err)
4148
return err;
4149
4150
if (peerlbl_active) {
4151
u32 peer_sid;
4152
4153
err = selinux_skb_peerlbl_sid(skb, family, &peer_sid);
4154
if (err)
4155
return err;
4156
err = selinux_inet_sys_rcv_skb(skb->skb_iif, addrp, family,
4157
peer_sid, &ad);
4158
if (err) {
4159
selinux_netlbl_err(skb, err, 0);
4160
return err;
4161
}
4162
err = avc_has_perm(sk_sid, peer_sid, SECCLASS_PEER,
4163
PEER__RECV, &ad);
4164
if (err)
4165
selinux_netlbl_err(skb, err, 0);
4166
}
4167
4168
if (secmark_active) {
4169
err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4170
PACKET__RECV, &ad);
4171
if (err)
4172
return err;
4173
}
4174
4175
return err;
4176
}
4177
4178
static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *optval,
4179
int __user *optlen, unsigned len)
4180
{
4181
int err = 0;
4182
char *scontext;
4183
u32 scontext_len;
4184
struct sk_security_struct *sksec = sock->sk->sk_security;
4185
u32 peer_sid = SECSID_NULL;
4186
4187
if (sksec->sclass == SECCLASS_UNIX_STREAM_SOCKET ||
4188
sksec->sclass == SECCLASS_TCP_SOCKET)
4189
peer_sid = sksec->peer_sid;
4190
if (peer_sid == SECSID_NULL)
4191
return -ENOPROTOOPT;
4192
4193
err = security_sid_to_context(peer_sid, &scontext, &scontext_len);
4194
if (err)
4195
return err;
4196
4197
if (scontext_len > len) {
4198
err = -ERANGE;
4199
goto out_len;
4200
}
4201
4202
if (copy_to_user(optval, scontext, scontext_len))
4203
err = -EFAULT;
4204
4205
out_len:
4206
if (put_user(scontext_len, optlen))
4207
err = -EFAULT;
4208
kfree(scontext);
4209
return err;
4210
}
4211
4212
static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
4213
{
4214
u32 peer_secid = SECSID_NULL;
4215
u16 family;
4216
4217
if (skb && skb->protocol == htons(ETH_P_IP))
4218
family = PF_INET;
4219
else if (skb && skb->protocol == htons(ETH_P_IPV6))
4220
family = PF_INET6;
4221
else if (sock)
4222
family = sock->sk->sk_family;
4223
else
4224
goto out;
4225
4226
if (sock && family == PF_UNIX)
4227
selinux_inode_getsecid(SOCK_INODE(sock), &peer_secid);
4228
else if (skb)
4229
selinux_skb_peerlbl_sid(skb, family, &peer_secid);
4230
4231
out:
4232
*secid = peer_secid;
4233
if (peer_secid == SECSID_NULL)
4234
return -EINVAL;
4235
return 0;
4236
}
4237
4238
static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority)
4239
{
4240
struct sk_security_struct *sksec;
4241
4242
sksec = kzalloc(sizeof(*sksec), priority);
4243
if (!sksec)
4244
return -ENOMEM;
4245
4246
sksec->peer_sid = SECINITSID_UNLABELED;
4247
sksec->sid = SECINITSID_UNLABELED;
4248
selinux_netlbl_sk_security_reset(sksec);
4249
sk->sk_security = sksec;
4250
4251
return 0;
4252
}
4253
4254
static void selinux_sk_free_security(struct sock *sk)
4255
{
4256
struct sk_security_struct *sksec = sk->sk_security;
4257
4258
sk->sk_security = NULL;
4259
selinux_netlbl_sk_security_free(sksec);
4260
kfree(sksec);
4261
}
4262
4263
static void selinux_sk_clone_security(const struct sock *sk, struct sock *newsk)
4264
{
4265
struct sk_security_struct *sksec = sk->sk_security;
4266
struct sk_security_struct *newsksec = newsk->sk_security;
4267
4268
newsksec->sid = sksec->sid;
4269
newsksec->peer_sid = sksec->peer_sid;
4270
newsksec->sclass = sksec->sclass;
4271
4272
selinux_netlbl_sk_security_reset(newsksec);
4273
}
4274
4275
static void selinux_sk_getsecid(struct sock *sk, u32 *secid)
4276
{
4277
if (!sk)
4278
*secid = SECINITSID_ANY_SOCKET;
4279
else {
4280
struct sk_security_struct *sksec = sk->sk_security;
4281
4282
*secid = sksec->sid;
4283
}
4284
}
4285
4286
static void selinux_sock_graft(struct sock *sk, struct socket *parent)
4287
{
4288
struct inode_security_struct *isec = SOCK_INODE(parent)->i_security;
4289
struct sk_security_struct *sksec = sk->sk_security;
4290
4291
if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6 ||
4292
sk->sk_family == PF_UNIX)
4293
isec->sid = sksec->sid;
4294
sksec->sclass = isec->sclass;
4295
}
4296
4297
static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb,
4298
struct request_sock *req)
4299
{
4300
struct sk_security_struct *sksec = sk->sk_security;
4301
int err;
4302
u16 family = sk->sk_family;
4303
u32 newsid;
4304
u32 peersid;
4305
4306
/* handle mapped IPv4 packets arriving via IPv6 sockets */
4307
if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4308
family = PF_INET;
4309
4310
err = selinux_skb_peerlbl_sid(skb, family, &peersid);
4311
if (err)
4312
return err;
4313
if (peersid == SECSID_NULL) {
4314
req->secid = sksec->sid;
4315
req->peer_secid = SECSID_NULL;
4316
} else {
4317
err = security_sid_mls_copy(sksec->sid, peersid, &newsid);
4318
if (err)
4319
return err;
4320
req->secid = newsid;
4321
req->peer_secid = peersid;
4322
}
4323
4324
return selinux_netlbl_inet_conn_request(req, family);
4325
}
4326
4327
static void selinux_inet_csk_clone(struct sock *newsk,
4328
const struct request_sock *req)
4329
{
4330
struct sk_security_struct *newsksec = newsk->sk_security;
4331
4332
newsksec->sid = req->secid;
4333
newsksec->peer_sid = req->peer_secid;
4334
/* NOTE: Ideally, we should also get the isec->sid for the
4335
new socket in sync, but we don't have the isec available yet.
4336
So we will wait until sock_graft to do it, by which
4337
time it will have been created and available. */
4338
4339
/* We don't need to take any sort of lock here as we are the only
4340
* thread with access to newsksec */
4341
selinux_netlbl_inet_csk_clone(newsk, req->rsk_ops->family);
4342
}
4343
4344
static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb)
4345
{
4346
u16 family = sk->sk_family;
4347
struct sk_security_struct *sksec = sk->sk_security;
4348
4349
/* handle mapped IPv4 packets arriving via IPv6 sockets */
4350
if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4351
family = PF_INET;
4352
4353
selinux_skb_peerlbl_sid(skb, family, &sksec->peer_sid);
4354
}
4355
4356
static int selinux_secmark_relabel_packet(u32 sid)
4357
{
4358
const struct task_security_struct *__tsec;
4359
u32 tsid;
4360
4361
__tsec = current_security();
4362
tsid = __tsec->sid;
4363
4364
return avc_has_perm(tsid, sid, SECCLASS_PACKET, PACKET__RELABELTO, NULL);
4365
}
4366
4367
static void selinux_secmark_refcount_inc(void)
4368
{
4369
atomic_inc(&selinux_secmark_refcount);
4370
}
4371
4372
static void selinux_secmark_refcount_dec(void)
4373
{
4374
atomic_dec(&selinux_secmark_refcount);
4375
}
4376
4377
static void selinux_req_classify_flow(const struct request_sock *req,
4378
struct flowi *fl)
4379
{
4380
fl->flowi_secid = req->secid;
4381
}
4382
4383
static int selinux_tun_dev_create(void)
4384
{
4385
u32 sid = current_sid();
4386
4387
/* we aren't taking into account the "sockcreate" SID since the socket
4388
* that is being created here is not a socket in the traditional sense,
4389
* instead it is a private sock, accessible only to the kernel, and
4390
* representing a wide range of network traffic spanning multiple
4391
* connections unlike traditional sockets - check the TUN driver to
4392
* get a better understanding of why this socket is special */
4393
4394
return avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET, TUN_SOCKET__CREATE,
4395
NULL);
4396
}
4397
4398
static void selinux_tun_dev_post_create(struct sock *sk)
4399
{
4400
struct sk_security_struct *sksec = sk->sk_security;
4401
4402
/* we don't currently perform any NetLabel based labeling here and it
4403
* isn't clear that we would want to do so anyway; while we could apply
4404
* labeling without the support of the TUN user the resulting labeled
4405
* traffic from the other end of the connection would almost certainly
4406
* cause confusion to the TUN user that had no idea network labeling
4407
* protocols were being used */
4408
4409
/* see the comments in selinux_tun_dev_create() about why we don't use
4410
* the sockcreate SID here */
4411
4412
sksec->sid = current_sid();
4413
sksec->sclass = SECCLASS_TUN_SOCKET;
4414
}
4415
4416
static int selinux_tun_dev_attach(struct sock *sk)
4417
{
4418
struct sk_security_struct *sksec = sk->sk_security;
4419
u32 sid = current_sid();
4420
int err;
4421
4422
err = avc_has_perm(sid, sksec->sid, SECCLASS_TUN_SOCKET,
4423
TUN_SOCKET__RELABELFROM, NULL);
4424
if (err)
4425
return err;
4426
err = avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET,
4427
TUN_SOCKET__RELABELTO, NULL);
4428
if (err)
4429
return err;
4430
4431
sksec->sid = sid;
4432
4433
return 0;
4434
}
4435
4436
static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
4437
{
4438
int err = 0;
4439
u32 perm;
4440
struct nlmsghdr *nlh;
4441
struct sk_security_struct *sksec = sk->sk_security;
4442
4443
if (skb->len < NLMSG_SPACE(0)) {
4444
err = -EINVAL;
4445
goto out;
4446
}
4447
nlh = nlmsg_hdr(skb);
4448
4449
err = selinux_nlmsg_lookup(sksec->sclass, nlh->nlmsg_type, &perm);
4450
if (err) {
4451
if (err == -EINVAL) {
4452
audit_log(current->audit_context, GFP_KERNEL, AUDIT_SELINUX_ERR,
4453
"SELinux: unrecognized netlink message"
4454
" type=%hu for sclass=%hu\n",
4455
nlh->nlmsg_type, sksec->sclass);
4456
if (!selinux_enforcing || security_get_allow_unknown())
4457
err = 0;
4458
}
4459
4460
/* Ignore */
4461
if (err == -ENOENT)
4462
err = 0;
4463
goto out;
4464
}
4465
4466
err = sock_has_perm(current, sk, perm);
4467
out:
4468
return err;
4469
}
4470
4471
#ifdef CONFIG_NETFILTER
4472
4473
static unsigned int selinux_ip_forward(struct sk_buff *skb, int ifindex,
4474
u16 family)
4475
{
4476
int err;
4477
char *addrp;
4478
u32 peer_sid;
4479
struct common_audit_data ad;
4480
u8 secmark_active;
4481
u8 netlbl_active;
4482
u8 peerlbl_active;
4483
4484
if (!selinux_policycap_netpeer)
4485
return NF_ACCEPT;
4486
4487
secmark_active = selinux_secmark_enabled();
4488
netlbl_active = netlbl_enabled();
4489
peerlbl_active = netlbl_active || selinux_xfrm_enabled();
4490
if (!secmark_active && !peerlbl_active)
4491
return NF_ACCEPT;
4492
4493
if (selinux_skb_peerlbl_sid(skb, family, &peer_sid) != 0)
4494
return NF_DROP;
4495
4496
COMMON_AUDIT_DATA_INIT(&ad, NET);
4497
ad.u.net.netif = ifindex;
4498
ad.u.net.family = family;
4499
if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0)
4500
return NF_DROP;
4501
4502
if (peerlbl_active) {
4503
err = selinux_inet_sys_rcv_skb(ifindex, addrp, family,
4504
peer_sid, &ad);
4505
if (err) {
4506
selinux_netlbl_err(skb, err, 1);
4507
return NF_DROP;
4508
}
4509
}
4510
4511
if (secmark_active)
4512
if (avc_has_perm(peer_sid, skb->secmark,
4513
SECCLASS_PACKET, PACKET__FORWARD_IN, &ad))
4514
return NF_DROP;
4515
4516
if (netlbl_active)
4517
/* we do this in the FORWARD path and not the POST_ROUTING
4518
* path because we want to make sure we apply the necessary
4519
* labeling before IPsec is applied so we can leverage AH
4520
* protection */
4521
if (selinux_netlbl_skbuff_setsid(skb, family, peer_sid) != 0)
4522
return NF_DROP;
4523
4524
return NF_ACCEPT;
4525
}
4526
4527
static unsigned int selinux_ipv4_forward(unsigned int hooknum,
4528
struct sk_buff *skb,
4529
const struct net_device *in,
4530
const struct net_device *out,
4531
int (*okfn)(struct sk_buff *))
4532
{
4533
return selinux_ip_forward(skb, in->ifindex, PF_INET);
4534
}
4535
4536
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4537
static unsigned int selinux_ipv6_forward(unsigned int hooknum,
4538
struct sk_buff *skb,
4539
const struct net_device *in,
4540
const struct net_device *out,
4541
int (*okfn)(struct sk_buff *))
4542
{
4543
return selinux_ip_forward(skb, in->ifindex, PF_INET6);
4544
}
4545
#endif /* IPV6 */
4546
4547
static unsigned int selinux_ip_output(struct sk_buff *skb,
4548
u16 family)
4549
{
4550
u32 sid;
4551
4552
if (!netlbl_enabled())
4553
return NF_ACCEPT;
4554
4555
/* we do this in the LOCAL_OUT path and not the POST_ROUTING path
4556
* because we want to make sure we apply the necessary labeling
4557
* before IPsec is applied so we can leverage AH protection */
4558
if (skb->sk) {
4559
struct sk_security_struct *sksec = skb->sk->sk_security;
4560
sid = sksec->sid;
4561
} else
4562
sid = SECINITSID_KERNEL;
4563
if (selinux_netlbl_skbuff_setsid(skb, family, sid) != 0)
4564
return NF_DROP;
4565
4566
return NF_ACCEPT;
4567
}
4568
4569
static unsigned int selinux_ipv4_output(unsigned int hooknum,
4570
struct sk_buff *skb,
4571
const struct net_device *in,
4572
const struct net_device *out,
4573
int (*okfn)(struct sk_buff *))
4574
{
4575
return selinux_ip_output(skb, PF_INET);
4576
}
4577
4578
static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb,
4579
int ifindex,
4580
u16 family)
4581
{
4582
struct sock *sk = skb->sk;
4583
struct sk_security_struct *sksec;
4584
struct common_audit_data ad;
4585
char *addrp;
4586
u8 proto;
4587
4588
if (sk == NULL)
4589
return NF_ACCEPT;
4590
sksec = sk->sk_security;
4591
4592
COMMON_AUDIT_DATA_INIT(&ad, NET);
4593
ad.u.net.netif = ifindex;
4594
ad.u.net.family = family;
4595
if (selinux_parse_skb(skb, &ad, &addrp, 0, &proto))
4596
return NF_DROP;
4597
4598
if (selinux_secmark_enabled())
4599
if (avc_has_perm(sksec->sid, skb->secmark,
4600
SECCLASS_PACKET, PACKET__SEND, &ad))
4601
return NF_DROP_ERR(-ECONNREFUSED);
4602
4603
if (selinux_xfrm_postroute_last(sksec->sid, skb, &ad, proto))
4604
return NF_DROP_ERR(-ECONNREFUSED);
4605
4606
return NF_ACCEPT;
4607
}
4608
4609
static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex,
4610
u16 family)
4611
{
4612
u32 secmark_perm;
4613
u32 peer_sid;
4614
struct sock *sk;
4615
struct common_audit_data ad;
4616
char *addrp;
4617
u8 secmark_active;
4618
u8 peerlbl_active;
4619
4620
/* If any sort of compatibility mode is enabled then handoff processing
4621
* to the selinux_ip_postroute_compat() function to deal with the
4622
* special handling. We do this in an attempt to keep this function
4623
* as fast and as clean as possible. */
4624
if (!selinux_policycap_netpeer)
4625
return selinux_ip_postroute_compat(skb, ifindex, family);
4626
#ifdef CONFIG_XFRM
4627
/* If skb->dst->xfrm is non-NULL then the packet is undergoing an IPsec
4628
* packet transformation so allow the packet to pass without any checks
4629
* since we'll have another chance to perform access control checks
4630
* when the packet is on it's final way out.
4631
* NOTE: there appear to be some IPv6 multicast cases where skb->dst
4632
* is NULL, in this case go ahead and apply access control. */
4633
if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL)
4634
return NF_ACCEPT;
4635
#endif
4636
secmark_active = selinux_secmark_enabled();
4637
peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled();
4638
if (!secmark_active && !peerlbl_active)
4639
return NF_ACCEPT;
4640
4641
/* if the packet is being forwarded then get the peer label from the
4642
* packet itself; otherwise check to see if it is from a local
4643
* application or the kernel, if from an application get the peer label
4644
* from the sending socket, otherwise use the kernel's sid */
4645
sk = skb->sk;
4646
if (sk == NULL) {
4647
if (skb->skb_iif) {
4648
secmark_perm = PACKET__FORWARD_OUT;
4649
if (selinux_skb_peerlbl_sid(skb, family, &peer_sid))
4650
return NF_DROP;
4651
} else {
4652
secmark_perm = PACKET__SEND;
4653
peer_sid = SECINITSID_KERNEL;
4654
}
4655
} else {
4656
struct sk_security_struct *sksec = sk->sk_security;
4657
peer_sid = sksec->sid;
4658
secmark_perm = PACKET__SEND;
4659
}
4660
4661
COMMON_AUDIT_DATA_INIT(&ad, NET);
4662
ad.u.net.netif = ifindex;
4663
ad.u.net.family = family;
4664
if (selinux_parse_skb(skb, &ad, &addrp, 0, NULL))
4665
return NF_DROP;
4666
4667
if (secmark_active)
4668
if (avc_has_perm(peer_sid, skb->secmark,
4669
SECCLASS_PACKET, secmark_perm, &ad))
4670
return NF_DROP_ERR(-ECONNREFUSED);
4671
4672
if (peerlbl_active) {
4673
u32 if_sid;
4674
u32 node_sid;
4675
4676
if (sel_netif_sid(ifindex, &if_sid))
4677
return NF_DROP;
4678
if (avc_has_perm(peer_sid, if_sid,
4679
SECCLASS_NETIF, NETIF__EGRESS, &ad))
4680
return NF_DROP_ERR(-ECONNREFUSED);
4681
4682
if (sel_netnode_sid(addrp, family, &node_sid))
4683
return NF_DROP;
4684
if (avc_has_perm(peer_sid, node_sid,
4685
SECCLASS_NODE, NODE__SENDTO, &ad))
4686
return NF_DROP_ERR(-ECONNREFUSED);
4687
}
4688
4689
return NF_ACCEPT;
4690
}
4691
4692
static unsigned int selinux_ipv4_postroute(unsigned int hooknum,
4693
struct sk_buff *skb,
4694
const struct net_device *in,
4695
const struct net_device *out,
4696
int (*okfn)(struct sk_buff *))
4697
{
4698
return selinux_ip_postroute(skb, out->ifindex, PF_INET);
4699
}
4700
4701
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4702
static unsigned int selinux_ipv6_postroute(unsigned int hooknum,
4703
struct sk_buff *skb,
4704
const struct net_device *in,
4705
const struct net_device *out,
4706
int (*okfn)(struct sk_buff *))
4707
{
4708
return selinux_ip_postroute(skb, out->ifindex, PF_INET6);
4709
}
4710
#endif /* IPV6 */
4711
4712
#endif /* CONFIG_NETFILTER */
4713
4714
static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
4715
{
4716
int err;
4717
4718
err = cap_netlink_send(sk, skb);
4719
if (err)
4720
return err;
4721
4722
return selinux_nlmsg_perm(sk, skb);
4723
}
4724
4725
static int selinux_netlink_recv(struct sk_buff *skb, int capability)
4726
{
4727
int err;
4728
struct common_audit_data ad;
4729
u32 sid;
4730
4731
err = cap_netlink_recv(skb, capability);
4732
if (err)
4733
return err;
4734
4735
COMMON_AUDIT_DATA_INIT(&ad, CAP);
4736
ad.u.cap = capability;
4737
4738
security_task_getsecid(current, &sid);
4739
return avc_has_perm(sid, sid, SECCLASS_CAPABILITY,
4740
CAP_TO_MASK(capability), &ad);
4741
}
4742
4743
static int ipc_alloc_security(struct task_struct *task,
4744
struct kern_ipc_perm *perm,
4745
u16 sclass)
4746
{
4747
struct ipc_security_struct *isec;
4748
u32 sid;
4749
4750
isec = kzalloc(sizeof(struct ipc_security_struct), GFP_KERNEL);
4751
if (!isec)
4752
return -ENOMEM;
4753
4754
sid = task_sid(task);
4755
isec->sclass = sclass;
4756
isec->sid = sid;
4757
perm->security = isec;
4758
4759
return 0;
4760
}
4761
4762
static void ipc_free_security(struct kern_ipc_perm *perm)
4763
{
4764
struct ipc_security_struct *isec = perm->security;
4765
perm->security = NULL;
4766
kfree(isec);
4767
}
4768
4769
static int msg_msg_alloc_security(struct msg_msg *msg)
4770
{
4771
struct msg_security_struct *msec;
4772
4773
msec = kzalloc(sizeof(struct msg_security_struct), GFP_KERNEL);
4774
if (!msec)
4775
return -ENOMEM;
4776
4777
msec->sid = SECINITSID_UNLABELED;
4778
msg->security = msec;
4779
4780
return 0;
4781
}
4782
4783
static void msg_msg_free_security(struct msg_msg *msg)
4784
{
4785
struct msg_security_struct *msec = msg->security;
4786
4787
msg->security = NULL;
4788
kfree(msec);
4789
}
4790
4791
static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
4792
u32 perms)
4793
{
4794
struct ipc_security_struct *isec;
4795
struct common_audit_data ad;
4796
u32 sid = current_sid();
4797
4798
isec = ipc_perms->security;
4799
4800
COMMON_AUDIT_DATA_INIT(&ad, IPC);
4801
ad.u.ipc_id = ipc_perms->key;
4802
4803
return avc_has_perm(sid, isec->sid, isec->sclass, perms, &ad);
4804
}
4805
4806
static int selinux_msg_msg_alloc_security(struct msg_msg *msg)
4807
{
4808
return msg_msg_alloc_security(msg);
4809
}
4810
4811
static void selinux_msg_msg_free_security(struct msg_msg *msg)
4812
{
4813
msg_msg_free_security(msg);
4814
}
4815
4816
/* message queue security operations */
4817
static int selinux_msg_queue_alloc_security(struct msg_queue *msq)
4818
{
4819
struct ipc_security_struct *isec;
4820
struct common_audit_data ad;
4821
u32 sid = current_sid();
4822
int rc;
4823
4824
rc = ipc_alloc_security(current, &msq->q_perm, SECCLASS_MSGQ);
4825
if (rc)
4826
return rc;
4827
4828
isec = msq->q_perm.security;
4829
4830
COMMON_AUDIT_DATA_INIT(&ad, IPC);
4831
ad.u.ipc_id = msq->q_perm.key;
4832
4833
rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
4834
MSGQ__CREATE, &ad);
4835
if (rc) {
4836
ipc_free_security(&msq->q_perm);
4837
return rc;
4838
}
4839
return 0;
4840
}
4841
4842
static void selinux_msg_queue_free_security(struct msg_queue *msq)
4843
{
4844
ipc_free_security(&msq->q_perm);
4845
}
4846
4847
static int selinux_msg_queue_associate(struct msg_queue *msq, int msqflg)
4848
{
4849
struct ipc_security_struct *isec;
4850
struct common_audit_data ad;
4851
u32 sid = current_sid();
4852
4853
isec = msq->q_perm.security;
4854
4855
COMMON_AUDIT_DATA_INIT(&ad, IPC);
4856
ad.u.ipc_id = msq->q_perm.key;
4857
4858
return avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
4859
MSGQ__ASSOCIATE, &ad);
4860
}
4861
4862
static int selinux_msg_queue_msgctl(struct msg_queue *msq, int cmd)
4863
{
4864
int err;
4865
int perms;
4866
4867
switch (cmd) {
4868
case IPC_INFO:
4869
case MSG_INFO:
4870
/* No specific object, just general system-wide information. */
4871
return task_has_system(current, SYSTEM__IPC_INFO);
4872
case IPC_STAT:
4873
case MSG_STAT:
4874
perms = MSGQ__GETATTR | MSGQ__ASSOCIATE;
4875
break;
4876
case IPC_SET:
4877
perms = MSGQ__SETATTR;
4878
break;
4879
case IPC_RMID:
4880
perms = MSGQ__DESTROY;
4881
break;
4882
default:
4883
return 0;
4884
}
4885
4886
err = ipc_has_perm(&msq->q_perm, perms);
4887
return err;
4888
}
4889
4890
static int selinux_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg, int msqflg)
4891
{
4892
struct ipc_security_struct *isec;
4893
struct msg_security_struct *msec;
4894
struct common_audit_data ad;
4895
u32 sid = current_sid();
4896
int rc;
4897
4898
isec = msq->q_perm.security;
4899
msec = msg->security;
4900
4901
/*
4902
* First time through, need to assign label to the message
4903
*/
4904
if (msec->sid == SECINITSID_UNLABELED) {
4905
/*
4906
* Compute new sid based on current process and
4907
* message queue this message will be stored in
4908
*/
4909
rc = security_transition_sid(sid, isec->sid, SECCLASS_MSG,
4910
NULL, &msec->sid);
4911
if (rc)
4912
return rc;
4913
}
4914
4915
COMMON_AUDIT_DATA_INIT(&ad, IPC);
4916
ad.u.ipc_id = msq->q_perm.key;
4917
4918
/* Can this process write to the queue? */
4919
rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
4920
MSGQ__WRITE, &ad);
4921
if (!rc)
4922
/* Can this process send the message */
4923
rc = avc_has_perm(sid, msec->sid, SECCLASS_MSG,
4924
MSG__SEND, &ad);
4925
if (!rc)
4926
/* Can the message be put in the queue? */
4927
rc = avc_has_perm(msec->sid, isec->sid, SECCLASS_MSGQ,
4928
MSGQ__ENQUEUE, &ad);
4929
4930
return rc;
4931
}
4932
4933
static int selinux_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
4934
struct task_struct *target,
4935
long type, int mode)
4936
{
4937
struct ipc_security_struct *isec;
4938
struct msg_security_struct *msec;
4939
struct common_audit_data ad;
4940
u32 sid = task_sid(target);
4941
int rc;
4942
4943
isec = msq->q_perm.security;
4944
msec = msg->security;
4945
4946
COMMON_AUDIT_DATA_INIT(&ad, IPC);
4947
ad.u.ipc_id = msq->q_perm.key;
4948
4949
rc = avc_has_perm(sid, isec->sid,
4950
SECCLASS_MSGQ, MSGQ__READ, &ad);
4951
if (!rc)
4952
rc = avc_has_perm(sid, msec->sid,
4953
SECCLASS_MSG, MSG__RECEIVE, &ad);
4954
return rc;
4955
}
4956
4957
/* Shared Memory security operations */
4958
static int selinux_shm_alloc_security(struct shmid_kernel *shp)
4959
{
4960
struct ipc_security_struct *isec;
4961
struct common_audit_data ad;
4962
u32 sid = current_sid();
4963
int rc;
4964
4965
rc = ipc_alloc_security(current, &shp->shm_perm, SECCLASS_SHM);
4966
if (rc)
4967
return rc;
4968
4969
isec = shp->shm_perm.security;
4970
4971
COMMON_AUDIT_DATA_INIT(&ad, IPC);
4972
ad.u.ipc_id = shp->shm_perm.key;
4973
4974
rc = avc_has_perm(sid, isec->sid, SECCLASS_SHM,
4975
SHM__CREATE, &ad);
4976
if (rc) {
4977
ipc_free_security(&shp->shm_perm);
4978
return rc;
4979
}
4980
return 0;
4981
}
4982
4983
static void selinux_shm_free_security(struct shmid_kernel *shp)
4984
{
4985
ipc_free_security(&shp->shm_perm);
4986
}
4987
4988
static int selinux_shm_associate(struct shmid_kernel *shp, int shmflg)
4989
{
4990
struct ipc_security_struct *isec;
4991
struct common_audit_data ad;
4992
u32 sid = current_sid();
4993
4994
isec = shp->shm_perm.security;
4995
4996
COMMON_AUDIT_DATA_INIT(&ad, IPC);
4997
ad.u.ipc_id = shp->shm_perm.key;
4998
4999
return avc_has_perm(sid, isec->sid, SECCLASS_SHM,
5000
SHM__ASSOCIATE, &ad);
5001
}
5002
5003
/* Note, at this point, shp is locked down */
5004
static int selinux_shm_shmctl(struct shmid_kernel *shp, int cmd)
5005
{
5006
int perms;
5007
int err;
5008
5009
switch (cmd) {
5010
case IPC_INFO:
5011
case SHM_INFO:
5012
/* No specific object, just general system-wide information. */
5013
return task_has_system(current, SYSTEM__IPC_INFO);
5014
case IPC_STAT:
5015
case SHM_STAT:
5016
perms = SHM__GETATTR | SHM__ASSOCIATE;
5017
break;
5018
case IPC_SET:
5019
perms = SHM__SETATTR;
5020
break;
5021
case SHM_LOCK:
5022
case SHM_UNLOCK:
5023
perms = SHM__LOCK;
5024
break;
5025
case IPC_RMID:
5026
perms = SHM__DESTROY;
5027
break;
5028
default:
5029
return 0;
5030
}
5031
5032
err = ipc_has_perm(&shp->shm_perm, perms);
5033
return err;
5034
}
5035
5036
static int selinux_shm_shmat(struct shmid_kernel *shp,
5037
char __user *shmaddr, int shmflg)
5038
{
5039
u32 perms;
5040
5041
if (shmflg & SHM_RDONLY)
5042
perms = SHM__READ;
5043
else
5044
perms = SHM__READ | SHM__WRITE;
5045
5046
return ipc_has_perm(&shp->shm_perm, perms);
5047
}
5048
5049
/* Semaphore security operations */
5050
static int selinux_sem_alloc_security(struct sem_array *sma)
5051
{
5052
struct ipc_security_struct *isec;
5053
struct common_audit_data ad;
5054
u32 sid = current_sid();
5055
int rc;
5056
5057
rc = ipc_alloc_security(current, &sma->sem_perm, SECCLASS_SEM);
5058
if (rc)
5059
return rc;
5060
5061
isec = sma->sem_perm.security;
5062
5063
COMMON_AUDIT_DATA_INIT(&ad, IPC);
5064
ad.u.ipc_id = sma->sem_perm.key;
5065
5066
rc = avc_has_perm(sid, isec->sid, SECCLASS_SEM,
5067
SEM__CREATE, &ad);
5068
if (rc) {
5069
ipc_free_security(&sma->sem_perm);
5070
return rc;
5071
}
5072
return 0;
5073
}
5074
5075
static void selinux_sem_free_security(struct sem_array *sma)
5076
{
5077
ipc_free_security(&sma->sem_perm);
5078
}
5079
5080
static int selinux_sem_associate(struct sem_array *sma, int semflg)
5081
{
5082
struct ipc_security_struct *isec;
5083
struct common_audit_data ad;
5084
u32 sid = current_sid();
5085
5086
isec = sma->sem_perm.security;
5087
5088
COMMON_AUDIT_DATA_INIT(&ad, IPC);
5089
ad.u.ipc_id = sma->sem_perm.key;
5090
5091
return avc_has_perm(sid, isec->sid, SECCLASS_SEM,
5092
SEM__ASSOCIATE, &ad);
5093
}
5094
5095
/* Note, at this point, sma is locked down */
5096
static int selinux_sem_semctl(struct sem_array *sma, int cmd)
5097
{
5098
int err;
5099
u32 perms;
5100
5101
switch (cmd) {
5102
case IPC_INFO:
5103
case SEM_INFO:
5104
/* No specific object, just general system-wide information. */
5105
return task_has_system(current, SYSTEM__IPC_INFO);
5106
case GETPID:
5107
case GETNCNT:
5108
case GETZCNT:
5109
perms = SEM__GETATTR;
5110
break;
5111
case GETVAL:
5112
case GETALL:
5113
perms = SEM__READ;
5114
break;
5115
case SETVAL:
5116
case SETALL:
5117
perms = SEM__WRITE;
5118
break;
5119
case IPC_RMID:
5120
perms = SEM__DESTROY;
5121
break;
5122
case IPC_SET:
5123
perms = SEM__SETATTR;
5124
break;
5125
case IPC_STAT:
5126
case SEM_STAT:
5127
perms = SEM__GETATTR | SEM__ASSOCIATE;
5128
break;
5129
default:
5130
return 0;
5131
}
5132
5133
err = ipc_has_perm(&sma->sem_perm, perms);
5134
return err;
5135
}
5136
5137
static int selinux_sem_semop(struct sem_array *sma,
5138
struct sembuf *sops, unsigned nsops, int alter)
5139
{
5140
u32 perms;
5141
5142
if (alter)
5143
perms = SEM__READ | SEM__WRITE;
5144
else
5145
perms = SEM__READ;
5146
5147
return ipc_has_perm(&sma->sem_perm, perms);
5148
}
5149
5150
static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
5151
{
5152
u32 av = 0;
5153
5154
av = 0;
5155
if (flag & S_IRUGO)
5156
av |= IPC__UNIX_READ;
5157
if (flag & S_IWUGO)
5158
av |= IPC__UNIX_WRITE;
5159
5160
if (av == 0)
5161
return 0;
5162
5163
return ipc_has_perm(ipcp, av);
5164
}
5165
5166
static void selinux_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
5167
{
5168
struct ipc_security_struct *isec = ipcp->security;
5169
*secid = isec->sid;
5170
}
5171
5172
static void selinux_d_instantiate(struct dentry *dentry, struct inode *inode)
5173
{
5174
if (inode)
5175
inode_doinit_with_dentry(inode, dentry);
5176
}
5177
5178
static int selinux_getprocattr(struct task_struct *p,
5179
char *name, char **value)
5180
{
5181
const struct task_security_struct *__tsec;
5182
u32 sid;
5183
int error;
5184
unsigned len;
5185
5186
if (current != p) {
5187
error = current_has_perm(p, PROCESS__GETATTR);
5188
if (error)
5189
return error;
5190
}
5191
5192
rcu_read_lock();
5193
__tsec = __task_cred(p)->security;
5194
5195
if (!strcmp(name, "current"))
5196
sid = __tsec->sid;
5197
else if (!strcmp(name, "prev"))
5198
sid = __tsec->osid;
5199
else if (!strcmp(name, "exec"))
5200
sid = __tsec->exec_sid;
5201
else if (!strcmp(name, "fscreate"))
5202
sid = __tsec->create_sid;
5203
else if (!strcmp(name, "keycreate"))
5204
sid = __tsec->keycreate_sid;
5205
else if (!strcmp(name, "sockcreate"))
5206
sid = __tsec->sockcreate_sid;
5207
else
5208
goto invalid;
5209
rcu_read_unlock();
5210
5211
if (!sid)
5212
return 0;
5213
5214
error = security_sid_to_context(sid, value, &len);
5215
if (error)
5216
return error;
5217
return len;
5218
5219
invalid:
5220
rcu_read_unlock();
5221
return -EINVAL;
5222
}
5223
5224
static int selinux_setprocattr(struct task_struct *p,
5225
char *name, void *value, size_t size)
5226
{
5227
struct task_security_struct *tsec;
5228
struct task_struct *tracer;
5229
struct cred *new;
5230
u32 sid = 0, ptsid;
5231
int error;
5232
char *str = value;
5233
5234
if (current != p) {
5235
/* SELinux only allows a process to change its own
5236
security attributes. */
5237
return -EACCES;
5238
}
5239
5240
/*
5241
* Basic control over ability to set these attributes at all.
5242
* current == p, but we'll pass them separately in case the
5243
* above restriction is ever removed.
5244
*/
5245
if (!strcmp(name, "exec"))
5246
error = current_has_perm(p, PROCESS__SETEXEC);
5247
else if (!strcmp(name, "fscreate"))
5248
error = current_has_perm(p, PROCESS__SETFSCREATE);
5249
else if (!strcmp(name, "keycreate"))
5250
error = current_has_perm(p, PROCESS__SETKEYCREATE);
5251
else if (!strcmp(name, "sockcreate"))
5252
error = current_has_perm(p, PROCESS__SETSOCKCREATE);
5253
else if (!strcmp(name, "current"))
5254
error = current_has_perm(p, PROCESS__SETCURRENT);
5255
else
5256
error = -EINVAL;
5257
if (error)
5258
return error;
5259
5260
/* Obtain a SID for the context, if one was specified. */
5261
if (size && str[1] && str[1] != '\n') {
5262
if (str[size-1] == '\n') {
5263
str[size-1] = 0;
5264
size--;
5265
}
5266
error = security_context_to_sid(value, size, &sid);
5267
if (error == -EINVAL && !strcmp(name, "fscreate")) {
5268
if (!capable(CAP_MAC_ADMIN))
5269
return error;
5270
error = security_context_to_sid_force(value, size,
5271
&sid);
5272
}
5273
if (error)
5274
return error;
5275
}
5276
5277
new = prepare_creds();
5278
if (!new)
5279
return -ENOMEM;
5280
5281
/* Permission checking based on the specified context is
5282
performed during the actual operation (execve,
5283
open/mkdir/...), when we know the full context of the
5284
operation. See selinux_bprm_set_creds for the execve
5285
checks and may_create for the file creation checks. The
5286
operation will then fail if the context is not permitted. */
5287
tsec = new->security;
5288
if (!strcmp(name, "exec")) {
5289
tsec->exec_sid = sid;
5290
} else if (!strcmp(name, "fscreate")) {
5291
tsec->create_sid = sid;
5292
} else if (!strcmp(name, "keycreate")) {
5293
error = may_create_key(sid, p);
5294
if (error)
5295
goto abort_change;
5296
tsec->keycreate_sid = sid;
5297
} else if (!strcmp(name, "sockcreate")) {
5298
tsec->sockcreate_sid = sid;
5299
} else if (!strcmp(name, "current")) {
5300
error = -EINVAL;
5301
if (sid == 0)
5302
goto abort_change;
5303
5304
/* Only allow single threaded processes to change context */
5305
error = -EPERM;
5306
if (!current_is_single_threaded()) {
5307
error = security_bounded_transition(tsec->sid, sid);
5308
if (error)
5309
goto abort_change;
5310
}
5311
5312
/* Check permissions for the transition. */
5313
error = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
5314
PROCESS__DYNTRANSITION, NULL);
5315
if (error)
5316
goto abort_change;
5317
5318
/* Check for ptracing, and update the task SID if ok.
5319
Otherwise, leave SID unchanged and fail. */
5320
ptsid = 0;
5321
task_lock(p);
5322
tracer = tracehook_tracer_task(p);
5323
if (tracer)
5324
ptsid = task_sid(tracer);
5325
task_unlock(p);
5326
5327
if (tracer) {
5328
error = avc_has_perm(ptsid, sid, SECCLASS_PROCESS,
5329
PROCESS__PTRACE, NULL);
5330
if (error)
5331
goto abort_change;
5332
}
5333
5334
tsec->sid = sid;
5335
} else {
5336
error = -EINVAL;
5337
goto abort_change;
5338
}
5339
5340
commit_creds(new);
5341
return size;
5342
5343
abort_change:
5344
abort_creds(new);
5345
return error;
5346
}
5347
5348
static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
5349
{
5350
return security_sid_to_context(secid, secdata, seclen);
5351
}
5352
5353
static int selinux_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
5354
{
5355
return security_context_to_sid(secdata, seclen, secid);
5356
}
5357
5358
static void selinux_release_secctx(char *secdata, u32 seclen)
5359
{
5360
kfree(secdata);
5361
}
5362
5363
/*
5364
* called with inode->i_mutex locked
5365
*/
5366
static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
5367
{
5368
return selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX, ctx, ctxlen, 0);
5369
}
5370
5371
/*
5372
* called with inode->i_mutex locked
5373
*/
5374
static int selinux_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
5375
{
5376
return __vfs_setxattr_noperm(dentry, XATTR_NAME_SELINUX, ctx, ctxlen, 0);
5377
}
5378
5379
static int selinux_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
5380
{
5381
int len = 0;
5382
len = selinux_inode_getsecurity(inode, XATTR_SELINUX_SUFFIX,
5383
ctx, true);
5384
if (len < 0)
5385
return len;
5386
*ctxlen = len;
5387
return 0;
5388
}
5389
#ifdef CONFIG_KEYS
5390
5391
static int selinux_key_alloc(struct key *k, const struct cred *cred,
5392
unsigned long flags)
5393
{
5394
const struct task_security_struct *tsec;
5395
struct key_security_struct *ksec;
5396
5397
ksec = kzalloc(sizeof(struct key_security_struct), GFP_KERNEL);
5398
if (!ksec)
5399
return -ENOMEM;
5400
5401
tsec = cred->security;
5402
if (tsec->keycreate_sid)
5403
ksec->sid = tsec->keycreate_sid;
5404
else
5405
ksec->sid = tsec->sid;
5406
5407
k->security = ksec;
5408
return 0;
5409
}
5410
5411
static void selinux_key_free(struct key *k)
5412
{
5413
struct key_security_struct *ksec = k->security;
5414
5415
k->security = NULL;
5416
kfree(ksec);
5417
}
5418
5419
static int selinux_key_permission(key_ref_t key_ref,
5420
const struct cred *cred,
5421
key_perm_t perm)
5422
{
5423
struct key *key;
5424
struct key_security_struct *ksec;
5425
u32 sid;
5426
5427
/* if no specific permissions are requested, we skip the
5428
permission check. No serious, additional covert channels
5429
appear to be created. */
5430
if (perm == 0)
5431
return 0;
5432
5433
sid = cred_sid(cred);
5434
5435
key = key_ref_to_ptr(key_ref);
5436
ksec = key->security;
5437
5438
return avc_has_perm(sid, ksec->sid, SECCLASS_KEY, perm, NULL);
5439
}
5440
5441
static int selinux_key_getsecurity(struct key *key, char **_buffer)
5442
{
5443
struct key_security_struct *ksec = key->security;
5444
char *context = NULL;
5445
unsigned len;
5446
int rc;
5447
5448
rc = security_sid_to_context(ksec->sid, &context, &len);
5449
if (!rc)
5450
rc = len;
5451
*_buffer = context;
5452
return rc;
5453
}
5454
5455
#endif
5456
5457
static struct security_operations selinux_ops = {
5458
.name = "selinux",
5459
5460
.ptrace_access_check = selinux_ptrace_access_check,
5461
.ptrace_traceme = selinux_ptrace_traceme,
5462
.capget = selinux_capget,
5463
.capset = selinux_capset,
5464
.capable = selinux_capable,
5465
.quotactl = selinux_quotactl,
5466
.quota_on = selinux_quota_on,
5467
.syslog = selinux_syslog,
5468
.vm_enough_memory = selinux_vm_enough_memory,
5469
5470
.netlink_send = selinux_netlink_send,
5471
.netlink_recv = selinux_netlink_recv,
5472
5473
.bprm_set_creds = selinux_bprm_set_creds,
5474
.bprm_committing_creds = selinux_bprm_committing_creds,
5475
.bprm_committed_creds = selinux_bprm_committed_creds,
5476
.bprm_secureexec = selinux_bprm_secureexec,
5477
5478
.sb_alloc_security = selinux_sb_alloc_security,
5479
.sb_free_security = selinux_sb_free_security,
5480
.sb_copy_data = selinux_sb_copy_data,
5481
.sb_remount = selinux_sb_remount,
5482
.sb_kern_mount = selinux_sb_kern_mount,
5483
.sb_show_options = selinux_sb_show_options,
5484
.sb_statfs = selinux_sb_statfs,
5485
.sb_mount = selinux_mount,
5486
.sb_umount = selinux_umount,
5487
.sb_set_mnt_opts = selinux_set_mnt_opts,
5488
.sb_clone_mnt_opts = selinux_sb_clone_mnt_opts,
5489
.sb_parse_opts_str = selinux_parse_opts_str,
5490
5491
5492
.inode_alloc_security = selinux_inode_alloc_security,
5493
.inode_free_security = selinux_inode_free_security,
5494
.inode_init_security = selinux_inode_init_security,
5495
.inode_create = selinux_inode_create,
5496
.inode_link = selinux_inode_link,
5497
.inode_unlink = selinux_inode_unlink,
5498
.inode_symlink = selinux_inode_symlink,
5499
.inode_mkdir = selinux_inode_mkdir,
5500
.inode_rmdir = selinux_inode_rmdir,
5501
.inode_mknod = selinux_inode_mknod,
5502
.inode_rename = selinux_inode_rename,
5503
.inode_readlink = selinux_inode_readlink,
5504
.inode_follow_link = selinux_inode_follow_link,
5505
.inode_permission = selinux_inode_permission,
5506
.inode_setattr = selinux_inode_setattr,
5507
.inode_getattr = selinux_inode_getattr,
5508
.inode_setxattr = selinux_inode_setxattr,
5509
.inode_post_setxattr = selinux_inode_post_setxattr,
5510
.inode_getxattr = selinux_inode_getxattr,
5511
.inode_listxattr = selinux_inode_listxattr,
5512
.inode_removexattr = selinux_inode_removexattr,
5513
.inode_getsecurity = selinux_inode_getsecurity,
5514
.inode_setsecurity = selinux_inode_setsecurity,
5515
.inode_listsecurity = selinux_inode_listsecurity,
5516
.inode_getsecid = selinux_inode_getsecid,
5517
5518
.file_permission = selinux_file_permission,
5519
.file_alloc_security = selinux_file_alloc_security,
5520
.file_free_security = selinux_file_free_security,
5521
.file_ioctl = selinux_file_ioctl,
5522
.file_mmap = selinux_file_mmap,
5523
.file_mprotect = selinux_file_mprotect,
5524
.file_lock = selinux_file_lock,
5525
.file_fcntl = selinux_file_fcntl,
5526
.file_set_fowner = selinux_file_set_fowner,
5527
.file_send_sigiotask = selinux_file_send_sigiotask,
5528
.file_receive = selinux_file_receive,
5529
5530
.dentry_open = selinux_dentry_open,
5531
5532
.task_create = selinux_task_create,
5533
.cred_alloc_blank = selinux_cred_alloc_blank,
5534
.cred_free = selinux_cred_free,
5535
.cred_prepare = selinux_cred_prepare,
5536
.cred_transfer = selinux_cred_transfer,
5537
.kernel_act_as = selinux_kernel_act_as,
5538
.kernel_create_files_as = selinux_kernel_create_files_as,
5539
.kernel_module_request = selinux_kernel_module_request,
5540
.task_setpgid = selinux_task_setpgid,
5541
.task_getpgid = selinux_task_getpgid,
5542
.task_getsid = selinux_task_getsid,
5543
.task_getsecid = selinux_task_getsecid,
5544
.task_setnice = selinux_task_setnice,
5545
.task_setioprio = selinux_task_setioprio,
5546
.task_getioprio = selinux_task_getioprio,
5547
.task_setrlimit = selinux_task_setrlimit,
5548
.task_setscheduler = selinux_task_setscheduler,
5549
.task_getscheduler = selinux_task_getscheduler,
5550
.task_movememory = selinux_task_movememory,
5551
.task_kill = selinux_task_kill,
5552
.task_wait = selinux_task_wait,
5553
.task_to_inode = selinux_task_to_inode,
5554
5555
.ipc_permission = selinux_ipc_permission,
5556
.ipc_getsecid = selinux_ipc_getsecid,
5557
5558
.msg_msg_alloc_security = selinux_msg_msg_alloc_security,
5559
.msg_msg_free_security = selinux_msg_msg_free_security,
5560
5561
.msg_queue_alloc_security = selinux_msg_queue_alloc_security,
5562
.msg_queue_free_security = selinux_msg_queue_free_security,
5563
.msg_queue_associate = selinux_msg_queue_associate,
5564
.msg_queue_msgctl = selinux_msg_queue_msgctl,
5565
.msg_queue_msgsnd = selinux_msg_queue_msgsnd,
5566
.msg_queue_msgrcv = selinux_msg_queue_msgrcv,
5567
5568
.shm_alloc_security = selinux_shm_alloc_security,
5569
.shm_free_security = selinux_shm_free_security,
5570
.shm_associate = selinux_shm_associate,
5571
.shm_shmctl = selinux_shm_shmctl,
5572
.shm_shmat = selinux_shm_shmat,
5573
5574
.sem_alloc_security = selinux_sem_alloc_security,
5575
.sem_free_security = selinux_sem_free_security,
5576
.sem_associate = selinux_sem_associate,
5577
.sem_semctl = selinux_sem_semctl,
5578
.sem_semop = selinux_sem_semop,
5579
5580
.d_instantiate = selinux_d_instantiate,
5581
5582
.getprocattr = selinux_getprocattr,
5583
.setprocattr = selinux_setprocattr,
5584
5585
.secid_to_secctx = selinux_secid_to_secctx,
5586
.secctx_to_secid = selinux_secctx_to_secid,
5587
.release_secctx = selinux_release_secctx,
5588
.inode_notifysecctx = selinux_inode_notifysecctx,
5589
.inode_setsecctx = selinux_inode_setsecctx,
5590
.inode_getsecctx = selinux_inode_getsecctx,
5591
5592
.unix_stream_connect = selinux_socket_unix_stream_connect,
5593
.unix_may_send = selinux_socket_unix_may_send,
5594
5595
.socket_create = selinux_socket_create,
5596
.socket_post_create = selinux_socket_post_create,
5597
.socket_bind = selinux_socket_bind,
5598
.socket_connect = selinux_socket_connect,
5599
.socket_listen = selinux_socket_listen,
5600
.socket_accept = selinux_socket_accept,
5601
.socket_sendmsg = selinux_socket_sendmsg,
5602
.socket_recvmsg = selinux_socket_recvmsg,
5603
.socket_getsockname = selinux_socket_getsockname,
5604
.socket_getpeername = selinux_socket_getpeername,
5605
.socket_getsockopt = selinux_socket_getsockopt,
5606
.socket_setsockopt = selinux_socket_setsockopt,
5607
.socket_shutdown = selinux_socket_shutdown,
5608
.socket_sock_rcv_skb = selinux_socket_sock_rcv_skb,
5609
.socket_getpeersec_stream = selinux_socket_getpeersec_stream,
5610
.socket_getpeersec_dgram = selinux_socket_getpeersec_dgram,
5611
.sk_alloc_security = selinux_sk_alloc_security,
5612
.sk_free_security = selinux_sk_free_security,
5613
.sk_clone_security = selinux_sk_clone_security,
5614
.sk_getsecid = selinux_sk_getsecid,
5615
.sock_graft = selinux_sock_graft,
5616
.inet_conn_request = selinux_inet_conn_request,
5617
.inet_csk_clone = selinux_inet_csk_clone,
5618
.inet_conn_established = selinux_inet_conn_established,
5619
.secmark_relabel_packet = selinux_secmark_relabel_packet,
5620
.secmark_refcount_inc = selinux_secmark_refcount_inc,
5621
.secmark_refcount_dec = selinux_secmark_refcount_dec,
5622
.req_classify_flow = selinux_req_classify_flow,
5623
.tun_dev_create = selinux_tun_dev_create,
5624
.tun_dev_post_create = selinux_tun_dev_post_create,
5625
.tun_dev_attach = selinux_tun_dev_attach,
5626
5627
#ifdef CONFIG_SECURITY_NETWORK_XFRM
5628
.xfrm_policy_alloc_security = selinux_xfrm_policy_alloc,
5629
.xfrm_policy_clone_security = selinux_xfrm_policy_clone,
5630
.xfrm_policy_free_security = selinux_xfrm_policy_free,
5631
.xfrm_policy_delete_security = selinux_xfrm_policy_delete,
5632
.xfrm_state_alloc_security = selinux_xfrm_state_alloc,
5633
.xfrm_state_free_security = selinux_xfrm_state_free,
5634
.xfrm_state_delete_security = selinux_xfrm_state_delete,
5635
.xfrm_policy_lookup = selinux_xfrm_policy_lookup,
5636
.xfrm_state_pol_flow_match = selinux_xfrm_state_pol_flow_match,
5637
.xfrm_decode_session = selinux_xfrm_decode_session,
5638
#endif
5639
5640
#ifdef CONFIG_KEYS
5641
.key_alloc = selinux_key_alloc,
5642
.key_free = selinux_key_free,
5643
.key_permission = selinux_key_permission,
5644
.key_getsecurity = selinux_key_getsecurity,
5645
#endif
5646
5647
#ifdef CONFIG_AUDIT
5648
.audit_rule_init = selinux_audit_rule_init,
5649
.audit_rule_known = selinux_audit_rule_known,
5650
.audit_rule_match = selinux_audit_rule_match,
5651
.audit_rule_free = selinux_audit_rule_free,
5652
#endif
5653
};
5654
5655
static __init int selinux_init(void)
5656
{
5657
if (!security_module_enable(&selinux_ops)) {
5658
selinux_enabled = 0;
5659
return 0;
5660
}
5661
5662
if (!selinux_enabled) {
5663
printk(KERN_INFO "SELinux: Disabled at boot.\n");
5664
return 0;
5665
}
5666
5667
printk(KERN_INFO "SELinux: Initializing.\n");
5668
5669
/* Set the security state for the initial task. */
5670
cred_init_security();
5671
5672
default_noexec = !(VM_DATA_DEFAULT_FLAGS & VM_EXEC);
5673
5674
sel_inode_cache = kmem_cache_create("selinux_inode_security",
5675
sizeof(struct inode_security_struct),
5676
0, SLAB_PANIC, NULL);
5677
avc_init();
5678
5679
if (register_security(&selinux_ops))
5680
panic("SELinux: Unable to register with kernel.\n");
5681
5682
if (selinux_enforcing)
5683
printk(KERN_DEBUG "SELinux: Starting in enforcing mode\n");
5684
else
5685
printk(KERN_DEBUG "SELinux: Starting in permissive mode\n");
5686
5687
return 0;
5688
}
5689
5690
static void delayed_superblock_init(struct super_block *sb, void *unused)
5691
{
5692
superblock_doinit(sb, NULL);
5693
}
5694
5695
void selinux_complete_init(void)
5696
{
5697
printk(KERN_DEBUG "SELinux: Completing initialization.\n");
5698
5699
/* Set up any superblocks initialized prior to the policy load. */
5700
printk(KERN_DEBUG "SELinux: Setting up existing superblocks.\n");
5701
iterate_supers(delayed_superblock_init, NULL);
5702
}
5703
5704
/* SELinux requires early initialization in order to label
5705
all processes and objects when they are created. */
5706
security_initcall(selinux_init);
5707
5708
#if defined(CONFIG_NETFILTER)
5709
5710
static struct nf_hook_ops selinux_ipv4_ops[] = {
5711
{
5712
.hook = selinux_ipv4_postroute,
5713
.owner = THIS_MODULE,
5714
.pf = PF_INET,
5715
.hooknum = NF_INET_POST_ROUTING,
5716
.priority = NF_IP_PRI_SELINUX_LAST,
5717
},
5718
{
5719
.hook = selinux_ipv4_forward,
5720
.owner = THIS_MODULE,
5721
.pf = PF_INET,
5722
.hooknum = NF_INET_FORWARD,
5723
.priority = NF_IP_PRI_SELINUX_FIRST,
5724
},
5725
{
5726
.hook = selinux_ipv4_output,
5727
.owner = THIS_MODULE,
5728
.pf = PF_INET,
5729
.hooknum = NF_INET_LOCAL_OUT,
5730
.priority = NF_IP_PRI_SELINUX_FIRST,
5731
}
5732
};
5733
5734
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5735
5736
static struct nf_hook_ops selinux_ipv6_ops[] = {
5737
{
5738
.hook = selinux_ipv6_postroute,
5739
.owner = THIS_MODULE,
5740
.pf = PF_INET6,
5741
.hooknum = NF_INET_POST_ROUTING,
5742
.priority = NF_IP6_PRI_SELINUX_LAST,
5743
},
5744
{
5745
.hook = selinux_ipv6_forward,
5746
.owner = THIS_MODULE,
5747
.pf = PF_INET6,
5748
.hooknum = NF_INET_FORWARD,
5749
.priority = NF_IP6_PRI_SELINUX_FIRST,
5750
}
5751
};
5752
5753
#endif /* IPV6 */
5754
5755
static int __init selinux_nf_ip_init(void)
5756
{
5757
int err = 0;
5758
5759
if (!selinux_enabled)
5760
goto out;
5761
5762
printk(KERN_DEBUG "SELinux: Registering netfilter hooks\n");
5763
5764
err = nf_register_hooks(selinux_ipv4_ops, ARRAY_SIZE(selinux_ipv4_ops));
5765
if (err)
5766
panic("SELinux: nf_register_hooks for IPv4: error %d\n", err);
5767
5768
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5769
err = nf_register_hooks(selinux_ipv6_ops, ARRAY_SIZE(selinux_ipv6_ops));
5770
if (err)
5771
panic("SELinux: nf_register_hooks for IPv6: error %d\n", err);
5772
#endif /* IPV6 */
5773
5774
out:
5775
return err;
5776
}
5777
5778
__initcall(selinux_nf_ip_init);
5779
5780
#ifdef CONFIG_SECURITY_SELINUX_DISABLE
5781
static void selinux_nf_ip_exit(void)
5782
{
5783
printk(KERN_DEBUG "SELinux: Unregistering netfilter hooks\n");
5784
5785
nf_unregister_hooks(selinux_ipv4_ops, ARRAY_SIZE(selinux_ipv4_ops));
5786
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5787
nf_unregister_hooks(selinux_ipv6_ops, ARRAY_SIZE(selinux_ipv6_ops));
5788
#endif /* IPV6 */
5789
}
5790
#endif
5791
5792
#else /* CONFIG_NETFILTER */
5793
5794
#ifdef CONFIG_SECURITY_SELINUX_DISABLE
5795
#define selinux_nf_ip_exit()
5796
#endif
5797
5798
#endif /* CONFIG_NETFILTER */
5799
5800
#ifdef CONFIG_SECURITY_SELINUX_DISABLE
5801
static int selinux_disabled;
5802
5803
int selinux_disable(void)
5804
{
5805
extern void exit_sel_fs(void);
5806
5807
if (ss_initialized) {
5808
/* Not permitted after initial policy load. */
5809
return -EINVAL;
5810
}
5811
5812
if (selinux_disabled) {
5813
/* Only do this once. */
5814
return -EINVAL;
5815
}
5816
5817
printk(KERN_INFO "SELinux: Disabled at runtime.\n");
5818
5819
selinux_disabled = 1;
5820
selinux_enabled = 0;
5821
5822
reset_security_ops();
5823
5824
/* Try to destroy the avc node cache */
5825
avc_disable();
5826
5827
/* Unregister netfilter hooks. */
5828
selinux_nf_ip_exit();
5829
5830
/* Unregister selinuxfs. */
5831
exit_sel_fs();
5832
5833
return 0;
5834
}
5835
#endif
5836
5837