111 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0
 | |
| /*
 | |
|  * security/tomoyo/load_policy.c
 | |
|  *
 | |
|  * Copyright (C) 2005-2011  NTT DATA CORPORATION
 | |
|  */
 | |
| 
 | |
| #include "common.h"
 | |
| 
 | |
| #ifndef CONFIG_SECURITY_TOMOYO_OMIT_USERSPACE_LOADER
 | |
| 
 | |
| /*
 | |
|  * Path to the policy loader. (default = CONFIG_SECURITY_TOMOYO_POLICY_LOADER)
 | |
|  */
 | |
| static const char *tomoyo_loader;
 | |
| 
 | |
| /**
 | |
|  * tomoyo_loader_setup - Set policy loader.
 | |
|  *
 | |
|  * @str: Program to use as a policy loader (e.g. /sbin/tomoyo-init ).
 | |
|  *
 | |
|  * Returns 0.
 | |
|  */
 | |
| static int __init tomoyo_loader_setup(char *str)
 | |
| {
 | |
| 	tomoyo_loader = str;
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| __setup("TOMOYO_loader=", tomoyo_loader_setup);
 | |
| 
 | |
| /**
 | |
|  * 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)
 | |
| {
 | |
| 	struct path path;
 | |
| 	if (!tomoyo_loader)
 | |
| 		tomoyo_loader = CONFIG_SECURITY_TOMOYO_POLICY_LOADER;
 | |
| 	if (kern_path(tomoyo_loader, LOOKUP_FOLLOW, &path)) {
 | |
| 		printk(KERN_INFO "Not activating Mandatory Access Control "
 | |
| 		       "as %s does not exist.\n", tomoyo_loader);
 | |
| 		return false;
 | |
| 	}
 | |
| 	path_put(&path);
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * Path to the trigger. (default = CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER)
 | |
|  */
 | |
| static const char *tomoyo_trigger;
 | |
| 
 | |
| /**
 | |
|  * tomoyo_trigger_setup - Set trigger for activation.
 | |
|  *
 | |
|  * @str: Program to use as an activation trigger (e.g. /sbin/init ).
 | |
|  *
 | |
|  * Returns 0.
 | |
|  */
 | |
| static int __init tomoyo_trigger_setup(char *str)
 | |
| {
 | |
| 	tomoyo_trigger = str;
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| __setup("TOMOYO_trigger=", tomoyo_trigger_setup);
 | |
| 
 | |
| /**
 | |
|  * 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)
 | |
| {
 | |
| 	static bool done;
 | |
| 	char *argv[2];
 | |
| 	char *envp[3];
 | |
| 
 | |
| 	if (tomoyo_policy_loaded || done)
 | |
| 		return;
 | |
| 	if (!tomoyo_trigger)
 | |
| 		tomoyo_trigger = CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER;
 | |
| 	if (strcmp(filename, tomoyo_trigger))
 | |
| 		return;
 | |
| 	if (!tomoyo_policy_loader_exists())
 | |
| 		return;
 | |
| 	done = true;
 | |
| 	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, UMH_WAIT_PROC);
 | |
| 	tomoyo_check_profile();
 | |
| }
 | |
| 
 | |
| #endif
 |