tomoyo.c revision 7ef612331fb219620cc1abfc2446bb027d388aa0
1f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda/* 2f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * security/tomoyo/tomoyo.c 3f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * 4f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * LSM hooks for TOMOYO Linux. 5f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * 6f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * Copyright (C) 2005-2009 NTT DATA CORPORATION 7f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * 839826a1e17c1957bd7b5cd7815b83940e5e3a230Tetsuo Handa * Version: 2.2.0 2009/04/01 9f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * 10f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda */ 11f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 12f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda#include <linux/security.h> 13f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda#include "common.h" 14f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 15ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howellsstatic int tomoyo_cred_alloc_blank(struct cred *new, gfp_t gfp) 16ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells{ 17ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells new->security = NULL; 18ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells return 0; 19ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells} 20ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells 21f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_cred_prepare(struct cred *new, const struct cred *old, 22f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda gfp_t gfp) 23f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 24ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa struct tomoyo_domain_info *domain = old->security; 25ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa new->security = domain; 26ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa if (domain) 27ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa atomic_inc(&domain->users); 28f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 29f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 30f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 31ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howellsstatic void tomoyo_cred_transfer(struct cred *new, const struct cred *old) 32ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells{ 33ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa tomoyo_cred_prepare(new, old, 0); 34ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa} 35ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa 36ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handastatic void tomoyo_cred_free(struct cred *cred) 37ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa{ 38ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa struct tomoyo_domain_info *domain = cred->security; 39ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa if (domain) 40ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa atomic_dec(&domain->users); 41ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells} 42ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells 43f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_bprm_set_creds(struct linux_binprm *bprm) 44f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 45b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski int rc; 46b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski 47b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski rc = cap_bprm_set_creds(bprm); 48b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski if (rc) 49b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski return rc; 50b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski 51f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* 52f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * Do only if this function is called for the first time of an execve 53f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * operation. 54f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda */ 55f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda if (bprm->cred_prepared) 56f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 57f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* 58f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * Load policy if /sbin/tomoyo-init exists and /sbin/init is requested 59f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * for the first time. 60f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda */ 61f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda if (!tomoyo_policy_loaded) 62f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda tomoyo_load_policy(bprm->filename); 63f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* 64ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa * Release reference to "struct tomoyo_domain_info" stored inside 65ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa * "bprm->cred->security". New reference to "struct tomoyo_domain_info" 66ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa * stored inside "bprm->cred->security" will be acquired later inside 67ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa * tomoyo_find_next_domain(). 68ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa */ 69ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa atomic_dec(&((struct tomoyo_domain_info *) 70ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa bprm->cred->security)->users); 71ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa /* 72f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * Tell tomoyo_bprm_check_security() is called for the first time of an 73f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * execve operation. 74f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda */ 75f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda bprm->cred->security = NULL; 76f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 77f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 78f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 79f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_bprm_check_security(struct linux_binprm *bprm) 80f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 81f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct tomoyo_domain_info *domain = bprm->cred->security; 82f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 83f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* 84f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * Execute permission is checked against pathname passed to do_execve() 85f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * using current domain. 86f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda */ 87fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa if (!domain) { 88fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa const int idx = tomoyo_read_lock(); 89fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa const int err = tomoyo_find_next_domain(bprm); 90fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa tomoyo_read_unlock(idx); 91fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa return err; 92fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa } 93f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* 94f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * Read permission is checked against interpreters using next domain. 95f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * '1' is the result of open_to_namei_flags(O_RDONLY). 96f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda */ 97f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return tomoyo_check_open_permission(domain, &bprm->file->f_path, 1); 98f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 99f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 100f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_truncate(struct path *path, loff_t length, 101f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda unsigned int time_attrs) 102f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 1037ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path_perm(tomoyo_domain(), TOMOYO_TYPE_TRUNCATE, path); 104f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 105f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 106f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_unlink(struct path *parent, struct dentry *dentry) 107f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 108f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path = { parent->mnt, dentry }; 1097ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path_perm(tomoyo_domain(), TOMOYO_TYPE_UNLINK, &path); 110f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 111f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 112f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_mkdir(struct path *parent, struct dentry *dentry, 113f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda int mode) 114f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 115f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path = { parent->mnt, dentry }; 1167ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path_perm(tomoyo_domain(), TOMOYO_TYPE_MKDIR, &path); 117f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 118f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 119f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_rmdir(struct path *parent, struct dentry *dentry) 120f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 121f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path = { parent->mnt, dentry }; 1227ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path_perm(tomoyo_domain(), TOMOYO_TYPE_RMDIR, &path); 123f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 124f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 125f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_symlink(struct path *parent, struct dentry *dentry, 126f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda const char *old_name) 127f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 128f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path = { parent->mnt, dentry }; 1297ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path_perm(tomoyo_domain(), TOMOYO_TYPE_SYMLINK, &path); 130f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 131f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 132f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_mknod(struct path *parent, struct dentry *dentry, 133f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda int mode, unsigned int dev) 134f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 135f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path = { parent->mnt, dentry }; 1367ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa int type = TOMOYO_TYPE_CREATE; 137f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 138f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda switch (mode & S_IFMT) { 139f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda case S_IFCHR: 1407ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa type = TOMOYO_TYPE_MKCHAR; 141f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda break; 142f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda case S_IFBLK: 1437ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa type = TOMOYO_TYPE_MKBLOCK; 144f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda break; 145f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda case S_IFIFO: 1467ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa type = TOMOYO_TYPE_MKFIFO; 147f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda break; 148f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda case S_IFSOCK: 1497ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa type = TOMOYO_TYPE_MKSOCK; 150f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda break; 151f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda } 1527ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path_perm(tomoyo_domain(), type, &path); 153f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 154f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 155f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_link(struct dentry *old_dentry, struct path *new_dir, 156f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct dentry *new_dentry) 157f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 158f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path1 = { new_dir->mnt, old_dentry }; 159f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path2 = { new_dir->mnt, new_dentry }; 1607ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path2_perm(tomoyo_domain(), TOMOYO_TYPE_LINK, &path1, 1617ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa &path2); 162f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 163f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 164f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_rename(struct path *old_parent, 165f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct dentry *old_dentry, 166f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path *new_parent, 167f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct dentry *new_dentry) 168f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 169f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path1 = { old_parent->mnt, old_dentry }; 170f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path2 = { new_parent->mnt, new_dentry }; 1717ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path2_perm(tomoyo_domain(), TOMOYO_TYPE_RENAME, &path1, 1727ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa &path2); 173f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 174f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 175f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_file_fcntl(struct file *file, unsigned int cmd, 176f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda unsigned long arg) 177f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 178f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda if (cmd == F_SETFL && ((arg ^ file->f_flags) & O_APPEND)) 179f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return tomoyo_check_rewrite_permission(tomoyo_domain(), file); 180f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 181f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 182f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 183f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_dentry_open(struct file *f, const struct cred *cred) 184f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 185f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda int flags = f->f_flags; 186f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 187f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda if ((flags + 1) & O_ACCMODE) 188f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda flags++; 189f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda flags |= f->f_flags & (O_APPEND | O_TRUNC); 190f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* Don't check read permission here if called from do_execve(). */ 191f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda if (current->in_execve) 192f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 193f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return tomoyo_check_open_permission(tomoyo_domain(), &f->f_path, flags); 194f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 195f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 196937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_file_ioctl(struct file *file, unsigned int cmd, 197937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa unsigned long arg) 198937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 1997ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path_perm(tomoyo_domain(), TOMOYO_TYPE_IOCTL, 2007ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa &file->f_path); 201937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 202937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 203937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_path_chmod(struct dentry *dentry, struct vfsmount *mnt, 204937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa mode_t mode) 205937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 206937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa struct path path = { mnt, dentry }; 2077ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path_perm(tomoyo_domain(), TOMOYO_TYPE_CHMOD, &path); 208937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 209937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 210937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_path_chown(struct path *path, uid_t uid, gid_t gid) 211937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 212937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa int error = 0; 213937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa if (uid != (uid_t) -1) 2147ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa error = tomoyo_path_perm(tomoyo_domain(), TOMOYO_TYPE_CHOWN, 2157ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa path); 216937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa if (!error && gid != (gid_t) -1) 2177ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa error = tomoyo_path_perm(tomoyo_domain(), TOMOYO_TYPE_CHGRP, 2187ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa path); 219937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa return error; 220937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 221937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 222937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_path_chroot(struct path *path) 223937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 2247ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path_perm(tomoyo_domain(), TOMOYO_TYPE_CHROOT, path); 225937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 226937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 227937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_sb_mount(char *dev_name, struct path *path, 228937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa char *type, unsigned long flags, void *data) 229937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 2307ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path_perm(tomoyo_domain(), TOMOYO_TYPE_MOUNT, path); 231937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 232937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 233937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_sb_umount(struct vfsmount *mnt, int flags) 234937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 235937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa struct path path = { mnt, mnt->mnt_root }; 2367ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path_perm(tomoyo_domain(), TOMOYO_TYPE_UMOUNT, &path); 237937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 238937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 239937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_sb_pivotroot(struct path *old_path, struct path *new_path) 240937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 2417ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa return tomoyo_path2_perm(tomoyo_domain(), TOMOYO_TYPE_PIVOT_ROOT, 2427ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa new_path, old_path); 243937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 244937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 245c3fa109a5894077d1eaf8731ea741a15dd117b3cTetsuo Handa/* 246c3fa109a5894077d1eaf8731ea741a15dd117b3cTetsuo Handa * tomoyo_security_ops is a "struct security_operations" which is used for 247c3fa109a5894077d1eaf8731ea741a15dd117b3cTetsuo Handa * registering TOMOYO. 248c3fa109a5894077d1eaf8731ea741a15dd117b3cTetsuo Handa */ 249f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic struct security_operations tomoyo_security_ops = { 250f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .name = "tomoyo", 251ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells .cred_alloc_blank = tomoyo_cred_alloc_blank, 252f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .cred_prepare = tomoyo_cred_prepare, 253ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells .cred_transfer = tomoyo_cred_transfer, 254ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa .cred_free = tomoyo_cred_free, 255f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .bprm_set_creds = tomoyo_bprm_set_creds, 256f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .bprm_check_security = tomoyo_bprm_check_security, 257f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .file_fcntl = tomoyo_file_fcntl, 258f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .dentry_open = tomoyo_dentry_open, 259f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_truncate = tomoyo_path_truncate, 260f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_unlink = tomoyo_path_unlink, 261f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_mkdir = tomoyo_path_mkdir, 262f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_rmdir = tomoyo_path_rmdir, 263f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_symlink = tomoyo_path_symlink, 264f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_mknod = tomoyo_path_mknod, 265f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_link = tomoyo_path_link, 266f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_rename = tomoyo_path_rename, 267937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .file_ioctl = tomoyo_file_ioctl, 268937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .path_chmod = tomoyo_path_chmod, 269937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .path_chown = tomoyo_path_chown, 270937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .path_chroot = tomoyo_path_chroot, 271937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .sb_mount = tomoyo_sb_mount, 272937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .sb_umount = tomoyo_sb_umount, 273937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .sb_pivotroot = tomoyo_sb_pivotroot, 274f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}; 275f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 276fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa/* Lock for GC. */ 277fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handastruct srcu_struct tomoyo_ss; 278fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa 279f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int __init tomoyo_init(void) 280f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 281f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct cred *cred = (struct cred *) current_cred(); 282f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 283f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda if (!security_module_enable(&tomoyo_security_ops)) 284f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 285f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* register ourselves with the security framework */ 286fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa if (register_security(&tomoyo_security_ops) || 287fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa init_srcu_struct(&tomoyo_ss)) 288f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda panic("Failure registering TOMOYO Linux"); 289f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda printk(KERN_INFO "TOMOYO Linux initialized\n"); 290f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda cred->security = &tomoyo_kernel_domain; 2911581e7ddbdd97443a134e1a0cc9d81256baf77a4Tetsuo Handa tomoyo_realpath_init(); 292f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 293f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 294f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 295f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedasecurity_initcall(tomoyo_init); 296