mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 05:48:40 +00:00
![Tetsuo Handa](/assets/img/avatar_default.png)
To be able to start using enforcing mode from the early stage of boot sequence, this patch adds support for activating access control without calling external policy loader program. This will be useful for systems where operations which can lead to the hijacking of the boot sequence are needed before loading the policy. For example, you can activate immediately after loading the fixed part of policy which will allow only operations needed for mounting a partition which contains the variant part of policy and verifying (e.g. running GPG check) and loading the variant part of policy. Since you can start using enforcing mode from the beginning, you can reduce the possibility of hijacking the boot sequence. This patch makes several variables configurable on build time. This patch also adds TOMOYO_loader= and TOMOYO_trigger= kernel command line option to boot the same kernel in two different init systems (BSD-style init and systemd). Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Signed-off-by: James Morris <jmorris@namei.org>
111 lines
2.6 KiB
C
111 lines
2.6 KiB
C
/*
|
|
* security/tomoyo/load_policy.c
|
|
*
|
|
* Policy loader launcher for TOMOYO.
|
|
*
|
|
* Copyright (C) 2005-2010 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, 1);
|
|
tomoyo_check_profile();
|
|
}
|
|
|
|
#endif
|