[PATCH] selinux: add hooks for key subsystem
Introduce SELinux hooks to support the access key retention subsystem within the kernel. Incorporate new flask headers from a modified version of the SELinux reference policy, with support for the new security class representing retained keys. Extend the "key_alloc" security hook with a task parameter representing the intended ownership context for the key being allocated. Attach security information to root's default keyrings within the SELinux initialization routine. Has passed David's testsuite. Signed-off-by: Michael LeMay <mdlemay@epoch.ncsc.mil> Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: James Morris <jmorris@namei.org> Acked-by: Chris Wright <chrisw@sous-sol.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:

committed by
Linus Torvalds

parent
f893afbe12
commit
d720024e94
@@ -247,8 +247,8 @@ static inline void key_alloc_serial(struct key *key)
|
||||
* instantiate the key or discard it before returning
|
||||
*/
|
||||
struct key *key_alloc(struct key_type *type, const char *desc,
|
||||
uid_t uid, gid_t gid, key_perm_t perm,
|
||||
int not_in_quota)
|
||||
uid_t uid, gid_t gid, struct task_struct *ctx,
|
||||
key_perm_t perm, int not_in_quota)
|
||||
{
|
||||
struct key_user *user = NULL;
|
||||
struct key *key;
|
||||
@@ -318,7 +318,7 @@ struct key *key_alloc(struct key_type *type, const char *desc,
|
||||
#endif
|
||||
|
||||
/* let the security module know about the key */
|
||||
ret = security_key_alloc(key);
|
||||
ret = security_key_alloc(key, ctx);
|
||||
if (ret < 0)
|
||||
goto security_error;
|
||||
|
||||
@@ -822,7 +822,7 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref,
|
||||
|
||||
/* allocate a new key */
|
||||
key = key_alloc(ktype, description, current->fsuid, current->fsgid,
|
||||
perm, not_in_quota);
|
||||
current, perm, not_in_quota);
|
||||
if (IS_ERR(key)) {
|
||||
key_ref = ERR_PTR(PTR_ERR(key));
|
||||
goto error_3;
|
||||
|
@@ -240,13 +240,14 @@ static long keyring_read(const struct key *keyring,
|
||||
* allocate a keyring and link into the destination keyring
|
||||
*/
|
||||
struct key *keyring_alloc(const char *description, uid_t uid, gid_t gid,
|
||||
int not_in_quota, struct key *dest)
|
||||
struct task_struct *ctx, int not_in_quota,
|
||||
struct key *dest)
|
||||
{
|
||||
struct key *keyring;
|
||||
int ret;
|
||||
|
||||
keyring = key_alloc(&key_type_keyring, description,
|
||||
uid, gid,
|
||||
uid, gid, ctx,
|
||||
(KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_ALL,
|
||||
not_in_quota);
|
||||
|
||||
|
@@ -67,7 +67,8 @@ struct key root_session_keyring = {
|
||||
/*
|
||||
* allocate the keyrings to be associated with a UID
|
||||
*/
|
||||
int alloc_uid_keyring(struct user_struct *user)
|
||||
int alloc_uid_keyring(struct user_struct *user,
|
||||
struct task_struct *ctx)
|
||||
{
|
||||
struct key *uid_keyring, *session_keyring;
|
||||
char buf[20];
|
||||
@@ -76,7 +77,7 @@ int alloc_uid_keyring(struct user_struct *user)
|
||||
/* concoct a default session keyring */
|
||||
sprintf(buf, "_uid_ses.%u", user->uid);
|
||||
|
||||
session_keyring = keyring_alloc(buf, user->uid, (gid_t) -1, 0, NULL);
|
||||
session_keyring = keyring_alloc(buf, user->uid, (gid_t) -1, ctx, 0, NULL);
|
||||
if (IS_ERR(session_keyring)) {
|
||||
ret = PTR_ERR(session_keyring);
|
||||
goto error;
|
||||
@@ -86,7 +87,7 @@ int alloc_uid_keyring(struct user_struct *user)
|
||||
* keyring */
|
||||
sprintf(buf, "_uid.%u", user->uid);
|
||||
|
||||
uid_keyring = keyring_alloc(buf, user->uid, (gid_t) -1, 0,
|
||||
uid_keyring = keyring_alloc(buf, user->uid, (gid_t) -1, ctx, 0,
|
||||
session_keyring);
|
||||
if (IS_ERR(uid_keyring)) {
|
||||
key_put(session_keyring);
|
||||
@@ -143,7 +144,7 @@ int install_thread_keyring(struct task_struct *tsk)
|
||||
|
||||
sprintf(buf, "_tid.%u", tsk->pid);
|
||||
|
||||
keyring = keyring_alloc(buf, tsk->uid, tsk->gid, 1, NULL);
|
||||
keyring = keyring_alloc(buf, tsk->uid, tsk->gid, tsk, 1, NULL);
|
||||
if (IS_ERR(keyring)) {
|
||||
ret = PTR_ERR(keyring);
|
||||
goto error;
|
||||
@@ -177,7 +178,7 @@ int install_process_keyring(struct task_struct *tsk)
|
||||
if (!tsk->signal->process_keyring) {
|
||||
sprintf(buf, "_pid.%u", tsk->tgid);
|
||||
|
||||
keyring = keyring_alloc(buf, tsk->uid, tsk->gid, 1, NULL);
|
||||
keyring = keyring_alloc(buf, tsk->uid, tsk->gid, tsk, 1, NULL);
|
||||
if (IS_ERR(keyring)) {
|
||||
ret = PTR_ERR(keyring);
|
||||
goto error;
|
||||
@@ -217,7 +218,7 @@ static int install_session_keyring(struct task_struct *tsk,
|
||||
if (!keyring) {
|
||||
sprintf(buf, "_ses.%u", tsk->tgid);
|
||||
|
||||
keyring = keyring_alloc(buf, tsk->uid, tsk->gid, 1, NULL);
|
||||
keyring = keyring_alloc(buf, tsk->uid, tsk->gid, tsk, 1, NULL);
|
||||
if (IS_ERR(keyring))
|
||||
return PTR_ERR(keyring);
|
||||
}
|
||||
@@ -717,7 +718,7 @@ long join_session_keyring(const char *name)
|
||||
keyring = find_keyring_by_name(name, 0);
|
||||
if (PTR_ERR(keyring) == -ENOKEY) {
|
||||
/* not found - try and create a new one */
|
||||
keyring = keyring_alloc(name, tsk->uid, tsk->gid, 0, NULL);
|
||||
keyring = keyring_alloc(name, tsk->uid, tsk->gid, tsk, 0, NULL);
|
||||
if (IS_ERR(keyring)) {
|
||||
ret = PTR_ERR(keyring);
|
||||
goto error2;
|
||||
|
@@ -48,7 +48,8 @@ static int call_sbin_request_key(struct key *key,
|
||||
/* allocate a new session keyring */
|
||||
sprintf(desc, "_req.%u", key->serial);
|
||||
|
||||
keyring = keyring_alloc(desc, current->fsuid, current->fsgid, 1, NULL);
|
||||
keyring = keyring_alloc(desc, current->fsuid, current->fsgid,
|
||||
current, 1, NULL);
|
||||
if (IS_ERR(keyring)) {
|
||||
ret = PTR_ERR(keyring);
|
||||
goto error_alloc;
|
||||
@@ -137,7 +138,8 @@ static struct key *__request_key_construction(struct key_type *type,
|
||||
|
||||
/* create a key and add it to the queue */
|
||||
key = key_alloc(type, description,
|
||||
current->fsuid, current->fsgid, KEY_POS_ALL, 0);
|
||||
current->fsuid, current->fsgid,
|
||||
current, KEY_POS_ALL, 0);
|
||||
if (IS_ERR(key))
|
||||
goto alloc_failed;
|
||||
|
||||
|
@@ -148,7 +148,7 @@ struct key *request_key_auth_new(struct key *target, const char *callout_info)
|
||||
sprintf(desc, "%x", target->serial);
|
||||
|
||||
authkey = key_alloc(&key_type_request_key_auth, desc,
|
||||
current->fsuid, current->fsgid,
|
||||
current->fsuid, current->fsgid, current,
|
||||
KEY_POS_VIEW | KEY_POS_READ | KEY_POS_SEARCH |
|
||||
KEY_USR_VIEW, 1);
|
||||
if (IS_ERR(authkey)) {
|
||||
|
Reference in New Issue
Block a user