]> bbs.cooldavid.org Git - net-next-2.6.git/blame - security/selinux/hooks.c
CRED: Pass credentials through dentry_open()
[net-next-2.6.git] / security / selinux / hooks.c
CommitLineData
1da177e4
LT
1/*
2 * NSA Security-Enhanced Linux (SELinux) security module
3 *
4 * This file contains the SELinux hook function implementations.
5 *
6 * Authors: Stephen Smalley, <sds@epoch.ncsc.mil>
828dfe1d
EP
7 * Chris Vance, <cvance@nai.com>
8 * Wayne Salamon, <wsalamon@nai.com>
9 * James Morris <jmorris@redhat.com>
1da177e4
LT
10 *
11 * Copyright (C) 2001,2002 Networks Associates Technology, Inc.
2069f457
EP
12 * Copyright (C) 2003-2008 Red Hat, Inc., James Morris <jmorris@redhat.com>
13 * Eric Paris <eparis@redhat.com>
1da177e4 14 * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
828dfe1d 15 * <dgoeddel@trustedcs.com>
effad8df 16 * Copyright (C) 2006, 2007 Hewlett-Packard Development Company, L.P.
828dfe1d 17 * Paul Moore <paul.moore@hp.com>
788e7dd4 18 * Copyright (C) 2007 Hitachi Software Engineering Co., Ltd.
828dfe1d 19 * Yuichi Nakamura <ynakam@hitachisoft.jp>
1da177e4
LT
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,
828dfe1d 23 * as published by the Free Software Foundation.
1da177e4
LT
24 */
25
1da177e4
LT
26#include <linux/init.h>
27#include <linux/kernel.h>
0d094efe 28#include <linux/tracehook.h>
1da177e4
LT
29#include <linux/errno.h>
30#include <linux/sched.h>
31#include <linux/security.h>
32#include <linux/xattr.h>
33#include <linux/capability.h>
34#include <linux/unistd.h>
35#include <linux/mm.h>
36#include <linux/mman.h>
37#include <linux/slab.h>
38#include <linux/pagemap.h>
39#include <linux/swap.h>
1da177e4
LT
40#include <linux/spinlock.h>
41#include <linux/syscalls.h>
42#include <linux/file.h>
9f3acc31 43#include <linux/fdtable.h>
1da177e4
LT
44#include <linux/namei.h>
45#include <linux/mount.h>
1da177e4 46#include <linux/proc_fs.h>
1da177e4
LT
47#include <linux/netfilter_ipv4.h>
48#include <linux/netfilter_ipv6.h>
49#include <linux/tty.h>
50#include <net/icmp.h>
227b60f5 51#include <net/ip.h> /* for local_port_range[] */
1da177e4 52#include <net/tcp.h> /* struct or_callable used in sock_rcv_skb */
220deb96 53#include <net/net_namespace.h>
d621d35e 54#include <net/netlabel.h>
f5269710 55#include <linux/uaccess.h>
1da177e4 56#include <asm/ioctls.h>
d621d35e 57#include <asm/atomic.h>
1da177e4
LT
58#include <linux/bitops.h>
59#include <linux/interrupt.h>
60#include <linux/netdevice.h> /* for network interface checks */
61#include <linux/netlink.h>
62#include <linux/tcp.h>
63#include <linux/udp.h>
2ee92d46 64#include <linux/dccp.h>
1da177e4
LT
65#include <linux/quota.h>
66#include <linux/un.h> /* for Unix socket types */
67#include <net/af_unix.h> /* for Unix socket types */
68#include <linux/parser.h>
69#include <linux/nfs_mount.h>
70#include <net/ipv6.h>
71#include <linux/hugetlb.h>
72#include <linux/personality.h>
73#include <linux/sysctl.h>
74#include <linux/audit.h>
6931dfc9 75#include <linux/string.h>
877ce7c1 76#include <linux/selinux.h>
23970741 77#include <linux/mutex.h>
f06febc9 78#include <linux/posix-timers.h>
1da177e4
LT
79
80#include "avc.h"
81#include "objsec.h"
82#include "netif.h"
224dfbd8 83#include "netnode.h"
3e112172 84#include "netport.h"
d28d1e08 85#include "xfrm.h"
c60475bf 86#include "netlabel.h"
9d57a7f9 87#include "audit.h"
1da177e4
LT
88
89#define XATTR_SELINUX_SUFFIX "selinux"
90#define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX
91
c9180a57
EP
92#define NUM_SEL_MNT_OPTS 4
93
1da177e4
LT
94extern unsigned int policydb_loaded_version;
95extern int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm);
4e5ab4cb 96extern int selinux_compat_net;
20510f2f 97extern struct security_operations *security_ops;
1da177e4 98
d621d35e
PM
99/* SECMARK reference count */
100atomic_t selinux_secmark_refcount = ATOMIC_INIT(0);
101
1da177e4 102#ifdef CONFIG_SECURITY_SELINUX_DEVELOP
828dfe1d 103int selinux_enforcing;
1da177e4
LT
104
105static int __init enforcing_setup(char *str)
106{
f5269710
EP
107 unsigned long enforcing;
108 if (!strict_strtoul(str, 0, &enforcing))
109 selinux_enforcing = enforcing ? 1 : 0;
1da177e4
LT
110 return 1;
111}
112__setup("enforcing=", enforcing_setup);
113#endif
114
115#ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM
116int selinux_enabled = CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE;
117
118static int __init selinux_enabled_setup(char *str)
119{
f5269710
EP
120 unsigned long enabled;
121 if (!strict_strtoul(str, 0, &enabled))
122 selinux_enabled = enabled ? 1 : 0;
1da177e4
LT
123 return 1;
124}
125__setup("selinux=", selinux_enabled_setup);
30d55280
SS
126#else
127int selinux_enabled = 1;
1da177e4
LT
128#endif
129
1da177e4 130
6f0f0fd4
JM
131/*
132 * Minimal support for a secondary security module,
133 * just to allow the use of the capability module.
134 */
828dfe1d 135static struct security_operations *secondary_ops;
1da177e4
LT
136
137/* Lists of inode and superblock security structures initialized
138 before the policy was loaded. */
139static LIST_HEAD(superblock_security_head);
140static DEFINE_SPINLOCK(sb_security_lock);
141
e18b890b 142static struct kmem_cache *sel_inode_cache;
7cae7e26 143
d621d35e
PM
144/**
145 * selinux_secmark_enabled - Check to see if SECMARK is currently enabled
146 *
147 * Description:
148 * This function checks the SECMARK reference counter to see if any SECMARK
149 * targets are currently configured, if the reference counter is greater than
150 * zero SECMARK is considered to be enabled. Returns true (1) if SECMARK is
151 * enabled, false (0) if SECMARK is disabled.
152 *
153 */
154static int selinux_secmark_enabled(void)
155{
156 return (atomic_read(&selinux_secmark_refcount) > 0);
157}
158
1da177e4
LT
159/* Allocate and free functions for each kind of security blob. */
160
f1752eec 161static int cred_alloc_security(struct cred *cred)
1da177e4
LT
162{
163 struct task_security_struct *tsec;
164
89d155ef 165 tsec = kzalloc(sizeof(struct task_security_struct), GFP_KERNEL);
1da177e4
LT
166 if (!tsec)
167 return -ENOMEM;
168
0356357c 169 tsec->osid = tsec->sid = SECINITSID_UNLABELED;
f1752eec 170 cred->security = tsec;
1da177e4
LT
171
172 return 0;
173}
174
88e67f3b
DH
175/*
176 * get the security ID of a set of credentials
177 */
178static inline u32 cred_sid(const struct cred *cred)
179{
180 const struct task_security_struct *tsec;
181
182 tsec = cred->security;
183 return tsec->sid;
184}
185
275bb41e
DH
186/*
187 * get the security ID of a task
188 */
189static inline u32 task_sid(const struct task_struct *task)
190{
275bb41e
DH
191 u32 sid;
192
193 rcu_read_lock();
88e67f3b 194 sid = cred_sid(__task_cred(task));
275bb41e
DH
195 rcu_read_unlock();
196 return sid;
197}
198
199/*
200 * get the security ID of the current task
201 */
202static inline u32 current_sid(void)
203{
204 const struct task_security_struct *tsec = current_cred()->security;
205
206 return tsec->sid;
207}
208
88e67f3b
DH
209/* Allocate and free functions for each kind of security blob. */
210
1da177e4
LT
211static int inode_alloc_security(struct inode *inode)
212{
1da177e4 213 struct inode_security_struct *isec;
275bb41e 214 u32 sid = current_sid();
1da177e4 215
a02fe132 216 isec = kmem_cache_zalloc(sel_inode_cache, GFP_NOFS);
1da177e4
LT
217 if (!isec)
218 return -ENOMEM;
219
23970741 220 mutex_init(&isec->lock);
1da177e4 221 INIT_LIST_HEAD(&isec->list);
1da177e4
LT
222 isec->inode = inode;
223 isec->sid = SECINITSID_UNLABELED;
224 isec->sclass = SECCLASS_FILE;
275bb41e 225 isec->task_sid = sid;
1da177e4
LT
226 inode->i_security = isec;
227
228 return 0;
229}
230
231static void inode_free_security(struct inode *inode)
232{
233 struct inode_security_struct *isec = inode->i_security;
234 struct superblock_security_struct *sbsec = inode->i_sb->s_security;
235
1da177e4
LT
236 spin_lock(&sbsec->isec_lock);
237 if (!list_empty(&isec->list))
238 list_del_init(&isec->list);
239 spin_unlock(&sbsec->isec_lock);
240
241 inode->i_security = NULL;
7cae7e26 242 kmem_cache_free(sel_inode_cache, isec);
1da177e4
LT
243}
244
245static int file_alloc_security(struct file *file)
246{
1da177e4 247 struct file_security_struct *fsec;
275bb41e 248 u32 sid = current_sid();
1da177e4 249
26d2a4be 250 fsec = kzalloc(sizeof(struct file_security_struct), GFP_KERNEL);
1da177e4
LT
251 if (!fsec)
252 return -ENOMEM;
253
275bb41e
DH
254 fsec->sid = sid;
255 fsec->fown_sid = sid;
1da177e4
LT
256 file->f_security = fsec;
257
258 return 0;
259}
260
261static void file_free_security(struct file *file)
262{
263 struct file_security_struct *fsec = file->f_security;
1da177e4
LT
264 file->f_security = NULL;
265 kfree(fsec);
266}
267
268static int superblock_alloc_security(struct super_block *sb)
269{
270 struct superblock_security_struct *sbsec;
271
89d155ef 272 sbsec = kzalloc(sizeof(struct superblock_security_struct), GFP_KERNEL);
1da177e4
LT
273 if (!sbsec)
274 return -ENOMEM;
275
bc7e982b 276 mutex_init(&sbsec->lock);
1da177e4
LT
277 INIT_LIST_HEAD(&sbsec->list);
278 INIT_LIST_HEAD(&sbsec->isec_head);
279 spin_lock_init(&sbsec->isec_lock);
1da177e4
LT
280 sbsec->sb = sb;
281 sbsec->sid = SECINITSID_UNLABELED;
282 sbsec->def_sid = SECINITSID_FILE;
c312feb2 283 sbsec->mntpoint_sid = SECINITSID_UNLABELED;
1da177e4
LT
284 sb->s_security = sbsec;
285
286 return 0;
287}
288
289static void superblock_free_security(struct super_block *sb)
290{
291 struct superblock_security_struct *sbsec = sb->s_security;
292
1da177e4
LT
293 spin_lock(&sb_security_lock);
294 if (!list_empty(&sbsec->list))
295 list_del_init(&sbsec->list);
296 spin_unlock(&sb_security_lock);
297
298 sb->s_security = NULL;
299 kfree(sbsec);
300}
301
7d877f3b 302static int sk_alloc_security(struct sock *sk, int family, gfp_t priority)
1da177e4
LT
303{
304 struct sk_security_struct *ssec;
305
89d155ef 306 ssec = kzalloc(sizeof(*ssec), priority);
1da177e4
LT
307 if (!ssec)
308 return -ENOMEM;
309
1da177e4 310 ssec->peer_sid = SECINITSID_UNLABELED;
892c141e 311 ssec->sid = SECINITSID_UNLABELED;
1da177e4
LT
312 sk->sk_security = ssec;
313
f74af6e8 314 selinux_netlbl_sk_security_reset(ssec, family);
99f59ed0 315
1da177e4
LT
316 return 0;
317}
318
319static void sk_free_security(struct sock *sk)
320{
321 struct sk_security_struct *ssec = sk->sk_security;
322
1da177e4 323 sk->sk_security = NULL;
6c5b3fc0 324 selinux_netlbl_sk_security_free(ssec);
1da177e4
LT
325 kfree(ssec);
326}
1da177e4
LT
327
328/* The security server must be initialized before
329 any labeling or access decisions can be provided. */
330extern int ss_initialized;
331
332/* The file system's label must be initialized prior to use. */
333
334static char *labeling_behaviors[6] = {
335 "uses xattr",
336 "uses transition SIDs",
337 "uses task SIDs",
338 "uses genfs_contexts",
339 "not configured for labeling",
340 "uses mountpoint labeling",
341};
342
343static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry);
344
345static inline int inode_doinit(struct inode *inode)
346{
347 return inode_doinit_with_dentry(inode, NULL);
348}
349
350enum {
31e87930 351 Opt_error = -1,
1da177e4
LT
352 Opt_context = 1,
353 Opt_fscontext = 2,
c9180a57
EP
354 Opt_defcontext = 3,
355 Opt_rootcontext = 4,
1da177e4
LT
356};
357
a447c093 358static const match_table_t tokens = {
832cbd9a
EP
359 {Opt_context, CONTEXT_STR "%s"},
360 {Opt_fscontext, FSCONTEXT_STR "%s"},
361 {Opt_defcontext, DEFCONTEXT_STR "%s"},
362 {Opt_rootcontext, ROOTCONTEXT_STR "%s"},
31e87930 363 {Opt_error, NULL},
1da177e4
LT
364};
365
366#define SEL_MOUNT_FAIL_MSG "SELinux: duplicate or incompatible mount options\n"
367
c312feb2
EP
368static int may_context_mount_sb_relabel(u32 sid,
369 struct superblock_security_struct *sbsec,
275bb41e 370 const struct cred *cred)
c312feb2 371{
275bb41e 372 const struct task_security_struct *tsec = cred->security;
c312feb2
EP
373 int rc;
374
375 rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
376 FILESYSTEM__RELABELFROM, NULL);
377 if (rc)
378 return rc;
379
380 rc = avc_has_perm(tsec->sid, sid, SECCLASS_FILESYSTEM,
381 FILESYSTEM__RELABELTO, NULL);
382 return rc;
383}
384
0808925e
EP
385static int may_context_mount_inode_relabel(u32 sid,
386 struct superblock_security_struct *sbsec,
275bb41e 387 const struct cred *cred)
0808925e 388{
275bb41e 389 const struct task_security_struct *tsec = cred->security;
0808925e
EP
390 int rc;
391 rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
392 FILESYSTEM__RELABELFROM, NULL);
393 if (rc)
394 return rc;
395
396 rc = avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM,
397 FILESYSTEM__ASSOCIATE, NULL);
398 return rc;
399}
400
c9180a57 401static int sb_finish_set_opts(struct super_block *sb)
1da177e4 402{
1da177e4 403 struct superblock_security_struct *sbsec = sb->s_security;
c9180a57
EP
404 struct dentry *root = sb->s_root;
405 struct inode *root_inode = root->d_inode;
406 int rc = 0;
1da177e4 407
c9180a57
EP
408 if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
409 /* Make sure that the xattr handler exists and that no
410 error other than -ENODATA is returned by getxattr on
411 the root directory. -ENODATA is ok, as this may be
412 the first boot of the SELinux kernel before we have
413 assigned xattr values to the filesystem. */
414 if (!root_inode->i_op->getxattr) {
415 printk(KERN_WARNING "SELinux: (dev %s, type %s) has no "
416 "xattr support\n", sb->s_id, sb->s_type->name);
417 rc = -EOPNOTSUPP;
418 goto out;
419 }
420 rc = root_inode->i_op->getxattr(root, XATTR_NAME_SELINUX, NULL, 0);
421 if (rc < 0 && rc != -ENODATA) {
422 if (rc == -EOPNOTSUPP)
423 printk(KERN_WARNING "SELinux: (dev %s, type "
424 "%s) has no security xattr handler\n",
425 sb->s_id, sb->s_type->name);
426 else
427 printk(KERN_WARNING "SELinux: (dev %s, type "
428 "%s) getxattr errno %d\n", sb->s_id,
429 sb->s_type->name, -rc);
430 goto out;
431 }
432 }
1da177e4 433
c9180a57 434 sbsec->initialized = 1;
1da177e4 435
c9180a57
EP
436 if (sbsec->behavior > ARRAY_SIZE(labeling_behaviors))
437 printk(KERN_ERR "SELinux: initialized (dev %s, type %s), unknown behavior\n",
438 sb->s_id, sb->s_type->name);
439 else
440 printk(KERN_DEBUG "SELinux: initialized (dev %s, type %s), %s\n",
441 sb->s_id, sb->s_type->name,
442 labeling_behaviors[sbsec->behavior-1]);
1da177e4 443
c9180a57
EP
444 /* Initialize the root inode. */
445 rc = inode_doinit_with_dentry(root_inode, root);
1da177e4 446
c9180a57
EP
447 /* Initialize any other inodes associated with the superblock, e.g.
448 inodes created prior to initial policy load or inodes created
449 during get_sb by a pseudo filesystem that directly
450 populates itself. */
451 spin_lock(&sbsec->isec_lock);
452next_inode:
453 if (!list_empty(&sbsec->isec_head)) {
454 struct inode_security_struct *isec =
455 list_entry(sbsec->isec_head.next,
456 struct inode_security_struct, list);
457 struct inode *inode = isec->inode;
458 spin_unlock(&sbsec->isec_lock);
459 inode = igrab(inode);
460 if (inode) {
461 if (!IS_PRIVATE(inode))
462 inode_doinit(inode);
463 iput(inode);
464 }
465 spin_lock(&sbsec->isec_lock);
466 list_del_init(&isec->list);
467 goto next_inode;
468 }
469 spin_unlock(&sbsec->isec_lock);
470out:
471 return rc;
472}
1da177e4 473
c9180a57
EP
474/*
475 * This function should allow an FS to ask what it's mount security
476 * options were so it can use those later for submounts, displaying
477 * mount options, or whatever.
478 */
479static int selinux_get_mnt_opts(const struct super_block *sb,
e0007529 480 struct security_mnt_opts *opts)
c9180a57
EP
481{
482 int rc = 0, i;
483 struct superblock_security_struct *sbsec = sb->s_security;
484 char *context = NULL;
485 u32 len;
486 char tmp;
1da177e4 487
e0007529 488 security_init_mnt_opts(opts);
1da177e4 489
c9180a57
EP
490 if (!sbsec->initialized)
491 return -EINVAL;
1da177e4 492
c9180a57
EP
493 if (!ss_initialized)
494 return -EINVAL;
1da177e4 495
c9180a57
EP
496 /*
497 * if we ever use sbsec flags for anything other than tracking mount
498 * settings this is going to need a mask
499 */
500 tmp = sbsec->flags;
501 /* count the number of mount options for this sb */
502 for (i = 0; i < 8; i++) {
503 if (tmp & 0x01)
e0007529 504 opts->num_mnt_opts++;
c9180a57
EP
505 tmp >>= 1;
506 }
1da177e4 507
e0007529
EP
508 opts->mnt_opts = kcalloc(opts->num_mnt_opts, sizeof(char *), GFP_ATOMIC);
509 if (!opts->mnt_opts) {
c9180a57
EP
510 rc = -ENOMEM;
511 goto out_free;
512 }
1da177e4 513
e0007529
EP
514 opts->mnt_opts_flags = kcalloc(opts->num_mnt_opts, sizeof(int), GFP_ATOMIC);
515 if (!opts->mnt_opts_flags) {
c9180a57
EP
516 rc = -ENOMEM;
517 goto out_free;
518 }
1da177e4 519
c9180a57
EP
520 i = 0;
521 if (sbsec->flags & FSCONTEXT_MNT) {
522 rc = security_sid_to_context(sbsec->sid, &context, &len);
523 if (rc)
524 goto out_free;
e0007529
EP
525 opts->mnt_opts[i] = context;
526 opts->mnt_opts_flags[i++] = FSCONTEXT_MNT;
c9180a57
EP
527 }
528 if (sbsec->flags & CONTEXT_MNT) {
529 rc = security_sid_to_context(sbsec->mntpoint_sid, &context, &len);
530 if (rc)
531 goto out_free;
e0007529
EP
532 opts->mnt_opts[i] = context;
533 opts->mnt_opts_flags[i++] = CONTEXT_MNT;
c9180a57
EP
534 }
535 if (sbsec->flags & DEFCONTEXT_MNT) {
536 rc = security_sid_to_context(sbsec->def_sid, &context, &len);
537 if (rc)
538 goto out_free;
e0007529
EP
539 opts->mnt_opts[i] = context;
540 opts->mnt_opts_flags[i++] = DEFCONTEXT_MNT;
c9180a57
EP
541 }
542 if (sbsec->flags & ROOTCONTEXT_MNT) {
543 struct inode *root = sbsec->sb->s_root->d_inode;
544 struct inode_security_struct *isec = root->i_security;
0808925e 545
c9180a57
EP
546 rc = security_sid_to_context(isec->sid, &context, &len);
547 if (rc)
548 goto out_free;
e0007529
EP
549 opts->mnt_opts[i] = context;
550 opts->mnt_opts_flags[i++] = ROOTCONTEXT_MNT;
c9180a57 551 }
1da177e4 552
e0007529 553 BUG_ON(i != opts->num_mnt_opts);
1da177e4 554
c9180a57
EP
555 return 0;
556
557out_free:
e0007529 558 security_free_mnt_opts(opts);
c9180a57
EP
559 return rc;
560}
1da177e4 561
c9180a57
EP
562static int bad_option(struct superblock_security_struct *sbsec, char flag,
563 u32 old_sid, u32 new_sid)
564{
565 /* check if the old mount command had the same options */
566 if (sbsec->initialized)
567 if (!(sbsec->flags & flag) ||
568 (old_sid != new_sid))
569 return 1;
570
571 /* check if we were passed the same options twice,
572 * aka someone passed context=a,context=b
573 */
574 if (!sbsec->initialized)
575 if (sbsec->flags & flag)
576 return 1;
577 return 0;
578}
e0007529 579
c9180a57
EP
580/*
581 * Allow filesystems with binary mount data to explicitly set mount point
582 * labeling information.
583 */
e0007529
EP
584static int selinux_set_mnt_opts(struct super_block *sb,
585 struct security_mnt_opts *opts)
c9180a57 586{
275bb41e 587 const struct cred *cred = current_cred();
c9180a57 588 int rc = 0, i;
c9180a57
EP
589 struct superblock_security_struct *sbsec = sb->s_security;
590 const char *name = sb->s_type->name;
089be43e
JM
591 struct inode *inode = sbsec->sb->s_root->d_inode;
592 struct inode_security_struct *root_isec = inode->i_security;
c9180a57
EP
593 u32 fscontext_sid = 0, context_sid = 0, rootcontext_sid = 0;
594 u32 defcontext_sid = 0;
e0007529
EP
595 char **mount_options = opts->mnt_opts;
596 int *flags = opts->mnt_opts_flags;
597 int num_opts = opts->num_mnt_opts;
c9180a57
EP
598
599 mutex_lock(&sbsec->lock);
600
601 if (!ss_initialized) {
602 if (!num_opts) {
603 /* Defer initialization until selinux_complete_init,
604 after the initial policy is loaded and the security
605 server is ready to handle calls. */
606 spin_lock(&sb_security_lock);
607 if (list_empty(&sbsec->list))
608 list_add(&sbsec->list, &superblock_security_head);
609 spin_unlock(&sb_security_lock);
610 goto out;
611 }
612 rc = -EINVAL;
744ba35e
EP
613 printk(KERN_WARNING "SELinux: Unable to set superblock options "
614 "before the security server is initialized\n");
1da177e4 615 goto out;
c9180a57 616 }
1da177e4 617
e0007529
EP
618 /*
619 * Binary mount data FS will come through this function twice. Once
620 * from an explicit call and once from the generic calls from the vfs.
621 * Since the generic VFS calls will not contain any security mount data
622 * we need to skip the double mount verification.
623 *
624 * This does open a hole in which we will not notice if the first
625 * mount using this sb set explict options and a second mount using
626 * this sb does not set any security options. (The first options
627 * will be used for both mounts)
628 */
629 if (sbsec->initialized && (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
630 && (num_opts == 0))
f5269710 631 goto out;
e0007529 632
c9180a57
EP
633 /*
634 * parse the mount options, check if they are valid sids.
635 * also check if someone is trying to mount the same sb more
636 * than once with different security options.
637 */
638 for (i = 0; i < num_opts; i++) {
639 u32 sid;
640 rc = security_context_to_sid(mount_options[i],
641 strlen(mount_options[i]), &sid);
1da177e4
LT
642 if (rc) {
643 printk(KERN_WARNING "SELinux: security_context_to_sid"
644 "(%s) failed for (dev %s, type %s) errno=%d\n",
c9180a57
EP
645 mount_options[i], sb->s_id, name, rc);
646 goto out;
647 }
648 switch (flags[i]) {
649 case FSCONTEXT_MNT:
650 fscontext_sid = sid;
651
652 if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid,
653 fscontext_sid))
654 goto out_double_mount;
655
656 sbsec->flags |= FSCONTEXT_MNT;
657 break;
658 case CONTEXT_MNT:
659 context_sid = sid;
660
661 if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid,
662 context_sid))
663 goto out_double_mount;
664
665 sbsec->flags |= CONTEXT_MNT;
666 break;
667 case ROOTCONTEXT_MNT:
668 rootcontext_sid = sid;
669
670 if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid,
671 rootcontext_sid))
672 goto out_double_mount;
673
674 sbsec->flags |= ROOTCONTEXT_MNT;
675
676 break;
677 case DEFCONTEXT_MNT:
678 defcontext_sid = sid;
679
680 if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid,
681 defcontext_sid))
682 goto out_double_mount;
683
684 sbsec->flags |= DEFCONTEXT_MNT;
685
686 break;
687 default:
688 rc = -EINVAL;
689 goto out;
1da177e4 690 }
c9180a57
EP
691 }
692
693 if (sbsec->initialized) {
694 /* previously mounted with options, but not on this attempt? */
695 if (sbsec->flags && !num_opts)
696 goto out_double_mount;
697 rc = 0;
698 goto out;
699 }
700
089be43e 701 if (strcmp(sb->s_type->name, "proc") == 0)
c9180a57
EP
702 sbsec->proc = 1;
703
704 /* Determine the labeling behavior to use for this filesystem type. */
089be43e 705 rc = security_fs_use(sb->s_type->name, &sbsec->behavior, &sbsec->sid);
c9180a57
EP
706 if (rc) {
707 printk(KERN_WARNING "%s: security_fs_use(%s) returned %d\n",
089be43e 708 __func__, sb->s_type->name, rc);
c9180a57
EP
709 goto out;
710 }
1da177e4 711
c9180a57
EP
712 /* sets the context of the superblock for the fs being mounted. */
713 if (fscontext_sid) {
275bb41e 714 rc = may_context_mount_sb_relabel(fscontext_sid, sbsec, cred);
1da177e4 715 if (rc)
c9180a57 716 goto out;
1da177e4 717
c9180a57 718 sbsec->sid = fscontext_sid;
c312feb2
EP
719 }
720
721 /*
722 * Switch to using mount point labeling behavior.
723 * sets the label used on all file below the mountpoint, and will set
724 * the superblock context if not already set.
725 */
c9180a57
EP
726 if (context_sid) {
727 if (!fscontext_sid) {
275bb41e
DH
728 rc = may_context_mount_sb_relabel(context_sid, sbsec,
729 cred);
b04ea3ce 730 if (rc)
c9180a57
EP
731 goto out;
732 sbsec->sid = context_sid;
b04ea3ce 733 } else {
275bb41e
DH
734 rc = may_context_mount_inode_relabel(context_sid, sbsec,
735 cred);
b04ea3ce 736 if (rc)
c9180a57 737 goto out;
b04ea3ce 738 }
c9180a57
EP
739 if (!rootcontext_sid)
740 rootcontext_sid = context_sid;
1da177e4 741
c9180a57 742 sbsec->mntpoint_sid = context_sid;
c312feb2 743 sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
1da177e4
LT
744 }
745
c9180a57 746 if (rootcontext_sid) {
275bb41e
DH
747 rc = may_context_mount_inode_relabel(rootcontext_sid, sbsec,
748 cred);
0808925e 749 if (rc)
c9180a57 750 goto out;
0808925e 751
c9180a57
EP
752 root_isec->sid = rootcontext_sid;
753 root_isec->initialized = 1;
0808925e
EP
754 }
755
c9180a57
EP
756 if (defcontext_sid) {
757 if (sbsec->behavior != SECURITY_FS_USE_XATTR) {
758 rc = -EINVAL;
759 printk(KERN_WARNING "SELinux: defcontext option is "
760 "invalid for this filesystem type\n");
761 goto out;
1da177e4
LT
762 }
763
c9180a57
EP
764 if (defcontext_sid != sbsec->def_sid) {
765 rc = may_context_mount_inode_relabel(defcontext_sid,
275bb41e 766 sbsec, cred);
c9180a57
EP
767 if (rc)
768 goto out;
769 }
1da177e4 770
c9180a57 771 sbsec->def_sid = defcontext_sid;
1da177e4
LT
772 }
773
c9180a57 774 rc = sb_finish_set_opts(sb);
1da177e4 775out:
c9180a57 776 mutex_unlock(&sbsec->lock);
1da177e4 777 return rc;
c9180a57
EP
778out_double_mount:
779 rc = -EINVAL;
780 printk(KERN_WARNING "SELinux: mount invalid. Same superblock, different "
781 "security settings for (dev %s, type %s)\n", sb->s_id, name);
782 goto out;
1da177e4
LT
783}
784
c9180a57
EP
785static void selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
786 struct super_block *newsb)
1da177e4 787{
c9180a57
EP
788 const struct superblock_security_struct *oldsbsec = oldsb->s_security;
789 struct superblock_security_struct *newsbsec = newsb->s_security;
1da177e4 790
c9180a57
EP
791 int set_fscontext = (oldsbsec->flags & FSCONTEXT_MNT);
792 int set_context = (oldsbsec->flags & CONTEXT_MNT);
793 int set_rootcontext = (oldsbsec->flags & ROOTCONTEXT_MNT);
1da177e4 794
0f5e6420
EP
795 /*
796 * if the parent was able to be mounted it clearly had no special lsm
797 * mount options. thus we can safely put this sb on the list and deal
798 * with it later
799 */
800 if (!ss_initialized) {
801 spin_lock(&sb_security_lock);
802 if (list_empty(&newsbsec->list))
803 list_add(&newsbsec->list, &superblock_security_head);
804 spin_unlock(&sb_security_lock);
805 return;
806 }
c9180a57 807
c9180a57
EP
808 /* how can we clone if the old one wasn't set up?? */
809 BUG_ON(!oldsbsec->initialized);
810
5a552617
EP
811 /* if fs is reusing a sb, just let its options stand... */
812 if (newsbsec->initialized)
813 return;
814
c9180a57
EP
815 mutex_lock(&newsbsec->lock);
816
817 newsbsec->flags = oldsbsec->flags;
818
819 newsbsec->sid = oldsbsec->sid;
820 newsbsec->def_sid = oldsbsec->def_sid;
821 newsbsec->behavior = oldsbsec->behavior;
822
823 if (set_context) {
824 u32 sid = oldsbsec->mntpoint_sid;
825
826 if (!set_fscontext)
827 newsbsec->sid = sid;
828 if (!set_rootcontext) {
829 struct inode *newinode = newsb->s_root->d_inode;
830 struct inode_security_struct *newisec = newinode->i_security;
831 newisec->sid = sid;
832 }
833 newsbsec->mntpoint_sid = sid;
1da177e4 834 }
c9180a57
EP
835 if (set_rootcontext) {
836 const struct inode *oldinode = oldsb->s_root->d_inode;
837 const struct inode_security_struct *oldisec = oldinode->i_security;
838 struct inode *newinode = newsb->s_root->d_inode;
839 struct inode_security_struct *newisec = newinode->i_security;
1da177e4 840
c9180a57 841 newisec->sid = oldisec->sid;
1da177e4
LT
842 }
843
c9180a57
EP
844 sb_finish_set_opts(newsb);
845 mutex_unlock(&newsbsec->lock);
846}
847
2e1479d9
AB
848static int selinux_parse_opts_str(char *options,
849 struct security_mnt_opts *opts)
c9180a57 850{
e0007529 851 char *p;
c9180a57
EP
852 char *context = NULL, *defcontext = NULL;
853 char *fscontext = NULL, *rootcontext = NULL;
e0007529 854 int rc, num_mnt_opts = 0;
1da177e4 855
e0007529 856 opts->num_mnt_opts = 0;
1da177e4 857
c9180a57
EP
858 /* Standard string-based options. */
859 while ((p = strsep(&options, "|")) != NULL) {
860 int token;
861 substring_t args[MAX_OPT_ARGS];
1da177e4 862
c9180a57
EP
863 if (!*p)
864 continue;
1da177e4 865
c9180a57 866 token = match_token(p, tokens, args);
1da177e4 867
c9180a57
EP
868 switch (token) {
869 case Opt_context:
870 if (context || defcontext) {
871 rc = -EINVAL;
872 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
873 goto out_err;
874 }
875 context = match_strdup(&args[0]);
876 if (!context) {
877 rc = -ENOMEM;
878 goto out_err;
879 }
880 break;
881
882 case Opt_fscontext:
883 if (fscontext) {
884 rc = -EINVAL;
885 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
886 goto out_err;
887 }
888 fscontext = match_strdup(&args[0]);
889 if (!fscontext) {
890 rc = -ENOMEM;
891 goto out_err;
892 }
893 break;
894
895 case Opt_rootcontext:
896 if (rootcontext) {
897 rc = -EINVAL;
898 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
899 goto out_err;
900 }
901 rootcontext = match_strdup(&args[0]);
902 if (!rootcontext) {
903 rc = -ENOMEM;
904 goto out_err;
905 }
906 break;
907
908 case Opt_defcontext:
909 if (context || defcontext) {
910 rc = -EINVAL;
911 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
912 goto out_err;
913 }
914 defcontext = match_strdup(&args[0]);
915 if (!defcontext) {
916 rc = -ENOMEM;
917 goto out_err;
918 }
919 break;
920
921 default:
922 rc = -EINVAL;
923 printk(KERN_WARNING "SELinux: unknown mount option\n");
924 goto out_err;
1da177e4 925
1da177e4 926 }
1da177e4 927 }
c9180a57 928
e0007529
EP
929 rc = -ENOMEM;
930 opts->mnt_opts = kcalloc(NUM_SEL_MNT_OPTS, sizeof(char *), GFP_ATOMIC);
931 if (!opts->mnt_opts)
932 goto out_err;
933
934 opts->mnt_opts_flags = kcalloc(NUM_SEL_MNT_OPTS, sizeof(int), GFP_ATOMIC);
935 if (!opts->mnt_opts_flags) {
936 kfree(opts->mnt_opts);
937 goto out_err;
938 }
939
c9180a57 940 if (fscontext) {
e0007529
EP
941 opts->mnt_opts[num_mnt_opts] = fscontext;
942 opts->mnt_opts_flags[num_mnt_opts++] = FSCONTEXT_MNT;
c9180a57
EP
943 }
944 if (context) {
e0007529
EP
945 opts->mnt_opts[num_mnt_opts] = context;
946 opts->mnt_opts_flags[num_mnt_opts++] = CONTEXT_MNT;
c9180a57
EP
947 }
948 if (rootcontext) {
e0007529
EP
949 opts->mnt_opts[num_mnt_opts] = rootcontext;
950 opts->mnt_opts_flags[num_mnt_opts++] = ROOTCONTEXT_MNT;
c9180a57
EP
951 }
952 if (defcontext) {
e0007529
EP
953 opts->mnt_opts[num_mnt_opts] = defcontext;
954 opts->mnt_opts_flags[num_mnt_opts++] = DEFCONTEXT_MNT;
c9180a57
EP
955 }
956
e0007529
EP
957 opts->num_mnt_opts = num_mnt_opts;
958 return 0;
959
c9180a57
EP
960out_err:
961 kfree(context);
962 kfree(defcontext);
963 kfree(fscontext);
964 kfree(rootcontext);
1da177e4
LT
965 return rc;
966}
e0007529
EP
967/*
968 * string mount options parsing and call set the sbsec
969 */
970static int superblock_doinit(struct super_block *sb, void *data)
971{
972 int rc = 0;
973 char *options = data;
974 struct security_mnt_opts opts;
975
976 security_init_mnt_opts(&opts);
977
978 if (!data)
979 goto out;
980
981 BUG_ON(sb->s_type->fs_flags & FS_BINARY_MOUNTDATA);
982
983 rc = selinux_parse_opts_str(options, &opts);
984 if (rc)
985 goto out_err;
986
987out:
988 rc = selinux_set_mnt_opts(sb, &opts);
989
990out_err:
991 security_free_mnt_opts(&opts);
992 return rc;
993}
1da177e4 994
3583a711
AB
995static void selinux_write_opts(struct seq_file *m,
996 struct security_mnt_opts *opts)
2069f457
EP
997{
998 int i;
999 char *prefix;
1000
1001 for (i = 0; i < opts->num_mnt_opts; i++) {
1002 char *has_comma = strchr(opts->mnt_opts[i], ',');
1003
1004 switch (opts->mnt_opts_flags[i]) {
1005 case CONTEXT_MNT:
1006 prefix = CONTEXT_STR;
1007 break;
1008 case FSCONTEXT_MNT:
1009 prefix = FSCONTEXT_STR;
1010 break;
1011 case ROOTCONTEXT_MNT:
1012 prefix = ROOTCONTEXT_STR;
1013 break;
1014 case DEFCONTEXT_MNT:
1015 prefix = DEFCONTEXT_STR;
1016 break;
1017 default:
1018 BUG();
1019 };
1020 /* we need a comma before each option */
1021 seq_putc(m, ',');
1022 seq_puts(m, prefix);
1023 if (has_comma)
1024 seq_putc(m, '\"');
1025 seq_puts(m, opts->mnt_opts[i]);
1026 if (has_comma)
1027 seq_putc(m, '\"');
1028 }
1029}
1030
1031static int selinux_sb_show_options(struct seq_file *m, struct super_block *sb)
1032{
1033 struct security_mnt_opts opts;
1034 int rc;
1035
1036 rc = selinux_get_mnt_opts(sb, &opts);
383795c2
EP
1037 if (rc) {
1038 /* before policy load we may get EINVAL, don't show anything */
1039 if (rc == -EINVAL)
1040 rc = 0;
2069f457 1041 return rc;
383795c2 1042 }
2069f457
EP
1043
1044 selinux_write_opts(m, &opts);
1045
1046 security_free_mnt_opts(&opts);
1047
1048 return rc;
1049}
1050
1da177e4
LT
1051static inline u16 inode_mode_to_security_class(umode_t mode)
1052{
1053 switch (mode & S_IFMT) {
1054 case S_IFSOCK:
1055 return SECCLASS_SOCK_FILE;
1056 case S_IFLNK:
1057 return SECCLASS_LNK_FILE;
1058 case S_IFREG:
1059 return SECCLASS_FILE;
1060 case S_IFBLK:
1061 return SECCLASS_BLK_FILE;
1062 case S_IFDIR:
1063 return SECCLASS_DIR;
1064 case S_IFCHR:
1065 return SECCLASS_CHR_FILE;
1066 case S_IFIFO:
1067 return SECCLASS_FIFO_FILE;
1068
1069 }
1070
1071 return SECCLASS_FILE;
1072}
1073
13402580
JM
1074static inline int default_protocol_stream(int protocol)
1075{
1076 return (protocol == IPPROTO_IP || protocol == IPPROTO_TCP);
1077}
1078
1079static inline int default_protocol_dgram(int protocol)
1080{
1081 return (protocol == IPPROTO_IP || protocol == IPPROTO_UDP);
1082}
1083
1da177e4
LT
1084static inline u16 socket_type_to_security_class(int family, int type, int protocol)
1085{
1086 switch (family) {
1087 case PF_UNIX:
1088 switch (type) {
1089 case SOCK_STREAM:
1090 case SOCK_SEQPACKET:
1091 return SECCLASS_UNIX_STREAM_SOCKET;
1092 case SOCK_DGRAM:
1093 return SECCLASS_UNIX_DGRAM_SOCKET;
1094 }
1095 break;
1096 case PF_INET:
1097 case PF_INET6:
1098 switch (type) {
1099 case SOCK_STREAM:
13402580
JM
1100 if (default_protocol_stream(protocol))
1101 return SECCLASS_TCP_SOCKET;
1102 else
1103 return SECCLASS_RAWIP_SOCKET;
1da177e4 1104 case SOCK_DGRAM:
13402580
JM
1105 if (default_protocol_dgram(protocol))
1106 return SECCLASS_UDP_SOCKET;
1107 else
1108 return SECCLASS_RAWIP_SOCKET;
2ee92d46
JM
1109 case SOCK_DCCP:
1110 return SECCLASS_DCCP_SOCKET;
13402580 1111 default:
1da177e4
LT
1112 return SECCLASS_RAWIP_SOCKET;
1113 }
1114 break;
1115 case PF_NETLINK:
1116 switch (protocol) {
1117 case NETLINK_ROUTE:
1118 return SECCLASS_NETLINK_ROUTE_SOCKET;
1119 case NETLINK_FIREWALL:
1120 return SECCLASS_NETLINK_FIREWALL_SOCKET;
216efaaa 1121 case NETLINK_INET_DIAG:
1da177e4
LT
1122 return SECCLASS_NETLINK_TCPDIAG_SOCKET;
1123 case NETLINK_NFLOG:
1124 return SECCLASS_NETLINK_NFLOG_SOCKET;
1125 case NETLINK_XFRM:
1126 return SECCLASS_NETLINK_XFRM_SOCKET;
1127 case NETLINK_SELINUX:
1128 return SECCLASS_NETLINK_SELINUX_SOCKET;
1129 case NETLINK_AUDIT:
1130 return SECCLASS_NETLINK_AUDIT_SOCKET;
1131 case NETLINK_IP6_FW:
1132 return SECCLASS_NETLINK_IP6FW_SOCKET;
1133 case NETLINK_DNRTMSG:
1134 return SECCLASS_NETLINK_DNRT_SOCKET;
0c9b7942
JM
1135 case NETLINK_KOBJECT_UEVENT:
1136 return SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET;
1da177e4
LT
1137 default:
1138 return SECCLASS_NETLINK_SOCKET;
1139 }
1140 case PF_PACKET:
1141 return SECCLASS_PACKET_SOCKET;
1142 case PF_KEY:
1143 return SECCLASS_KEY_SOCKET;
3e3ff15e
CP
1144 case PF_APPLETALK:
1145 return SECCLASS_APPLETALK_SOCKET;
1da177e4
LT
1146 }
1147
1148 return SECCLASS_SOCKET;
1149}
1150
1151#ifdef CONFIG_PROC_FS
1152static int selinux_proc_get_sid(struct proc_dir_entry *de,
1153 u16 tclass,
1154 u32 *sid)
1155{
1156 int buflen, rc;
1157 char *buffer, *path, *end;
1158
828dfe1d 1159 buffer = (char *)__get_free_page(GFP_KERNEL);
1da177e4
LT
1160 if (!buffer)
1161 return -ENOMEM;
1162
1163 buflen = PAGE_SIZE;
1164 end = buffer+buflen;
1165 *--end = '\0';
1166 buflen--;
1167 path = end-1;
1168 *path = '/';
1169 while (de && de != de->parent) {
1170 buflen -= de->namelen + 1;
1171 if (buflen < 0)
1172 break;
1173 end -= de->namelen;
1174 memcpy(end, de->name, de->namelen);
1175 *--end = '/';
1176 path = end;
1177 de = de->parent;
1178 }
1179 rc = security_genfs_sid("proc", path, tclass, sid);
1180 free_page((unsigned long)buffer);
1181 return rc;
1182}
1183#else
1184static int selinux_proc_get_sid(struct proc_dir_entry *de,
1185 u16 tclass,
1186 u32 *sid)
1187{
1188 return -EINVAL;
1189}
1190#endif
1191
1192/* The inode's security attributes must be initialized before first use. */
1193static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
1194{
1195 struct superblock_security_struct *sbsec = NULL;
1196 struct inode_security_struct *isec = inode->i_security;
1197 u32 sid;
1198 struct dentry *dentry;
1199#define INITCONTEXTLEN 255
1200 char *context = NULL;
1201 unsigned len = 0;
1202 int rc = 0;
1da177e4
LT
1203
1204 if (isec->initialized)
1205 goto out;
1206
23970741 1207 mutex_lock(&isec->lock);
1da177e4 1208 if (isec->initialized)
23970741 1209 goto out_unlock;
1da177e4
LT
1210
1211 sbsec = inode->i_sb->s_security;
1212 if (!sbsec->initialized) {
1213 /* Defer initialization until selinux_complete_init,
1214 after the initial policy is loaded and the security
1215 server is ready to handle calls. */
1216 spin_lock(&sbsec->isec_lock);
1217 if (list_empty(&isec->list))
1218 list_add(&isec->list, &sbsec->isec_head);
1219 spin_unlock(&sbsec->isec_lock);
23970741 1220 goto out_unlock;
1da177e4
LT
1221 }
1222
1223 switch (sbsec->behavior) {
1224 case SECURITY_FS_USE_XATTR:
1225 if (!inode->i_op->getxattr) {
1226 isec->sid = sbsec->def_sid;
1227 break;
1228 }
1229
1230 /* Need a dentry, since the xattr API requires one.
1231 Life would be simpler if we could just pass the inode. */
1232 if (opt_dentry) {
1233 /* Called from d_instantiate or d_splice_alias. */
1234 dentry = dget(opt_dentry);
1235 } else {
1236 /* Called from selinux_complete_init, try to find a dentry. */
1237 dentry = d_find_alias(inode);
1238 }
1239 if (!dentry) {
744ba35e 1240 printk(KERN_WARNING "SELinux: %s: no dentry for dev=%s "
dd6f953a 1241 "ino=%ld\n", __func__, inode->i_sb->s_id,
1da177e4 1242 inode->i_ino);
23970741 1243 goto out_unlock;
1da177e4
LT
1244 }
1245
1246 len = INITCONTEXTLEN;
869ab514 1247 context = kmalloc(len, GFP_NOFS);
1da177e4
LT
1248 if (!context) {
1249 rc = -ENOMEM;
1250 dput(dentry);
23970741 1251 goto out_unlock;
1da177e4
LT
1252 }
1253 rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
1254 context, len);
1255 if (rc == -ERANGE) {
1256 /* Need a larger buffer. Query for the right size. */
1257 rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
1258 NULL, 0);
1259 if (rc < 0) {
1260 dput(dentry);
23970741 1261 goto out_unlock;
1da177e4
LT
1262 }
1263 kfree(context);
1264 len = rc;
869ab514 1265 context = kmalloc(len, GFP_NOFS);
1da177e4
LT
1266 if (!context) {
1267 rc = -ENOMEM;
1268 dput(dentry);
23970741 1269 goto out_unlock;
1da177e4
LT
1270 }
1271 rc = inode->i_op->getxattr(dentry,
1272 XATTR_NAME_SELINUX,
1273 context, len);
1274 }
1275 dput(dentry);
1276 if (rc < 0) {
1277 if (rc != -ENODATA) {
744ba35e 1278 printk(KERN_WARNING "SELinux: %s: getxattr returned "
dd6f953a 1279 "%d for dev=%s ino=%ld\n", __func__,
1da177e4
LT
1280 -rc, inode->i_sb->s_id, inode->i_ino);
1281 kfree(context);
23970741 1282 goto out_unlock;
1da177e4
LT
1283 }
1284 /* Map ENODATA to the default file SID */
1285 sid = sbsec->def_sid;
1286 rc = 0;
1287 } else {
f5c1d5b2 1288 rc = security_context_to_sid_default(context, rc, &sid,
869ab514
SS
1289 sbsec->def_sid,
1290 GFP_NOFS);
1da177e4 1291 if (rc) {
744ba35e 1292 printk(KERN_WARNING "SELinux: %s: context_to_sid(%s) "
1da177e4 1293 "returned %d for dev=%s ino=%ld\n",
dd6f953a 1294 __func__, context, -rc,
1da177e4
LT
1295 inode->i_sb->s_id, inode->i_ino);
1296 kfree(context);
1297 /* Leave with the unlabeled SID */
1298 rc = 0;
1299 break;
1300 }
1301 }
1302 kfree(context);
1303 isec->sid = sid;
1304 break;
1305 case SECURITY_FS_USE_TASK:
1306 isec->sid = isec->task_sid;
1307 break;
1308 case SECURITY_FS_USE_TRANS:
1309 /* Default to the fs SID. */
1310 isec->sid = sbsec->sid;
1311
1312 /* Try to obtain a transition SID. */
1313 isec->sclass = inode_mode_to_security_class(inode->i_mode);
1314 rc = security_transition_sid(isec->task_sid,
1315 sbsec->sid,
1316 isec->sclass,
1317 &sid);
1318 if (rc)
23970741 1319 goto out_unlock;
1da177e4
LT
1320 isec->sid = sid;
1321 break;
c312feb2
EP
1322 case SECURITY_FS_USE_MNTPOINT:
1323 isec->sid = sbsec->mntpoint_sid;
1324 break;
1da177e4 1325 default:
c312feb2 1326 /* Default to the fs superblock SID. */
1da177e4
LT
1327 isec->sid = sbsec->sid;
1328
ea6b184f 1329 if (sbsec->proc && !S_ISLNK(inode->i_mode)) {
1da177e4
LT
1330 struct proc_inode *proci = PROC_I(inode);
1331 if (proci->pde) {
1332 isec->sclass = inode_mode_to_security_class(inode->i_mode);
1333 rc = selinux_proc_get_sid(proci->pde,
1334 isec->sclass,
1335 &sid);
1336 if (rc)
23970741 1337 goto out_unlock;
1da177e4
LT
1338 isec->sid = sid;
1339 }
1340 }
1341 break;
1342 }
1343
1344 isec->initialized = 1;
1345
23970741
EP
1346out_unlock:
1347 mutex_unlock(&isec->lock);
1da177e4
LT
1348out:
1349 if (isec->sclass == SECCLASS_FILE)
1350 isec->sclass = inode_mode_to_security_class(inode->i_mode);
1da177e4
LT
1351 return rc;
1352}
1353
1354/* Convert a Linux signal to an access vector. */
1355static inline u32 signal_to_av(int sig)
1356{
1357 u32 perm = 0;
1358
1359 switch (sig) {
1360 case SIGCHLD:
1361 /* Commonly granted from child to parent. */
1362 perm = PROCESS__SIGCHLD;
1363 break;
1364 case SIGKILL:
1365 /* Cannot be caught or ignored */
1366 perm = PROCESS__SIGKILL;
1367 break;
1368 case SIGSTOP:
1369 /* Cannot be caught or ignored */
1370 perm = PROCESS__SIGSTOP;
1371 break;
1372 default:
1373 /* All other signals. */
1374 perm = PROCESS__SIGNAL;
1375 break;
1376 }
1377
1378 return perm;
1379}
1380
275bb41e 1381/*
88e67f3b 1382 * Check permission between a pair of tasks, e.g. signal checks,
275bb41e
DH
1383 * fork check, ptrace check, etc.
1384 * tsk1 is the actor and tsk2 is the target
1385 */
1386static int task_has_perm(const struct task_struct *tsk1,
1387 const struct task_struct *tsk2,
1da177e4
LT
1388 u32 perms)
1389{
275bb41e
DH
1390 const struct task_security_struct *__tsec1, *__tsec2;
1391 u32 sid1, sid2;
1da177e4 1392
275bb41e
DH
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);
1da177e4
LT
1398}
1399
b68e418c
SS
1400#if CAP_LAST_CAP > 63
1401#error Fix SELinux to handle capabilities > 63.
1402#endif
1403
1da177e4
LT
1404/* Check whether a task is allowed to use a capability. */
1405static int task_has_capability(struct task_struct *tsk,
06112163 1406 int cap, int audit)
1da177e4 1407{
1da177e4 1408 struct avc_audit_data ad;
06112163 1409 struct av_decision avd;
b68e418c 1410 u16 sclass;
275bb41e 1411 u32 sid = task_sid(tsk);
b68e418c 1412 u32 av = CAP_TO_MASK(cap);
06112163 1413 int rc;
1da177e4 1414
828dfe1d 1415 AVC_AUDIT_DATA_INIT(&ad, CAP);
1da177e4
LT
1416 ad.tsk = tsk;
1417 ad.u.cap = cap;
1418
b68e418c
SS
1419 switch (CAP_TO_INDEX(cap)) {
1420 case 0:
1421 sclass = SECCLASS_CAPABILITY;
1422 break;
1423 case 1:
1424 sclass = SECCLASS_CAPABILITY2;
1425 break;
1426 default:
1427 printk(KERN_ERR
1428 "SELinux: out of range capability %d\n", cap);
1429 BUG();
1430 }
06112163 1431
275bb41e 1432 rc = avc_has_perm_noaudit(sid, sid, sclass, av, 0, &avd);
06112163 1433 if (audit == SECURITY_CAP_AUDIT)
275bb41e 1434 avc_audit(sid, sid, sclass, av, &avd, rc, &ad);
06112163 1435 return rc;
1da177e4
LT
1436}
1437
1438/* Check whether a task is allowed to use a system operation. */
1439static int task_has_system(struct task_struct *tsk,
1440 u32 perms)
1441{
275bb41e 1442 u32 sid = task_sid(tsk);
1da177e4 1443
275bb41e 1444 return avc_has_perm(sid, SECINITSID_KERNEL,
1da177e4
LT
1445 SECCLASS_SYSTEM, perms, NULL);
1446}
1447
1448/* Check whether a task has a particular permission to an inode.
1449 The 'adp' parameter is optional and allows other audit
1450 data to be passed (e.g. the dentry). */
88e67f3b 1451static int inode_has_perm(const struct cred *cred,
1da177e4
LT
1452 struct inode *inode,
1453 u32 perms,
1454 struct avc_audit_data *adp)
1455{
1da177e4
LT
1456 struct inode_security_struct *isec;
1457 struct avc_audit_data ad;
275bb41e 1458 u32 sid;
1da177e4 1459
828dfe1d 1460 if (unlikely(IS_PRIVATE(inode)))
bbaca6c2
SS
1461 return 0;
1462
88e67f3b 1463 sid = cred_sid(cred);
1da177e4
LT
1464 isec = inode->i_security;
1465
1466 if (!adp) {
1467 adp = &ad;
1468 AVC_AUDIT_DATA_INIT(&ad, FS);
1469 ad.u.fs.inode = inode;
1470 }
1471
275bb41e 1472 return avc_has_perm(sid, isec->sid, isec->sclass, perms, adp);
1da177e4
LT
1473}
1474
1475/* Same as inode_has_perm, but pass explicit audit data containing
1476 the dentry to help the auditing code to more easily generate the
1477 pathname if needed. */
88e67f3b 1478static inline int dentry_has_perm(const struct cred *cred,
1da177e4
LT
1479 struct vfsmount *mnt,
1480 struct dentry *dentry,
1481 u32 av)
1482{
1483 struct inode *inode = dentry->d_inode;
1484 struct avc_audit_data ad;
88e67f3b 1485
828dfe1d 1486 AVC_AUDIT_DATA_INIT(&ad, FS);
44707fdf
JB
1487 ad.u.fs.path.mnt = mnt;
1488 ad.u.fs.path.dentry = dentry;
88e67f3b 1489 return inode_has_perm(cred, inode, av, &ad);
1da177e4
LT
1490}
1491
1492/* Check whether a task can use an open file descriptor to
1493 access an inode in a given way. Check access to the
1494 descriptor itself, and then use dentry_has_perm to
1495 check a particular permission to the file.
1496 Access to the descriptor is implicitly granted if it
1497 has the same SID as the process. If av is zero, then
1498 access to the file is not checked, e.g. for cases
1499 where only the descriptor is affected like seek. */
88e67f3b
DH
1500static int file_has_perm(const struct cred *cred,
1501 struct file *file,
1502 u32 av)
1da177e4 1503{
1da177e4 1504 struct file_security_struct *fsec = file->f_security;
44707fdf 1505 struct inode *inode = file->f_path.dentry->d_inode;
1da177e4 1506 struct avc_audit_data ad;
88e67f3b 1507 u32 sid = cred_sid(cred);
1da177e4
LT
1508 int rc;
1509
1510 AVC_AUDIT_DATA_INIT(&ad, FS);
44707fdf 1511 ad.u.fs.path = file->f_path;
1da177e4 1512
275bb41e
DH
1513 if (sid != fsec->sid) {
1514 rc = avc_has_perm(sid, fsec->sid,
1da177e4
LT
1515 SECCLASS_FD,
1516 FD__USE,
1517 &ad);
1518 if (rc)
88e67f3b 1519 goto out;
1da177e4
LT
1520 }
1521
1522 /* av is zero if only checking access to the descriptor. */
88e67f3b 1523 rc = 0;
1da177e4 1524 if (av)
88e67f3b 1525 rc = inode_has_perm(cred, inode, av, &ad);
1da177e4 1526
88e67f3b
DH
1527out:
1528 return rc;
1da177e4
LT
1529}
1530
1531/* Check whether a task can create a file. */
1532static int may_create(struct inode *dir,
1533 struct dentry *dentry,
1534 u16 tclass)
1535{
275bb41e
DH
1536 const struct cred *cred = current_cred();
1537 const struct task_security_struct *tsec = cred->security;
1da177e4
LT
1538 struct inode_security_struct *dsec;
1539 struct superblock_security_struct *sbsec;
275bb41e 1540 u32 sid, newsid;
1da177e4
LT
1541 struct avc_audit_data ad;
1542 int rc;
1543
1da177e4
LT
1544 dsec = dir->i_security;
1545 sbsec = dir->i_sb->s_security;
1546
275bb41e
DH
1547 sid = tsec->sid;
1548 newsid = tsec->create_sid;
1549
1da177e4 1550 AVC_AUDIT_DATA_INIT(&ad, FS);
44707fdf 1551 ad.u.fs.path.dentry = dentry;
1da177e4 1552
275bb41e 1553 rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR,
1da177e4
LT
1554 DIR__ADD_NAME | DIR__SEARCH,
1555 &ad);
1556 if (rc)
1557 return rc;
1558
275bb41e
DH
1559 if (!newsid || sbsec->behavior == SECURITY_FS_USE_MNTPOINT) {
1560 rc = security_transition_sid(sid, dsec->sid, tclass, &newsid);
1da177e4
LT
1561 if (rc)
1562 return rc;
1563 }
1564
275bb41e 1565 rc = avc_has_perm(sid, newsid, tclass, FILE__CREATE, &ad);
1da177e4
LT
1566 if (rc)
1567 return rc;
1568
1569 return avc_has_perm(newsid, sbsec->sid,
1570 SECCLASS_FILESYSTEM,
1571 FILESYSTEM__ASSOCIATE, &ad);
1572}
1573
4eb582cf
ML
1574/* Check whether a task can create a key. */
1575static int may_create_key(u32 ksid,
1576 struct task_struct *ctx)
1577{
275bb41e 1578 u32 sid = task_sid(ctx);
4eb582cf 1579
275bb41e 1580 return avc_has_perm(sid, ksid, SECCLASS_KEY, KEY__CREATE, NULL);
4eb582cf
ML
1581}
1582
828dfe1d
EP
1583#define MAY_LINK 0
1584#define MAY_UNLINK 1
1585#define MAY_RMDIR 2
1da177e4
LT
1586
1587/* Check whether a task can link, unlink, or rmdir a file/directory. */
1588static int may_link(struct inode *dir,
1589 struct dentry *dentry,
1590 int kind)
1591
1592{
1da177e4
LT
1593 struct inode_security_struct *dsec, *isec;
1594 struct avc_audit_data ad;
275bb41e 1595 u32 sid = current_sid();
1da177e4
LT
1596 u32 av;
1597 int rc;
1598
1da177e4
LT
1599 dsec = dir->i_security;
1600 isec = dentry->d_inode->i_security;
1601
1602 AVC_AUDIT_DATA_INIT(&ad, FS);
44707fdf 1603 ad.u.fs.path.dentry = dentry;
1da177e4
LT
1604
1605 av = DIR__SEARCH;
1606 av |= (kind ? DIR__REMOVE_NAME : DIR__ADD_NAME);
275bb41e 1607 rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR, av, &ad);
1da177e4
LT
1608 if (rc)
1609 return rc;
1610
1611 switch (kind) {
1612 case MAY_LINK:
1613 av = FILE__LINK;
1614 break;
1615 case MAY_UNLINK:
1616 av = FILE__UNLINK;
1617 break;
1618 case MAY_RMDIR:
1619 av = DIR__RMDIR;
1620 break;
1621 default:
744ba35e
EP
1622 printk(KERN_WARNING "SELinux: %s: unrecognized kind %d\n",
1623 __func__, kind);
1da177e4
LT
1624 return 0;
1625 }
1626
275bb41e 1627 rc = avc_has_perm(sid, isec->sid, isec->sclass, av, &ad);
1da177e4
LT
1628 return rc;
1629}
1630
1631static inline int may_rename(struct inode *old_dir,
1632 struct dentry *old_dentry,
1633 struct inode *new_dir,
1634 struct dentry *new_dentry)
1635{
1da177e4
LT
1636 struct inode_security_struct *old_dsec, *new_dsec, *old_isec, *new_isec;
1637 struct avc_audit_data ad;
275bb41e 1638 u32 sid = current_sid();
1da177e4
LT
1639 u32 av;
1640 int old_is_dir, new_is_dir;
1641 int rc;
1642
1da177e4
LT
1643 old_dsec = old_dir->i_security;
1644 old_isec = old_dentry->d_inode->i_security;
1645 old_is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
1646 new_dsec = new_dir->i_security;
1647
1648 AVC_AUDIT_DATA_INIT(&ad, FS);
1649
44707fdf 1650 ad.u.fs.path.dentry = old_dentry;
275bb41e 1651 rc = avc_has_perm(sid, old_dsec->sid, SECCLASS_DIR,
1da177e4
LT
1652 DIR__REMOVE_NAME | DIR__SEARCH, &ad);
1653 if (rc)
1654 return rc;
275bb41e 1655 rc = avc_has_perm(sid, old_isec->sid,
1da177e4
LT
1656 old_isec->sclass, FILE__RENAME, &ad);
1657 if (rc)
1658 return rc;
1659 if (old_is_dir && new_dir != old_dir) {
275bb41e 1660 rc = avc_has_perm(sid, old_isec->sid,
1da177e4
LT
1661 old_isec->sclass, DIR__REPARENT, &ad);
1662 if (rc)
1663 return rc;
1664 }
1665
44707fdf 1666 ad.u.fs.path.dentry = new_dentry;
1da177e4
LT
1667 av = DIR__ADD_NAME | DIR__SEARCH;
1668 if (new_dentry->d_inode)
1669 av |= DIR__REMOVE_NAME;
275bb41e 1670 rc = avc_has_perm(sid, new_dsec->sid, SECCLASS_DIR, av, &ad);
1da177e4
LT
1671 if (rc)
1672 return rc;
1673 if (new_dentry->d_inode) {
1674 new_isec = new_dentry->d_inode->i_security;
1675 new_is_dir = S_ISDIR(new_dentry->d_inode->i_mode);
275bb41e 1676 rc = avc_has_perm(sid, new_isec->sid,
1da177e4
LT
1677 new_isec->sclass,
1678 (new_is_dir ? DIR__RMDIR : FILE__UNLINK), &ad);
1679 if (rc)
1680 return rc;
1681 }
1682
1683 return 0;
1684}
1685
1686/* Check whether a task can perform a filesystem operation. */
88e67f3b 1687static int superblock_has_perm(const struct cred *cred,
1da177e4
LT
1688 struct super_block *sb,
1689 u32 perms,
1690 struct avc_audit_data *ad)
1691{
1da177e4 1692 struct superblock_security_struct *sbsec;
88e67f3b 1693 u32 sid = cred_sid(cred);
1da177e4 1694
1da177e4 1695 sbsec = sb->s_security;
275bb41e 1696 return avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM, perms, ad);
1da177e4
LT
1697}
1698
1699/* Convert a Linux mode and permission mask to an access vector. */
1700static inline u32 file_mask_to_av(int mode, int mask)
1701{
1702 u32 av = 0;
1703
1704 if ((mode & S_IFMT) != S_IFDIR) {
1705 if (mask & MAY_EXEC)
1706 av |= FILE__EXECUTE;
1707 if (mask & MAY_READ)
1708 av |= FILE__READ;
1709
1710 if (mask & MAY_APPEND)
1711 av |= FILE__APPEND;
1712 else if (mask & MAY_WRITE)
1713 av |= FILE__WRITE;
1714
1715 } else {
1716 if (mask & MAY_EXEC)
1717 av |= DIR__SEARCH;
1718 if (mask & MAY_WRITE)
1719 av |= DIR__WRITE;
1720 if (mask & MAY_READ)
1721 av |= DIR__READ;
1722 }
1723
1724 return av;
1725}
1726
8b6a5a37
EP
1727/* Convert a Linux file to an access vector. */
1728static inline u32 file_to_av(struct file *file)
1729{
1730 u32 av = 0;
1731
1732 if (file->f_mode & FMODE_READ)
1733 av |= FILE__READ;
1734 if (file->f_mode & FMODE_WRITE) {
1735 if (file->f_flags & O_APPEND)
1736 av |= FILE__APPEND;
1737 else
1738 av |= FILE__WRITE;
1739 }
1740 if (!av) {
1741 /*
1742 * Special file opened with flags 3 for ioctl-only use.
1743 */
1744 av = FILE__IOCTL;
1745 }
1746
1747 return av;
1748}
1749
b0c636b9 1750/*
8b6a5a37 1751 * Convert a file to an access vector and include the correct open
b0c636b9
EP
1752 * open permission.
1753 */
8b6a5a37 1754static inline u32 open_file_to_av(struct file *file)
b0c636b9 1755{
8b6a5a37 1756 u32 av = file_to_av(file);
b0c636b9
EP
1757
1758 if (selinux_policycap_openperm) {
8b6a5a37 1759 mode_t mode = file->f_path.dentry->d_inode->i_mode;
b0c636b9
EP
1760 /*
1761 * lnk files and socks do not really have an 'open'
1762 */
1763 if (S_ISREG(mode))
1764 av |= FILE__OPEN;
1765 else if (S_ISCHR(mode))
1766 av |= CHR_FILE__OPEN;
1767 else if (S_ISBLK(mode))
1768 av |= BLK_FILE__OPEN;
1769 else if (S_ISFIFO(mode))
1770 av |= FIFO_FILE__OPEN;
1771 else if (S_ISDIR(mode))
1772 av |= DIR__OPEN;
1773 else
744ba35e 1774 printk(KERN_ERR "SELinux: WARNING: inside %s with "
8b6a5a37 1775 "unknown mode:%o\n", __func__, mode);
b0c636b9
EP
1776 }
1777 return av;
1778}
1779
1da177e4
LT
1780/* Hook functions begin here. */
1781
5cd9c58f
DH
1782static int selinux_ptrace_may_access(struct task_struct *child,
1783 unsigned int mode)
1da177e4 1784{
1da177e4
LT
1785 int rc;
1786
5cd9c58f 1787 rc = secondary_ops->ptrace_may_access(child, mode);
1da177e4
LT
1788 if (rc)
1789 return rc;
1790
006ebb40 1791 if (mode == PTRACE_MODE_READ) {
275bb41e
DH
1792 u32 sid = current_sid();
1793 u32 csid = task_sid(child);
1794 return avc_has_perm(sid, csid, SECCLASS_FILE, FILE__READ, NULL);
006ebb40
SS
1795 }
1796
5cd9c58f
DH
1797 return task_has_perm(current, child, PROCESS__PTRACE);
1798}
1799
1800static int selinux_ptrace_traceme(struct task_struct *parent)
1801{
1802 int rc;
1803
1804 rc = secondary_ops->ptrace_traceme(parent);
1805 if (rc)
1806 return rc;
1807
1808 return task_has_perm(parent, current, PROCESS__PTRACE);
1da177e4
LT
1809}
1810
1811static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
828dfe1d 1812 kernel_cap_t *inheritable, kernel_cap_t *permitted)
1da177e4
LT
1813{
1814 int error;
1815
1816 error = task_has_perm(current, target, PROCESS__GETCAP);
1817 if (error)
1818 return error;
1819
1820 return secondary_ops->capget(target, effective, inheritable, permitted);
1821}
1822
15a2460e
DH
1823static int selinux_capset_check(const kernel_cap_t *effective,
1824 const kernel_cap_t *inheritable,
1825 const kernel_cap_t *permitted)
1da177e4
LT
1826{
1827 int error;
1828
1cdcbec1 1829 error = secondary_ops->capset_check(effective, inheritable, permitted);
1da177e4
LT
1830 if (error)
1831 return error;
1832
1cdcbec1 1833 return task_has_perm(current, current, PROCESS__SETCAP);
1da177e4
LT
1834}
1835
15a2460e
DH
1836static void selinux_capset_set(const kernel_cap_t *effective,
1837 const kernel_cap_t *inheritable,
1838 const kernel_cap_t *permitted)
1da177e4 1839{
1cdcbec1 1840 secondary_ops->capset_set(effective, inheritable, permitted);
1da177e4
LT
1841}
1842
06112163 1843static int selinux_capable(struct task_struct *tsk, int cap, int audit)
1da177e4
LT
1844{
1845 int rc;
1846
06112163 1847 rc = secondary_ops->capable(tsk, cap, audit);
1da177e4
LT
1848 if (rc)
1849 return rc;
1850
06112163 1851 return task_has_capability(tsk, cap, audit);
1da177e4
LT
1852}
1853
3fbfa981
EB
1854static int selinux_sysctl_get_sid(ctl_table *table, u16 tclass, u32 *sid)
1855{
1856 int buflen, rc;
1857 char *buffer, *path, *end;
1858
1859 rc = -ENOMEM;
828dfe1d 1860 buffer = (char *)__get_free_page(GFP_KERNEL);
3fbfa981
EB
1861 if (!buffer)
1862 goto out;
1863
1864 buflen = PAGE_SIZE;
1865 end = buffer+buflen;
1866 *--end = '\0';
1867 buflen--;
1868 path = end-1;
1869 *path = '/';
1870 while (table) {
1871 const char *name = table->procname;
1872 size_t namelen = strlen(name);
1873 buflen -= namelen + 1;
1874 if (buflen < 0)
1875 goto out_free;
1876 end -= namelen;
1877 memcpy(end, name, namelen);
1878 *--end = '/';
1879 path = end;
1880 table = table->parent;
1881 }
b599fdfd
EB
1882 buflen -= 4;
1883 if (buflen < 0)
1884 goto out_free;
1885 end -= 4;
1886 memcpy(end, "/sys", 4);
1887 path = end;
3fbfa981
EB
1888 rc = security_genfs_sid("proc", path, tclass, sid);
1889out_free:
1890 free_page((unsigned long)buffer);
1891out:
1892 return rc;
1893}
1894
1da177e4
LT
1895static int selinux_sysctl(ctl_table *table, int op)
1896{
1897 int error = 0;
1898 u32 av;
275bb41e 1899 u32 tsid, sid;
1da177e4
LT
1900 int rc;
1901
1902 rc = secondary_ops->sysctl(table, op);
1903 if (rc)
1904 return rc;
1905
275bb41e 1906 sid = current_sid();
1da177e4 1907
3fbfa981
EB
1908 rc = selinux_sysctl_get_sid(table, (op == 0001) ?
1909 SECCLASS_DIR : SECCLASS_FILE, &tsid);
1da177e4
LT
1910 if (rc) {
1911 /* Default to the well-defined sysctl SID. */
1912 tsid = SECINITSID_SYSCTL;
1913 }
1914
1915 /* The op values are "defined" in sysctl.c, thereby creating
1916 * a bad coupling between this module and sysctl.c */
828dfe1d 1917 if (op == 001) {
275bb41e 1918 error = avc_has_perm(sid, tsid,
1da177e4
LT
1919 SECCLASS_DIR, DIR__SEARCH, NULL);
1920 } else {
1921 av = 0;
1922 if (op & 004)
1923 av |= FILE__READ;
1924 if (op & 002)
1925 av |= FILE__WRITE;
1926 if (av)
275bb41e 1927 error = avc_has_perm(sid, tsid,
1da177e4 1928 SECCLASS_FILE, av, NULL);
828dfe1d 1929 }
1da177e4
LT
1930
1931 return error;
1932}
1933
1934static int selinux_quotactl(int cmds, int type, int id, struct super_block *sb)
1935{
88e67f3b 1936 const struct cred *cred = current_cred();
1da177e4
LT
1937 int rc = 0;
1938
1939 if (!sb)
1940 return 0;
1941
1942 switch (cmds) {
828dfe1d
EP
1943 case Q_SYNC:
1944 case Q_QUOTAON:
1945 case Q_QUOTAOFF:
1946 case Q_SETINFO:
1947 case Q_SETQUOTA:
88e67f3b 1948 rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAMOD, NULL);
828dfe1d
EP
1949 break;
1950 case Q_GETFMT:
1951 case Q_GETINFO:
1952 case Q_GETQUOTA:
88e67f3b 1953 rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAGET, NULL);
828dfe1d
EP
1954 break;
1955 default:
1956 rc = 0; /* let the kernel handle invalid cmds */
1957 break;
1da177e4
LT
1958 }
1959 return rc;
1960}
1961
1962static int selinux_quota_on(struct dentry *dentry)
1963{
88e67f3b
DH
1964 const struct cred *cred = current_cred();
1965
1966 return dentry_has_perm(cred, NULL, dentry, FILE__QUOTAON);
1da177e4
LT
1967}
1968
1969static int selinux_syslog(int type)
1970{
1971 int rc;
1972
1973 rc = secondary_ops->syslog(type);
1974 if (rc)
1975 return rc;
1976
1977 switch (type) {
828dfe1d
EP
1978 case 3: /* Read last kernel messages */
1979 case 10: /* Return size of the log buffer */
1980 rc = task_has_system(current, SYSTEM__SYSLOG_READ);
1981 break;
1982 case 6: /* Disable logging to console */
1983 case 7: /* Enable logging to console */
1984 case 8: /* Set level of messages printed to console */
1985 rc = task_has_system(current, SYSTEM__SYSLOG_CONSOLE);
1986 break;
1987 case 0: /* Close log */
1988 case 1: /* Open log */
1989 case 2: /* Read from log */
1990 case 4: /* Read/clear last kernel messages */
1991 case 5: /* Clear ring buffer */
1992 default:
1993 rc = task_has_system(current, SYSTEM__SYSLOG_MOD);
1994 break;
1da177e4
LT
1995 }
1996 return rc;
1997}
1998
1999/*
2000 * Check that a process has enough memory to allocate a new virtual
2001 * mapping. 0 means there is enough memory for the allocation to
2002 * succeed and -ENOMEM implies there is not.
2003 *
2004 * Note that secondary_ops->capable and task_has_perm_noaudit return 0
2005 * if the capability is granted, but __vm_enough_memory requires 1 if
2006 * the capability is granted.
2007 *
2008 * Do not audit the selinux permission check, as this is applied to all
2009 * processes that allocate mappings.
2010 */
34b4e4aa 2011static int selinux_vm_enough_memory(struct mm_struct *mm, long pages)
1da177e4
LT
2012{
2013 int rc, cap_sys_admin = 0;
1da177e4 2014
06674679 2015 rc = selinux_capable(current, CAP_SYS_ADMIN, SECURITY_CAP_NOAUDIT);
1da177e4
LT
2016 if (rc == 0)
2017 cap_sys_admin = 1;
2018
34b4e4aa 2019 return __vm_enough_memory(mm, pages, cap_sys_admin);
1da177e4
LT
2020}
2021
2022/* binprm security operations */
2023
2024static int selinux_bprm_alloc_security(struct linux_binprm *bprm)
2025{
2026 struct bprm_security_struct *bsec;
2027
89d155ef 2028 bsec = kzalloc(sizeof(struct bprm_security_struct), GFP_KERNEL);
1da177e4
LT
2029 if (!bsec)
2030 return -ENOMEM;
2031
1da177e4
LT
2032 bsec->sid = SECINITSID_UNLABELED;
2033 bsec->set = 0;
2034
2035 bprm->security = bsec;
2036 return 0;
2037}
2038
2039static int selinux_bprm_set_security(struct linux_binprm *bprm)
2040{
2041 struct task_security_struct *tsec;
3d5ff529 2042 struct inode *inode = bprm->file->f_path.dentry->d_inode;
1da177e4
LT
2043 struct inode_security_struct *isec;
2044 struct bprm_security_struct *bsec;
2045 u32 newsid;
2046 struct avc_audit_data ad;
2047 int rc;
2048
2049 rc = secondary_ops->bprm_set_security(bprm);
2050 if (rc)
2051 return rc;
2052
2053 bsec = bprm->security;
2054
2055 if (bsec->set)
2056 return 0;
2057
275bb41e 2058 tsec = current_security();
1da177e4
LT
2059 isec = inode->i_security;
2060
2061 /* Default to the current task SID. */
2062 bsec->sid = tsec->sid;
2063
28eba5bf 2064 /* Reset fs, key, and sock SIDs on execve. */
1da177e4 2065 tsec->create_sid = 0;
28eba5bf 2066 tsec->keycreate_sid = 0;
42c3e03e 2067 tsec->sockcreate_sid = 0;
1da177e4
LT
2068
2069 if (tsec->exec_sid) {
2070 newsid = tsec->exec_sid;
2071 /* Reset exec SID on execve. */
2072 tsec->exec_sid = 0;
2073 } else {
2074 /* Check for a default transition on this program. */
2075 rc = security_transition_sid(tsec->sid, isec->sid,
828dfe1d 2076 SECCLASS_PROCESS, &newsid);
1da177e4
LT
2077 if (rc)
2078 return rc;
2079 }
2080
2081 AVC_AUDIT_DATA_INIT(&ad, FS);
44707fdf 2082 ad.u.fs.path = bprm->file->f_path;
1da177e4 2083
3d5ff529 2084 if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID)
1da177e4
LT
2085 newsid = tsec->sid;
2086
828dfe1d 2087 if (tsec->sid == newsid) {
1da177e4
LT
2088 rc = avc_has_perm(tsec->sid, isec->sid,
2089 SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, &ad);
2090 if (rc)
2091 return rc;
2092 } else {
2093 /* Check permissions for the transition. */
2094 rc = avc_has_perm(tsec->sid, newsid,
2095 SECCLASS_PROCESS, PROCESS__TRANSITION, &ad);
2096 if (rc)
2097 return rc;
2098
2099 rc = avc_has_perm(newsid, isec->sid,
2100 SECCLASS_FILE, FILE__ENTRYPOINT, &ad);
2101 if (rc)
2102 return rc;
2103
2104 /* Clear any possibly unsafe personality bits on exec: */
2105 current->personality &= ~PER_CLEAR_ON_SETID;
2106
2107 /* Set the security field to the new SID. */
2108 bsec->sid = newsid;
2109 }
2110
2111 bsec->set = 1;
2112 return 0;
2113}
2114
828dfe1d 2115static int selinux_bprm_check_security(struct linux_binprm *bprm)
1da177e4
LT
2116{
2117 return secondary_ops->bprm_check_security(bprm);
2118}
2119
2120
828dfe1d 2121static int selinux_bprm_secureexec(struct linux_binprm *bprm)
1da177e4 2122{
275bb41e
DH
2123 const struct cred *cred = current_cred();
2124 const struct task_security_struct *tsec = cred->security;
2125 u32 sid, osid;
1da177e4
LT
2126 int atsecure = 0;
2127
275bb41e
DH
2128 sid = tsec->sid;
2129 osid = tsec->osid;
2130
2131 if (osid != sid) {
1da177e4
LT
2132 /* Enable secure mode for SIDs transitions unless
2133 the noatsecure permission is granted between
2134 the two SIDs, i.e. ahp returns 0. */
275bb41e 2135 atsecure = avc_has_perm(osid, sid,
1da177e4
LT
2136 SECCLASS_PROCESS,
2137 PROCESS__NOATSECURE, NULL);
2138 }
2139
2140 return (atsecure || secondary_ops->bprm_secureexec(bprm));
2141}
2142
2143static void selinux_bprm_free_security(struct linux_binprm *bprm)
2144{
9a5f04bf 2145 kfree(bprm->security);
1da177e4 2146 bprm->security = NULL;
1da177e4
LT
2147}
2148
2149extern struct vfsmount *selinuxfs_mount;
2150extern struct dentry *selinux_null;
2151
2152/* Derived from fs/exec.c:flush_old_files. */
745ca247
DH
2153static inline void flush_unauthorized_files(const struct cred *cred,
2154 struct files_struct *files)
1da177e4
LT
2155{
2156 struct avc_audit_data ad;
2157 struct file *file, *devnull = NULL;
b20c8122 2158 struct tty_struct *tty;
badf1662 2159 struct fdtable *fdt;
1da177e4 2160 long j = -1;
24ec839c 2161 int drop_tty = 0;
1da177e4 2162
24ec839c 2163 tty = get_current_tty();
1da177e4
LT
2164 if (tty) {
2165 file_list_lock();
37dd0bd0
EP
2166 if (!list_empty(&tty->tty_files)) {
2167 struct inode *inode;
2168
1da177e4
LT
2169 /* Revalidate access to controlling tty.
2170 Use inode_has_perm on the tty inode directly rather
2171 than using file_has_perm, as this particular open
2172 file may belong to another process and we are only
2173 interested in the inode-based check here. */
37dd0bd0
EP
2174 file = list_first_entry(&tty->tty_files, struct file, f_u.fu_list);
2175 inode = file->f_path.dentry->d_inode;
88e67f3b 2176 if (inode_has_perm(cred, inode,
1da177e4 2177 FILE__READ | FILE__WRITE, NULL)) {
24ec839c 2178 drop_tty = 1;
1da177e4
LT
2179 }
2180 }
2181 file_list_unlock();
452a00d2 2182 tty_kref_put(tty);
1da177e4 2183 }
98a27ba4
EB
2184 /* Reset controlling tty. */
2185 if (drop_tty)
2186 no_tty();
1da177e4
LT
2187
2188 /* Revalidate access to inherited open files. */
2189
828dfe1d 2190 AVC_AUDIT_DATA_INIT(&ad, FS);
1da177e4
LT
2191
2192 spin_lock(&files->file_lock);
2193 for (;;) {
2194 unsigned long set, i;
2195 int fd;
2196
2197 j++;
2198 i = j * __NFDBITS;
badf1662 2199 fdt = files_fdtable(files);
bbea9f69 2200 if (i >= fdt->max_fds)
1da177e4 2201 break;
badf1662 2202 set = fdt->open_fds->fds_bits[j];
1da177e4
LT
2203 if (!set)
2204 continue;
2205 spin_unlock(&files->file_lock);
828dfe1d 2206 for ( ; set ; i++, set >>= 1) {
1da177e4
LT
2207 if (set & 1) {
2208 file = fget(i);
2209 if (!file)
2210 continue;
88e67f3b 2211 if (file_has_perm(cred,
1da177e4
LT
2212 file,
2213 file_to_av(file))) {
2214 sys_close(i);
2215 fd = get_unused_fd();
2216 if (fd != i) {
2217 if (fd >= 0)
2218 put_unused_fd(fd);
2219 fput(file);
2220 continue;
2221 }
2222 if (devnull) {
095975da 2223 get_file(devnull);
1da177e4 2224 } else {
745ca247
DH
2225 devnull = dentry_open(
2226 dget(selinux_null),
2227 mntget(selinuxfs_mount),
2228 O_RDWR, cred);
fc5d81e6
AM
2229 if (IS_ERR(devnull)) {
2230 devnull = NULL;
1da177e4
LT
2231 put_unused_fd(fd);
2232 fput(file);
2233 continue;
2234 }
2235 }
2236 fd_install(fd, devnull);
2237 }
2238 fput(file);
2239 }
2240 }
2241 spin_lock(&files->file_lock);
2242
2243 }
2244 spin_unlock(&files->file_lock);
2245}
2246
2247static void selinux_bprm_apply_creds(struct linux_binprm *bprm, int unsafe)
2248{
2249 struct task_security_struct *tsec;
2250 struct bprm_security_struct *bsec;
2251 u32 sid;
2252 int rc;
2253
2254 secondary_ops->bprm_apply_creds(bprm, unsafe);
2255
275bb41e 2256 tsec = current_security();
1da177e4
LT
2257
2258 bsec = bprm->security;
2259 sid = bsec->sid;
2260
2261 tsec->osid = tsec->sid;
2262 bsec->unsafe = 0;
2263 if (tsec->sid != sid) {
2264 /* Check for shared state. If not ok, leave SID
2265 unchanged and kill. */
2266 if (unsafe & LSM_UNSAFE_SHARE) {
2267 rc = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
2268 PROCESS__SHARE, NULL);
2269 if (rc) {
2270 bsec->unsafe = 1;
2271 return;
2272 }
2273 }
2274
2275 /* Check for ptracing, and update the task SID if ok.
2276 Otherwise, leave SID unchanged and kill. */
2277 if (unsafe & (LSM_UNSAFE_PTRACE | LSM_UNSAFE_PTRACE_CAP)) {
0356357c
RM
2278 struct task_struct *tracer;
2279 struct task_security_struct *sec;
2280 u32 ptsid = 0;
2281
2282 rcu_read_lock();
0d094efe 2283 tracer = tracehook_tracer_task(current);
0356357c 2284 if (likely(tracer != NULL)) {
275bb41e 2285 sec = __task_cred(tracer)->security;
0356357c
RM
2286 ptsid = sec->sid;
2287 }
2288 rcu_read_unlock();
2289
2290 if (ptsid != 0) {
2291 rc = avc_has_perm(ptsid, sid, SECCLASS_PROCESS,
2292 PROCESS__PTRACE, NULL);
2293 if (rc) {
2294 bsec->unsafe = 1;
2295 return;
2296 }
1da177e4
LT
2297 }
2298 }
2299 tsec->sid = sid;
2300 }
2301}
2302
2303/*
2304 * called after apply_creds without the task lock held
2305 */
2306static void selinux_bprm_post_apply_creds(struct linux_binprm *bprm)
2307{
745ca247 2308 const struct cred *cred = current_cred();
1da177e4
LT
2309 struct task_security_struct *tsec;
2310 struct rlimit *rlim, *initrlim;
2311 struct itimerval itimer;
2312 struct bprm_security_struct *bsec;
41d9f9c5 2313 struct sighand_struct *psig;
1da177e4 2314 int rc, i;
41d9f9c5 2315 unsigned long flags;
1da177e4 2316
275bb41e 2317 tsec = current_security();
1da177e4
LT
2318 bsec = bprm->security;
2319
2320 if (bsec->unsafe) {
2321 force_sig_specific(SIGKILL, current);
2322 return;
2323 }
2324 if (tsec->osid == tsec->sid)
2325 return;
2326
2327 /* Close files for which the new task SID is not authorized. */
745ca247 2328 flush_unauthorized_files(cred, current->files);
1da177e4
LT
2329
2330 /* Check whether the new SID can inherit signal state
2331 from the old SID. If not, clear itimers to avoid
2332 subsequent signal generation and flush and unblock
2333 signals. This must occur _after_ the task SID has
2334 been updated so that any kill done after the flush
2335 will be checked against the new SID. */
2336 rc = avc_has_perm(tsec->osid, tsec->sid, SECCLASS_PROCESS,
2337 PROCESS__SIGINH, NULL);
2338 if (rc) {
2339 memset(&itimer, 0, sizeof itimer);
2340 for (i = 0; i < 3; i++)
2341 do_setitimer(i, &itimer, NULL);
2342 flush_signals(current);
2343 spin_lock_irq(&current->sighand->siglock);
2344 flush_signal_handlers(current, 1);
2345 sigemptyset(&current->blocked);
2346 recalc_sigpending();
2347 spin_unlock_irq(&current->sighand->siglock);
2348 }
2349
4ac212ad
SS
2350 /* Always clear parent death signal on SID transitions. */
2351 current->pdeath_signal = 0;
2352
1da177e4
LT
2353 /* Check whether the new SID can inherit resource limits
2354 from the old SID. If not, reset all soft limits to
2355 the lower of the current task's hard limit and the init
2356 task's soft limit. Note that the setting of hard limits
2357 (even to lower them) can be controlled by the setrlimit
2358 check. The inclusion of the init task's soft limit into
2359 the computation is to avoid resetting soft limits higher
2360 than the default soft limit for cases where the default
2361 is lower than the hard limit, e.g. RLIMIT_CORE or
2362 RLIMIT_STACK.*/
2363 rc = avc_has_perm(tsec->osid, tsec->sid, SECCLASS_PROCESS,
2364 PROCESS__RLIMITINH, NULL);
2365 if (rc) {
2366 for (i = 0; i < RLIM_NLIMITS; i++) {
2367 rlim = current->signal->rlim + i;
2368 initrlim = init_task.signal->rlim+i;
828dfe1d 2369 rlim->rlim_cur = min(rlim->rlim_max, initrlim->rlim_cur);
1da177e4 2370 }
f06febc9 2371 update_rlimit_cpu(rlim->rlim_cur);
1da177e4
LT
2372 }
2373
2374 /* Wake up the parent if it is waiting so that it can
2375 recheck wait permission to the new task SID. */
41d9f9c5
EP
2376 read_lock_irq(&tasklist_lock);
2377 psig = current->parent->sighand;
2378 spin_lock_irqsave(&psig->siglock, flags);
1da177e4 2379 wake_up_interruptible(&current->parent->signal->wait_chldexit);
41d9f9c5
EP
2380 spin_unlock_irqrestore(&psig->siglock, flags);
2381 read_unlock_irq(&tasklist_lock);
1da177e4
LT
2382}
2383
2384/* superblock security operations */
2385
2386static int selinux_sb_alloc_security(struct super_block *sb)
2387{
2388 return superblock_alloc_security(sb);
2389}
2390
2391static void selinux_sb_free_security(struct super_block *sb)
2392{
2393 superblock_free_security(sb);
2394}
2395
2396static inline int match_prefix(char *prefix, int plen, char *option, int olen)
2397{
2398 if (plen > olen)
2399 return 0;
2400
2401 return !memcmp(prefix, option, plen);
2402}
2403
2404static inline int selinux_option(char *option, int len)
2405{
832cbd9a
EP
2406 return (match_prefix(CONTEXT_STR, sizeof(CONTEXT_STR)-1, option, len) ||
2407 match_prefix(FSCONTEXT_STR, sizeof(FSCONTEXT_STR)-1, option, len) ||
2408 match_prefix(DEFCONTEXT_STR, sizeof(DEFCONTEXT_STR)-1, option, len) ||
2409 match_prefix(ROOTCONTEXT_STR, sizeof(ROOTCONTEXT_STR)-1, option, len));
1da177e4
LT
2410}
2411
2412static inline void take_option(char **to, char *from, int *first, int len)
2413{
2414 if (!*first) {
2415 **to = ',';
2416 *to += 1;
3528a953 2417 } else
1da177e4
LT
2418 *first = 0;
2419 memcpy(*to, from, len);
2420 *to += len;
2421}
2422
828dfe1d
EP
2423static inline void take_selinux_option(char **to, char *from, int *first,
2424 int len)
3528a953
CO
2425{
2426 int current_size = 0;
2427
2428 if (!*first) {
2429 **to = '|';
2430 *to += 1;
828dfe1d 2431 } else
3528a953
CO
2432 *first = 0;
2433
2434 while (current_size < len) {
2435 if (*from != '"') {
2436 **to = *from;
2437 *to += 1;
2438 }
2439 from += 1;
2440 current_size += 1;
2441 }
2442}
2443
e0007529 2444static int selinux_sb_copy_data(char *orig, char *copy)
1da177e4
LT
2445{
2446 int fnosec, fsec, rc = 0;
2447 char *in_save, *in_curr, *in_end;
2448 char *sec_curr, *nosec_save, *nosec;
3528a953 2449 int open_quote = 0;
1da177e4
LT
2450
2451 in_curr = orig;
2452 sec_curr = copy;
2453
1da177e4
LT
2454 nosec = (char *)get_zeroed_page(GFP_KERNEL);
2455 if (!nosec) {
2456 rc = -ENOMEM;
2457 goto out;
2458 }
2459
2460 nosec_save = nosec;
2461 fnosec = fsec = 1;
2462 in_save = in_end = orig;
2463
2464 do {
3528a953
CO
2465 if (*in_end == '"')
2466 open_quote = !open_quote;
2467 if ((*in_end == ',' && open_quote == 0) ||
2468 *in_end == '\0') {
1da177e4
LT
2469 int len = in_end - in_curr;
2470
2471 if (selinux_option(in_curr, len))
3528a953 2472 take_selinux_option(&sec_curr, in_curr, &fsec, len);
1da177e4
LT
2473 else
2474 take_option(&nosec, in_curr, &fnosec, len);
2475
2476 in_curr = in_end + 1;
2477 }
2478 } while (*in_end++);
2479
6931dfc9 2480 strcpy(in_save, nosec_save);
da3caa20 2481 free_page((unsigned long)nosec_save);
1da177e4
LT
2482out:
2483 return rc;
2484}
2485
2486static int selinux_sb_kern_mount(struct super_block *sb, void *data)
2487{
88e67f3b 2488 const struct cred *cred = current_cred();
1da177e4
LT
2489 struct avc_audit_data ad;
2490 int rc;
2491
2492 rc = superblock_doinit(sb, data);
2493 if (rc)
2494 return rc;
2495
828dfe1d 2496 AVC_AUDIT_DATA_INIT(&ad, FS);
44707fdf 2497 ad.u.fs.path.dentry = sb->s_root;
88e67f3b 2498 return superblock_has_perm(cred, sb, FILESYSTEM__MOUNT, &ad);
1da177e4
LT
2499}
2500
726c3342 2501static int selinux_sb_statfs(struct dentry *dentry)
1da177e4 2502{
88e67f3b 2503 const struct cred *cred = current_cred();
1da177e4
LT
2504 struct avc_audit_data ad;
2505
828dfe1d 2506 AVC_AUDIT_DATA_INIT(&ad, FS);
44707fdf 2507 ad.u.fs.path.dentry = dentry->d_sb->s_root;
88e67f3b 2508 return superblock_has_perm(cred, dentry->d_sb, FILESYSTEM__GETATTR, &ad);
1da177e4
LT
2509}
2510
828dfe1d 2511static int selinux_mount(char *dev_name,
b5266eb4 2512 struct path *path,
828dfe1d
EP
2513 char *type,
2514 unsigned long flags,
2515 void *data)
1da177e4 2516{
88e67f3b 2517 const struct cred *cred = current_cred();
1da177e4
LT
2518 int rc;
2519
b5266eb4 2520 rc = secondary_ops->sb_mount(dev_name, path, type, flags, data);
1da177e4
LT
2521 if (rc)
2522 return rc;
2523
2524 if (flags & MS_REMOUNT)
88e67f3b 2525 return superblock_has_perm(cred, path->mnt->mnt_sb,
828dfe1d 2526 FILESYSTEM__REMOUNT, NULL);
1da177e4 2527 else
88e67f3b 2528 return dentry_has_perm(cred, path->mnt, path->dentry,
828dfe1d 2529 FILE__MOUNTON);
1da177e4
LT
2530}
2531
2532static int selinux_umount(struct vfsmount *mnt, int flags)
2533{
88e67f3b 2534 const struct cred *cred = current_cred();
1da177e4
LT
2535 int rc;
2536
2537 rc = secondary_ops->sb_umount(mnt, flags);
2538 if (rc)
2539 return rc;
2540
88e67f3b 2541 return superblock_has_perm(cred, mnt->mnt_sb,
828dfe1d 2542 FILESYSTEM__UNMOUNT, NULL);
1da177e4
LT
2543}
2544
2545/* inode security operations */
2546
2547static int selinux_inode_alloc_security(struct inode *inode)
2548{
2549 return inode_alloc_security(inode);
2550}
2551
2552static void selinux_inode_free_security(struct inode *inode)
2553{
2554 inode_free_security(inode);
2555}
2556
5e41ff9e
SS
2557static int selinux_inode_init_security(struct inode *inode, struct inode *dir,
2558 char **name, void **value,
2559 size_t *len)
2560{
275bb41e
DH
2561 const struct cred *cred = current_cred();
2562 const struct task_security_struct *tsec = cred->security;
5e41ff9e
SS
2563 struct inode_security_struct *dsec;
2564 struct superblock_security_struct *sbsec;
275bb41e 2565 u32 sid, newsid, clen;
5e41ff9e 2566 int rc;
570bc1c2 2567 char *namep = NULL, *context;
5e41ff9e 2568
5e41ff9e
SS
2569 dsec = dir->i_security;
2570 sbsec = dir->i_sb->s_security;
5e41ff9e 2571
275bb41e
DH
2572 sid = tsec->sid;
2573 newsid = tsec->create_sid;
2574
2575 if (!newsid || sbsec->behavior == SECURITY_FS_USE_MNTPOINT) {
2576 rc = security_transition_sid(sid, dsec->sid,
5e41ff9e
SS
2577 inode_mode_to_security_class(inode->i_mode),
2578 &newsid);
2579 if (rc) {
2580 printk(KERN_WARNING "%s: "
2581 "security_transition_sid failed, rc=%d (dev=%s "
2582 "ino=%ld)\n",
dd6f953a 2583 __func__,
5e41ff9e
SS
2584 -rc, inode->i_sb->s_id, inode->i_ino);
2585 return rc;
2586 }
2587 }
2588
296fddf7
EP
2589 /* Possibly defer initialization to selinux_complete_init. */
2590 if (sbsec->initialized) {
2591 struct inode_security_struct *isec = inode->i_security;
2592 isec->sclass = inode_mode_to_security_class(inode->i_mode);
2593 isec->sid = newsid;
2594 isec->initialized = 1;
2595 }
5e41ff9e 2596
8aad3875 2597 if (!ss_initialized || sbsec->behavior == SECURITY_FS_USE_MNTPOINT)
25a74f3b
SS
2598 return -EOPNOTSUPP;
2599
570bc1c2 2600 if (name) {
a02fe132 2601 namep = kstrdup(XATTR_SELINUX_SUFFIX, GFP_NOFS);
570bc1c2
SS
2602 if (!namep)
2603 return -ENOMEM;
2604 *name = namep;
2605 }
5e41ff9e 2606
570bc1c2 2607 if (value && len) {
12b29f34 2608 rc = security_sid_to_context_force(newsid, &context, &clen);
570bc1c2
SS
2609 if (rc) {
2610 kfree(namep);
2611 return rc;
2612 }
2613 *value = context;
2614 *len = clen;
5e41ff9e 2615 }
5e41ff9e 2616
5e41ff9e
SS
2617 return 0;
2618}
2619
1da177e4
LT
2620static int selinux_inode_create(struct inode *dir, struct dentry *dentry, int mask)
2621{
2622 return may_create(dir, dentry, SECCLASS_FILE);
2623}
2624
1da177e4
LT
2625static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
2626{
2627 int rc;
2628
828dfe1d 2629 rc = secondary_ops->inode_link(old_dentry, dir, new_dentry);
1da177e4
LT
2630 if (rc)
2631 return rc;
2632 return may_link(dir, old_dentry, MAY_LINK);
2633}
2634
1da177e4
LT
2635static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
2636{
2637 int rc;
2638
2639 rc = secondary_ops->inode_unlink(dir, dentry);
2640 if (rc)
2641 return rc;
2642 return may_link(dir, dentry, MAY_UNLINK);
2643}
2644
2645static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
2646{
2647 return may_create(dir, dentry, SECCLASS_LNK_FILE);
2648}
2649
1da177e4
LT
2650static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, int mask)
2651{
2652 return may_create(dir, dentry, SECCLASS_DIR);
2653}
2654
1da177e4
LT
2655static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
2656{
2657 return may_link(dir, dentry, MAY_RMDIR);
2658}
2659
2660static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
2661{
2662 int rc;
2663
2664 rc = secondary_ops->inode_mknod(dir, dentry, mode, dev);
2665 if (rc)
2666 return rc;
2667
2668 return may_create(dir, dentry, inode_mode_to_security_class(mode));
2669}
2670
1da177e4 2671static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
828dfe1d 2672 struct inode *new_inode, struct dentry *new_dentry)
1da177e4
LT
2673{
2674 return may_rename(old_inode, old_dentry, new_inode, new_dentry);
2675}
2676
1da177e4
LT
2677static int selinux_inode_readlink(struct dentry *dentry)
2678{
88e67f3b
DH
2679 const struct cred *cred = current_cred();
2680
2681 return dentry_has_perm(cred, NULL, dentry, FILE__READ);
1da177e4
LT
2682}
2683
2684static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *nameidata)
2685{
88e67f3b 2686 const struct cred *cred = current_cred();
1da177e4
LT
2687 int rc;
2688
828dfe1d 2689 rc = secondary_ops->inode_follow_link(dentry, nameidata);
1da177e4
LT
2690 if (rc)
2691 return rc;
88e67f3b 2692 return dentry_has_perm(cred, NULL, dentry, FILE__READ);
1da177e4
LT
2693}
2694
b77b0646 2695static int selinux_inode_permission(struct inode *inode, int mask)
1da177e4 2696{
88e67f3b 2697 const struct cred *cred = current_cred();
1da177e4
LT
2698 int rc;
2699
b77b0646 2700 rc = secondary_ops->inode_permission(inode, mask);
1da177e4
LT
2701 if (rc)
2702 return rc;
2703
2704 if (!mask) {
2705 /* No permission to check. Existence test. */
2706 return 0;
2707 }
2708
88e67f3b 2709 return inode_has_perm(cred, inode,
8b6a5a37 2710 file_mask_to_av(inode->i_mode, mask), NULL);
1da177e4
LT
2711}
2712
2713static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
2714{
88e67f3b 2715 const struct cred *cred = current_cred();
1da177e4
LT
2716 int rc;
2717
2718 rc = secondary_ops->inode_setattr(dentry, iattr);
2719 if (rc)
2720 return rc;
2721
2722 if (iattr->ia_valid & ATTR_FORCE)
2723 return 0;
2724
2725 if (iattr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
2726 ATTR_ATIME_SET | ATTR_MTIME_SET))
88e67f3b 2727 return dentry_has_perm(cred, NULL, dentry, FILE__SETATTR);
1da177e4 2728
88e67f3b 2729 return dentry_has_perm(cred, NULL, dentry, FILE__WRITE);
1da177e4
LT
2730}
2731
2732static int selinux_inode_getattr(struct vfsmount *mnt, struct dentry *dentry)
2733{
88e67f3b
DH
2734 const struct cred *cred = current_cred();
2735
2736 return dentry_has_perm(cred, mnt, dentry, FILE__GETATTR);
1da177e4
LT
2737}
2738
8f0cfa52 2739static int selinux_inode_setotherxattr(struct dentry *dentry, const char *name)
b5376771 2740{
88e67f3b
DH
2741 const struct cred *cred = current_cred();
2742
b5376771
SH
2743 if (!strncmp(name, XATTR_SECURITY_PREFIX,
2744 sizeof XATTR_SECURITY_PREFIX - 1)) {
2745 if (!strcmp(name, XATTR_NAME_CAPS)) {
2746 if (!capable(CAP_SETFCAP))
2747 return -EPERM;
2748 } else if (!capable(CAP_SYS_ADMIN)) {
2749 /* A different attribute in the security namespace.
2750 Restrict to administrator. */
2751 return -EPERM;
2752 }
2753 }
2754
2755 /* Not an attribute we recognize, so just check the
2756 ordinary setattr permission. */
88e67f3b 2757 return dentry_has_perm(cred, NULL, dentry, FILE__SETATTR);
b5376771
SH
2758}
2759
8f0cfa52
DH
2760static int selinux_inode_setxattr(struct dentry *dentry, const char *name,
2761 const void *value, size_t size, int flags)
1da177e4 2762{
1da177e4
LT
2763 struct inode *inode = dentry->d_inode;
2764 struct inode_security_struct *isec = inode->i_security;
2765 struct superblock_security_struct *sbsec;
2766 struct avc_audit_data ad;
275bb41e 2767 u32 newsid, sid = current_sid();
1da177e4
LT
2768 int rc = 0;
2769
b5376771
SH
2770 if (strcmp(name, XATTR_NAME_SELINUX))
2771 return selinux_inode_setotherxattr(dentry, name);
1da177e4
LT
2772
2773 sbsec = inode->i_sb->s_security;
2774 if (sbsec->behavior == SECURITY_FS_USE_MNTPOINT)
2775 return -EOPNOTSUPP;
2776
3bd858ab 2777 if (!is_owner_or_cap(inode))
1da177e4
LT
2778 return -EPERM;
2779
828dfe1d 2780 AVC_AUDIT_DATA_INIT(&ad, FS);
44707fdf 2781 ad.u.fs.path.dentry = dentry;
1da177e4 2782
275bb41e 2783 rc = avc_has_perm(sid, isec->sid, isec->sclass,
1da177e4
LT
2784 FILE__RELABELFROM, &ad);
2785 if (rc)
2786 return rc;
2787
2788 rc = security_context_to_sid(value, size, &newsid);
12b29f34
SS
2789 if (rc == -EINVAL) {
2790 if (!capable(CAP_MAC_ADMIN))
2791 return rc;
2792 rc = security_context_to_sid_force(value, size, &newsid);
2793 }
1da177e4
LT
2794 if (rc)
2795 return rc;
2796
275bb41e 2797 rc = avc_has_perm(sid, newsid, isec->sclass,
1da177e4
LT
2798 FILE__RELABELTO, &ad);
2799 if (rc)
2800 return rc;
2801
275bb41e 2802 rc = security_validate_transition(isec->sid, newsid, sid,
828dfe1d 2803 isec->sclass);
1da177e4
LT
2804 if (rc)
2805 return rc;
2806
2807 return avc_has_perm(newsid,
2808 sbsec->sid,
2809 SECCLASS_FILESYSTEM,
2810 FILESYSTEM__ASSOCIATE,
2811 &ad);
2812}
2813
8f0cfa52 2814static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
f5269710 2815 const void *value, size_t size,
8f0cfa52 2816 int flags)
1da177e4
LT
2817{
2818 struct inode *inode = dentry->d_inode;
2819 struct inode_security_struct *isec = inode->i_security;
2820 u32 newsid;
2821 int rc;
2822
2823 if (strcmp(name, XATTR_NAME_SELINUX)) {
2824 /* Not an attribute we recognize, so nothing to do. */
2825 return;
2826 }
2827
12b29f34 2828 rc = security_context_to_sid_force(value, size, &newsid);
1da177e4 2829 if (rc) {
12b29f34
SS
2830 printk(KERN_ERR "SELinux: unable to map context to SID"
2831 "for (%s, %lu), rc=%d\n",
2832 inode->i_sb->s_id, inode->i_ino, -rc);
1da177e4
LT
2833 return;
2834 }
2835
2836 isec->sid = newsid;
2837 return;
2838}
2839
8f0cfa52 2840static int selinux_inode_getxattr(struct dentry *dentry, const char *name)
1da177e4 2841{
88e67f3b
DH
2842 const struct cred *cred = current_cred();
2843
2844 return dentry_has_perm(cred, NULL, dentry, FILE__GETATTR);
1da177e4
LT
2845}
2846
828dfe1d 2847static int selinux_inode_listxattr(struct dentry *dentry)
1da177e4 2848{
88e67f3b
DH
2849 const struct cred *cred = current_cred();
2850
2851 return dentry_has_perm(cred, NULL, dentry, FILE__GETATTR);
1da177e4
LT
2852}
2853
8f0cfa52 2854static int selinux_inode_removexattr(struct dentry *dentry, const char *name)
1da177e4 2855{
b5376771
SH
2856 if (strcmp(name, XATTR_NAME_SELINUX))
2857 return selinux_inode_setotherxattr(dentry, name);
1da177e4
LT
2858
2859 /* No one is allowed to remove a SELinux security label.
2860 You can change the label, but all data must be labeled. */
2861 return -EACCES;
2862}
2863
d381d8a9 2864/*
abc69bb6 2865 * Copy the inode security context value to the user.
d381d8a9
JM
2866 *
2867 * Permission check is handled by selinux_inode_getxattr hook.
2868 */
42492594 2869static int selinux_inode_getsecurity(const struct inode *inode, const char *name, void **buffer, bool alloc)
1da177e4 2870{
42492594
DQ
2871 u32 size;
2872 int error;
2873 char *context = NULL;
1da177e4 2874 struct inode_security_struct *isec = inode->i_security;
d381d8a9 2875
8c8570fb
DK
2876 if (strcmp(name, XATTR_SELINUX_SUFFIX))
2877 return -EOPNOTSUPP;
d381d8a9 2878
abc69bb6
SS
2879 /*
2880 * If the caller has CAP_MAC_ADMIN, then get the raw context
2881 * value even if it is not defined by current policy; otherwise,
2882 * use the in-core value under current policy.
2883 * Use the non-auditing forms of the permission checks since
2884 * getxattr may be called by unprivileged processes commonly
2885 * and lack of permission just means that we fall back to the
2886 * in-core context value, not a denial.
2887 */
06674679 2888 error = selinux_capable(current, CAP_MAC_ADMIN, SECURITY_CAP_NOAUDIT);
abc69bb6
SS
2889 if (!error)
2890 error = security_sid_to_context_force(isec->sid, &context,
2891 &size);
2892 else
2893 error = security_sid_to_context(isec->sid, &context, &size);
42492594
DQ
2894 if (error)
2895 return error;
2896 error = size;
2897 if (alloc) {
2898 *buffer = context;
2899 goto out_nofree;
2900 }
2901 kfree(context);
2902out_nofree:
2903 return error;
1da177e4
LT
2904}
2905
2906static int selinux_inode_setsecurity(struct inode *inode, const char *name,
828dfe1d 2907 const void *value, size_t size, int flags)
1da177e4
LT
2908{
2909 struct inode_security_struct *isec = inode->i_security;
2910 u32 newsid;
2911 int rc;
2912
2913 if (strcmp(name, XATTR_SELINUX_SUFFIX))
2914 return -EOPNOTSUPP;
2915
2916 if (!value || !size)
2917 return -EACCES;
2918
828dfe1d 2919 rc = security_context_to_sid((void *)value, size, &newsid);
1da177e4
LT
2920 if (rc)
2921 return rc;
2922
2923 isec->sid = newsid;
2924 return 0;
2925}
2926
2927static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
2928{
2929 const int len = sizeof(XATTR_NAME_SELINUX);
2930 if (buffer && len <= buffer_size)
2931 memcpy(buffer, XATTR_NAME_SELINUX, len);
2932 return len;
2933}
2934
b5376771
SH
2935static int selinux_inode_need_killpriv(struct dentry *dentry)
2936{
2937 return secondary_ops->inode_need_killpriv(dentry);
2938}
2939
2940static int selinux_inode_killpriv(struct dentry *dentry)
2941{
2942 return secondary_ops->inode_killpriv(dentry);
2943}
2944
713a04ae
AD
2945static void selinux_inode_getsecid(const struct inode *inode, u32 *secid)
2946{
2947 struct inode_security_struct *isec = inode->i_security;
2948 *secid = isec->sid;
2949}
2950
1da177e4
LT
2951/* file security operations */
2952
788e7dd4 2953static int selinux_revalidate_file_permission(struct file *file, int mask)
1da177e4 2954{
88e67f3b 2955 const struct cred *cred = current_cred();
7420ed23 2956 int rc;
3d5ff529 2957 struct inode *inode = file->f_path.dentry->d_inode;
1da177e4
LT
2958
2959 if (!mask) {
2960 /* No permission to check. Existence test. */
2961 return 0;
2962 }
2963
2964 /* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
2965 if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
2966 mask |= MAY_APPEND;
2967
88e67f3b 2968 rc = file_has_perm(cred, file,
7420ed23
VY
2969 file_mask_to_av(inode->i_mode, mask));
2970 if (rc)
2971 return rc;
2972
2973 return selinux_netlbl_inode_permission(inode, mask);
1da177e4
LT
2974}
2975
788e7dd4
YN
2976static int selinux_file_permission(struct file *file, int mask)
2977{
2978 struct inode *inode = file->f_path.dentry->d_inode;
788e7dd4
YN
2979 struct file_security_struct *fsec = file->f_security;
2980 struct inode_security_struct *isec = inode->i_security;
275bb41e 2981 u32 sid = current_sid();
788e7dd4
YN
2982
2983 if (!mask) {
2984 /* No permission to check. Existence test. */
2985 return 0;
2986 }
2987
275bb41e 2988 if (sid == fsec->sid && fsec->isid == isec->sid
788e7dd4
YN
2989 && fsec->pseqno == avc_policy_seqno())
2990 return selinux_netlbl_inode_permission(inode, mask);
2991
2992 return selinux_revalidate_file_permission(file, mask);
2993}
2994
1da177e4
LT
2995static int selinux_file_alloc_security(struct file *file)
2996{
2997 return file_alloc_security(file);
2998}
2999
3000static void selinux_file_free_security(struct file *file)
3001{
3002 file_free_security(file);
3003}
3004
3005static int selinux_file_ioctl(struct file *file, unsigned int cmd,
3006 unsigned long arg)
3007{
88e67f3b 3008 const struct cred *cred = current_cred();
242631c4 3009 u32 av = 0;
1da177e4 3010
242631c4
SS
3011 if (_IOC_DIR(cmd) & _IOC_WRITE)
3012 av |= FILE__WRITE;
3013 if (_IOC_DIR(cmd) & _IOC_READ)
3014 av |= FILE__READ;
3015 if (!av)
3016 av = FILE__IOCTL;
1da177e4 3017
88e67f3b 3018 return file_has_perm(cred, file, av);
1da177e4
LT
3019}
3020
3021static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
3022{
88e67f3b
DH
3023 const struct cred *cred = current_cred();
3024
1da177e4
LT
3025#ifndef CONFIG_PPC32
3026 if ((prot & PROT_EXEC) && (!file || (!shared && (prot & PROT_WRITE)))) {
3027 /*
3028 * We are making executable an anonymous mapping or a
3029 * private file mapping that will also be writable.
3030 * This has an additional check.
3031 */
3032 int rc = task_has_perm(current, current, PROCESS__EXECMEM);
3033 if (rc)
3034 return rc;
3035 }
3036#endif
3037
3038 if (file) {
3039 /* read access is always possible with a mapping */
3040 u32 av = FILE__READ;
3041
3042 /* write access only matters if the mapping is shared */
3043 if (shared && (prot & PROT_WRITE))
3044 av |= FILE__WRITE;
3045
3046 if (prot & PROT_EXEC)
3047 av |= FILE__EXECUTE;
3048
88e67f3b 3049 return file_has_perm(cred, file, av);
1da177e4
LT
3050 }
3051 return 0;
3052}
3053
3054static int selinux_file_mmap(struct file *file, unsigned long reqprot,
ed032189
EP
3055 unsigned long prot, unsigned long flags,
3056 unsigned long addr, unsigned long addr_only)
1da177e4 3057{
ed032189 3058 int rc = 0;
275bb41e 3059 u32 sid = current_sid();
1da177e4 3060
ed032189
EP
3061 if (addr < mmap_min_addr)
3062 rc = avc_has_perm(sid, sid, SECCLASS_MEMPROTECT,
3063 MEMPROTECT__MMAP_ZERO, NULL);
3064 if (rc || addr_only)
1da177e4
LT
3065 return rc;
3066
3067 if (selinux_checkreqprot)
3068 prot = reqprot;
3069
3070 return file_map_prot_check(file, prot,
3071 (flags & MAP_TYPE) == MAP_SHARED);
3072}
3073
3074static int selinux_file_mprotect(struct vm_area_struct *vma,
3075 unsigned long reqprot,
3076 unsigned long prot)
3077{
88e67f3b 3078 const struct cred *cred = current_cred();
1da177e4
LT
3079 int rc;
3080
3081 rc = secondary_ops->file_mprotect(vma, reqprot, prot);
3082 if (rc)
3083 return rc;
3084
3085 if (selinux_checkreqprot)
3086 prot = reqprot;
3087
3088#ifndef CONFIG_PPC32
db4c9641
SS
3089 if ((prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
3090 rc = 0;
3091 if (vma->vm_start >= vma->vm_mm->start_brk &&
3092 vma->vm_end <= vma->vm_mm->brk) {
3093 rc = task_has_perm(current, current,
3094 PROCESS__EXECHEAP);
3095 } else if (!vma->vm_file &&
3096 vma->vm_start <= vma->vm_mm->start_stack &&
3097 vma->vm_end >= vma->vm_mm->start_stack) {
3098 rc = task_has_perm(current, current, PROCESS__EXECSTACK);
3099 } else if (vma->vm_file && vma->anon_vma) {
3100 /*
3101 * We are making executable a file mapping that has
3102 * had some COW done. Since pages might have been
3103 * written, check ability to execute the possibly
3104 * modified content. This typically should only
3105 * occur for text relocations.
3106 */
88e67f3b 3107 rc = file_has_perm(cred, vma->vm_file,
db4c9641
SS
3108 FILE__EXECMOD);
3109 }