tomoyo.c revision c3ef1500ec833890275172c7d063333404b64d60
1f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda/* 2f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * security/tomoyo/tomoyo.c 3f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * 4f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * LSM hooks for TOMOYO Linux. 5f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * 6c3ef1500ec833890275172c7d063333404b64d60Tetsuo Handa * Copyright (C) 2005-2010 NTT DATA CORPORATION 7f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda */ 8f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 9f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda#include <linux/security.h> 10f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda#include "common.h" 11f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 12ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howellsstatic int tomoyo_cred_alloc_blank(struct cred *new, gfp_t gfp) 13ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells{ 14ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells new->security = NULL; 15ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells return 0; 16ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells} 17ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells 18f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_cred_prepare(struct cred *new, const struct cred *old, 19f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda gfp_t gfp) 20f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 21ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa struct tomoyo_domain_info *domain = old->security; 22ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa new->security = domain; 23ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa if (domain) 24ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa atomic_inc(&domain->users); 25f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 26f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 27f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 28ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howellsstatic void tomoyo_cred_transfer(struct cred *new, const struct cred *old) 29ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells{ 30ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa tomoyo_cred_prepare(new, old, 0); 31ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa} 32ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa 33ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handastatic void tomoyo_cred_free(struct cred *cred) 34ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa{ 35ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa struct tomoyo_domain_info *domain = cred->security; 36ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa if (domain) 37ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa atomic_dec(&domain->users); 38ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells} 39ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells 40f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_bprm_set_creds(struct linux_binprm *bprm) 41f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 42b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski int rc; 43b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski 44b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski rc = cap_bprm_set_creds(bprm); 45b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski if (rc) 46b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski return rc; 47b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski 48f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* 49f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * Do only if this function is called for the first time of an execve 50f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * operation. 51f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda */ 52f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda if (bprm->cred_prepared) 53f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 54f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* 55f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * Load policy if /sbin/tomoyo-init exists and /sbin/init is requested 56f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * for the first time. 57f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda */ 58f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda if (!tomoyo_policy_loaded) 59f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda tomoyo_load_policy(bprm->filename); 60f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* 61ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa * Release reference to "struct tomoyo_domain_info" stored inside 62ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa * "bprm->cred->security". New reference to "struct tomoyo_domain_info" 63ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa * stored inside "bprm->cred->security" will be acquired later inside 64ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa * tomoyo_find_next_domain(). 65ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa */ 66ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa atomic_dec(&((struct tomoyo_domain_info *) 67ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa bprm->cred->security)->users); 68ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa /* 69f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * Tell tomoyo_bprm_check_security() is called for the first time of an 70f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * execve operation. 71f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda */ 72f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda bprm->cred->security = NULL; 73f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 74f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 75f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 76f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_bprm_check_security(struct linux_binprm *bprm) 77f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 78f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct tomoyo_domain_info *domain = bprm->cred->security; 79f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 80f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* 81f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * Execute permission is checked against pathname passed to do_execve() 82f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * using current domain. 83f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda */ 84fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa if (!domain) { 85fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa const int idx = tomoyo_read_lock(); 86fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa const int err = tomoyo_find_next_domain(bprm); 87fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa tomoyo_read_unlock(idx); 88fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa return err; 89fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa } 90f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* 91f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * Read permission is checked against interpreters using next domain. 92f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda */ 936d125529c6cbfe570ce3bf9a0728548f087499daAl Viro return tomoyo_check_open_permission(domain, &bprm->file->f_path, O_RDONLY); 94f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 95f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 96f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_truncate(struct path *path, loff_t length, 97f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda unsigned int time_attrs) 98f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 9997d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa return tomoyo_path_perm(TOMOYO_TYPE_TRUNCATE, path); 100f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 101f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 102f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_unlink(struct path *parent, struct dentry *dentry) 103f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 104f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path = { parent->mnt, dentry }; 10597d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa return tomoyo_path_perm(TOMOYO_TYPE_UNLINK, &path); 106f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 107f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 108f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_mkdir(struct path *parent, struct dentry *dentry, 109f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda int mode) 110f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 111f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path = { parent->mnt, dentry }; 112a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa return tomoyo_path_number_perm(TOMOYO_TYPE_MKDIR, &path, 113a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa mode & S_IALLUGO); 114f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 115f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 116f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_rmdir(struct path *parent, struct dentry *dentry) 117f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 118f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path = { parent->mnt, dentry }; 11997d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa return tomoyo_path_perm(TOMOYO_TYPE_RMDIR, &path); 120f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 121f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 122f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_symlink(struct path *parent, struct dentry *dentry, 123f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda const char *old_name) 124f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 125f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path = { parent->mnt, dentry }; 12697d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa return tomoyo_path_perm(TOMOYO_TYPE_SYMLINK, &path); 127f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 128f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 129f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_mknod(struct path *parent, struct dentry *dentry, 130f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda int mode, unsigned int dev) 131f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 132f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path = { parent->mnt, dentry }; 1337ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa int type = TOMOYO_TYPE_CREATE; 134a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa const unsigned int perm = mode & S_IALLUGO; 135f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 136f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda switch (mode & S_IFMT) { 137f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda case S_IFCHR: 1387ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa type = TOMOYO_TYPE_MKCHAR; 139f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda break; 140f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda case S_IFBLK: 1417ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa type = TOMOYO_TYPE_MKBLOCK; 142f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda break; 143a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa default: 144a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa goto no_dev; 145a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa } 146a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa return tomoyo_path_number3_perm(type, &path, perm, dev); 147a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa no_dev: 148a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa switch (mode & S_IFMT) { 149f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda case S_IFIFO: 1507ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa type = TOMOYO_TYPE_MKFIFO; 151f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda break; 152f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda case S_IFSOCK: 1537ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa type = TOMOYO_TYPE_MKSOCK; 154f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda break; 155f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda } 156a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa return tomoyo_path_number_perm(type, &path, perm); 157f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 158f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 159f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_link(struct dentry *old_dentry, struct path *new_dir, 160f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct dentry *new_dentry) 161f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 162f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path1 = { new_dir->mnt, old_dentry }; 163f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path2 = { new_dir->mnt, new_dentry }; 16497d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa return tomoyo_path2_perm(TOMOYO_TYPE_LINK, &path1, &path2); 165f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 166f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 167f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_rename(struct path *old_parent, 168f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct dentry *old_dentry, 169f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path *new_parent, 170f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct dentry *new_dentry) 171f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 172f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path1 = { old_parent->mnt, old_dentry }; 173f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct path path2 = { new_parent->mnt, new_dentry }; 17497d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa return tomoyo_path2_perm(TOMOYO_TYPE_RENAME, &path1, &path2); 175f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 176f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 177f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_file_fcntl(struct file *file, unsigned int cmd, 178f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda unsigned long arg) 179f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 180f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda if (cmd == F_SETFL && ((arg ^ file->f_flags) & O_APPEND)) 181cb0abe6a5b58499bd4bc1403f4987af9ead0642cTetsuo Handa return tomoyo_path_perm(TOMOYO_TYPE_REWRITE, &file->f_path); 182f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 183f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 184f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 185f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_dentry_open(struct file *f, const struct cred *cred) 186f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 187f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda int flags = f->f_flags; 188f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* Don't check read permission here if called from do_execve(). */ 189f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda if (current->in_execve) 190f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 191f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return tomoyo_check_open_permission(tomoyo_domain(), &f->f_path, flags); 192f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 193f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 194937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_file_ioctl(struct file *file, unsigned int cmd, 195937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa unsigned long arg) 196937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 197a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa return tomoyo_path_number_perm(TOMOYO_TYPE_IOCTL, &file->f_path, cmd); 198937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 199937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 200937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_path_chmod(struct dentry *dentry, struct vfsmount *mnt, 201937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa mode_t mode) 202937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 203937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa struct path path = { mnt, dentry }; 204a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa return tomoyo_path_number_perm(TOMOYO_TYPE_CHMOD, &path, 205a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa mode & S_IALLUGO); 206937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 207937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 208937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_path_chown(struct path *path, uid_t uid, gid_t gid) 209937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 210937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa int error = 0; 211937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa if (uid != (uid_t) -1) 212a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa error = tomoyo_path_number_perm(TOMOYO_TYPE_CHOWN, path, uid); 213937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa if (!error && gid != (gid_t) -1) 214a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa error = tomoyo_path_number_perm(TOMOYO_TYPE_CHGRP, path, gid); 215937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa return error; 216937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 217937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 218937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_path_chroot(struct path *path) 219937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 22097d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa return tomoyo_path_perm(TOMOYO_TYPE_CHROOT, path); 221937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 222937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 223937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_sb_mount(char *dev_name, struct path *path, 224937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa char *type, unsigned long flags, void *data) 225937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 2262106ccd972dcd9fda7df9b181505fac1741b3508Tetsuo Handa return tomoyo_mount_permission(dev_name, path, type, flags, data); 227937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 228937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 229937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_sb_umount(struct vfsmount *mnt, int flags) 230937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 231937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa struct path path = { mnt, mnt->mnt_root }; 23297d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa return tomoyo_path_perm(TOMOYO_TYPE_UMOUNT, &path); 233937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 234937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 235937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_sb_pivotroot(struct path *old_path, struct path *new_path) 236937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{ 23797d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa return tomoyo_path2_perm(TOMOYO_TYPE_PIVOT_ROOT, new_path, old_path); 238937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa} 239937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa 240c3fa109a5894077d1eaf8731ea741a15dd117b3cTetsuo Handa/* 241c3fa109a5894077d1eaf8731ea741a15dd117b3cTetsuo Handa * tomoyo_security_ops is a "struct security_operations" which is used for 242c3fa109a5894077d1eaf8731ea741a15dd117b3cTetsuo Handa * registering TOMOYO. 243c3fa109a5894077d1eaf8731ea741a15dd117b3cTetsuo Handa */ 244f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic struct security_operations tomoyo_security_ops = { 245f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .name = "tomoyo", 246ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells .cred_alloc_blank = tomoyo_cred_alloc_blank, 247f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .cred_prepare = tomoyo_cred_prepare, 248ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells .cred_transfer = tomoyo_cred_transfer, 249ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa .cred_free = tomoyo_cred_free, 250f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .bprm_set_creds = tomoyo_bprm_set_creds, 251f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .bprm_check_security = tomoyo_bprm_check_security, 252f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .file_fcntl = tomoyo_file_fcntl, 253f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .dentry_open = tomoyo_dentry_open, 254f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_truncate = tomoyo_path_truncate, 255f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_unlink = tomoyo_path_unlink, 256f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_mkdir = tomoyo_path_mkdir, 257f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_rmdir = tomoyo_path_rmdir, 258f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_symlink = tomoyo_path_symlink, 259f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_mknod = tomoyo_path_mknod, 260f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_link = tomoyo_path_link, 261f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda .path_rename = tomoyo_path_rename, 262937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .file_ioctl = tomoyo_file_ioctl, 263937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .path_chmod = tomoyo_path_chmod, 264937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .path_chown = tomoyo_path_chown, 265937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .path_chroot = tomoyo_path_chroot, 266937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .sb_mount = tomoyo_sb_mount, 267937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .sb_umount = tomoyo_sb_umount, 268937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa .sb_pivotroot = tomoyo_sb_pivotroot, 269f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}; 270f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 271fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa/* Lock for GC. */ 272fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handastruct srcu_struct tomoyo_ss; 273fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa 274f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int __init tomoyo_init(void) 275f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{ 276f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda struct cred *cred = (struct cred *) current_cred(); 277f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 278f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda if (!security_module_enable(&tomoyo_security_ops)) 279f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 280f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda /* register ourselves with the security framework */ 281fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa if (register_security(&tomoyo_security_ops) || 282fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa init_srcu_struct(&tomoyo_ss)) 283f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda panic("Failure registering TOMOYO Linux"); 284f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda printk(KERN_INFO "TOMOYO Linux initialized\n"); 285f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda cred->security = &tomoyo_kernel_domain; 286c3ef1500ec833890275172c7d063333404b64d60Tetsuo Handa tomoyo_mm_init(); 287f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda return 0; 288f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda} 289f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda 290f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedasecurity_initcall(tomoyo_init); 291