| /* |
| * security/tomoyo/load_policy.c |
| * |
| * Policy loader launcher for TOMOYO. |
| * |
| * Copyright (C) 2005-2010 NTT DATA CORPORATION |
| */ |
| |
| #include "common.h" |
| |
| /* path to policy loader */ |
| static const char *tomoyo_loader = "/sbin/tomoyo-init"; |
| |
| /** |
| * tomoyo_policy_loader_exists - Check whether /sbin/tomoyo-init exists. |
| * |
| * Returns true if /sbin/tomoyo-init exists, false otherwise. |
| */ |
| static bool tomoyo_policy_loader_exists(void) |
| { |
| /* |
| * Don't activate MAC if the policy loader doesn't exist. |
| * If the initrd includes /sbin/init but real-root-dev has not |
| * mounted on / yet, activating MAC will block the system since |
| * policies are not loaded yet. |
| * Thus, let do_execve() call this function every time. |
| */ |
| struct path path; |
| |
| if (kern_path(tomoyo_loader, LOOKUP_FOLLOW, &path)) { |
| printk(KERN_INFO "Not activating Mandatory Access Control now " |
| "since %s doesn't exist.\n", tomoyo_loader); |
| return false; |
| } |
| path_put(&path); |
| return true; |
| } |
| |
| /** |
| * tomoyo_load_policy - Run external policy loader to load policy. |
| * |
| * @filename: The program about to start. |
| * |
| * This function checks whether @filename is /sbin/init , and if so |
| * invoke /sbin/tomoyo-init and wait for the termination of /sbin/tomoyo-init |
| * and then continues invocation of /sbin/init. |
| * /sbin/tomoyo-init reads policy files in /etc/tomoyo/ directory and |
| * writes to /sys/kernel/security/tomoyo/ interfaces. |
| * |
| * Returns nothing. |
| */ |
| void tomoyo_load_policy(const char *filename) |
| { |
| char *argv[2]; |
| char *envp[3]; |
| |
| if (tomoyo_policy_loaded) |
| return; |
| /* |
| * Check filename is /sbin/init or /sbin/tomoyo-start. |
| * /sbin/tomoyo-start is a dummy filename in case where /sbin/init can't |
| * be passed. |
| * You can create /sbin/tomoyo-start by |
| * "ln -s /bin/true /sbin/tomoyo-start". |
| */ |
| if (strcmp(filename, "/sbin/init") && |
| strcmp(filename, "/sbin/tomoyo-start")) |
| return; |
| if (!tomoyo_policy_loader_exists()) |
| return; |
| |
| printk(KERN_INFO "Calling %s to load policy. Please wait.\n", |
| tomoyo_loader); |
| argv[0] = (char *) tomoyo_loader; |
| argv[1] = NULL; |
| envp[0] = "HOME=/"; |
| envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin"; |
| envp[2] = NULL; |
| call_usermodehelper(argv[0], argv, envp, 1); |
| tomoyo_check_profile(); |
| } |