mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6: security: fix up documentation for security_module_enable Security: Introduce security= boot parameter Audit: Final renamings and cleanup SELinux: use new audit hooks, remove redundant exports Audit: internally use the new LSM audit hooks LSM/Audit: Introduce generic Audit LSM hooks SELinux: remove redundant exports Netlink: Use generic LSM hook Audit: use new LSM hooks instead of SELinux exports SELinux: setup new inode/ipc getsecid hooks LSM: Introduce inode_getsecid and ipc_getsecid hooks
This commit is contained in:
commit
3925e6fc1f
18 changed files with 503 additions and 335 deletions
|
|
@ -25,48 +25,6 @@
|
|||
/* SECMARK reference count */
|
||||
extern atomic_t selinux_secmark_refcount;
|
||||
|
||||
int selinux_sid_to_string(u32 sid, char **ctx, u32 *ctxlen)
|
||||
{
|
||||
if (selinux_enabled)
|
||||
return security_sid_to_context(sid, ctx, ctxlen);
|
||||
else {
|
||||
*ctx = NULL;
|
||||
*ctxlen = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void selinux_get_inode_sid(const struct inode *inode, u32 *sid)
|
||||
{
|
||||
if (selinux_enabled) {
|
||||
struct inode_security_struct *isec = inode->i_security;
|
||||
*sid = isec->sid;
|
||||
return;
|
||||
}
|
||||
*sid = 0;
|
||||
}
|
||||
|
||||
void selinux_get_ipc_sid(const struct kern_ipc_perm *ipcp, u32 *sid)
|
||||
{
|
||||
if (selinux_enabled) {
|
||||
struct ipc_security_struct *isec = ipcp->security;
|
||||
*sid = isec->sid;
|
||||
return;
|
||||
}
|
||||
*sid = 0;
|
||||
}
|
||||
|
||||
void selinux_get_task_sid(struct task_struct *tsk, u32 *sid)
|
||||
{
|
||||
if (selinux_enabled) {
|
||||
struct task_security_struct *tsec = tsk->security;
|
||||
*sid = tsec->sid;
|
||||
return;
|
||||
}
|
||||
*sid = 0;
|
||||
}
|
||||
|
||||
int selinux_string_to_sid(char *str, u32 *sid)
|
||||
{
|
||||
if (selinux_enabled)
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@
|
|||
#include "netport.h"
|
||||
#include "xfrm.h"
|
||||
#include "netlabel.h"
|
||||
#include "audit.h"
|
||||
|
||||
#define XATTR_SELINUX_SUFFIX "selinux"
|
||||
#define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX
|
||||
|
|
@ -2792,6 +2793,12 @@ static int selinux_inode_killpriv(struct dentry *dentry)
|
|||
return secondary_ops->inode_killpriv(dentry);
|
||||
}
|
||||
|
||||
static void selinux_inode_getsecid(const struct inode *inode, u32 *secid)
|
||||
{
|
||||
struct inode_security_struct *isec = inode->i_security;
|
||||
*secid = isec->sid;
|
||||
}
|
||||
|
||||
/* file security operations */
|
||||
|
||||
static int selinux_revalidate_file_permission(struct file *file, int mask)
|
||||
|
|
@ -3183,7 +3190,8 @@ static int selinux_task_getsid(struct task_struct *p)
|
|||
|
||||
static void selinux_task_getsecid(struct task_struct *p, u32 *secid)
|
||||
{
|
||||
selinux_get_task_sid(p, secid);
|
||||
struct task_security_struct *tsec = p->security;
|
||||
*secid = tsec->sid;
|
||||
}
|
||||
|
||||
static int selinux_task_setgroups(struct group_info *group_info)
|
||||
|
|
@ -4149,7 +4157,7 @@ static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *
|
|||
goto out;
|
||||
|
||||
if (sock && family == PF_UNIX)
|
||||
selinux_get_inode_sid(SOCK_INODE(sock), &peer_secid);
|
||||
selinux_inode_getsecid(SOCK_INODE(sock), &peer_secid);
|
||||
else if (skb)
|
||||
selinux_skb_peerlbl_sid(skb, family, &peer_secid);
|
||||
|
||||
|
|
@ -5026,6 +5034,12 @@ static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
|
|||
return ipc_has_perm(ipcp, av);
|
||||
}
|
||||
|
||||
static void selinux_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
|
||||
{
|
||||
struct ipc_security_struct *isec = ipcp->security;
|
||||
*secid = isec->sid;
|
||||
}
|
||||
|
||||
/* module stacking operations */
|
||||
static int selinux_register_security (const char *name, struct security_operations *ops)
|
||||
{
|
||||
|
|
@ -5281,6 +5295,8 @@ static int selinux_key_permission(key_ref_t key_ref,
|
|||
#endif
|
||||
|
||||
static struct security_operations selinux_ops = {
|
||||
.name = "selinux",
|
||||
|
||||
.ptrace = selinux_ptrace,
|
||||
.capget = selinux_capget,
|
||||
.capset_check = selinux_capset_check,
|
||||
|
|
@ -5342,6 +5358,7 @@ static struct security_operations selinux_ops = {
|
|||
.inode_listsecurity = selinux_inode_listsecurity,
|
||||
.inode_need_killpriv = selinux_inode_need_killpriv,
|
||||
.inode_killpriv = selinux_inode_killpriv,
|
||||
.inode_getsecid = selinux_inode_getsecid,
|
||||
|
||||
.file_permission = selinux_file_permission,
|
||||
.file_alloc_security = selinux_file_alloc_security,
|
||||
|
|
@ -5382,6 +5399,7 @@ static struct security_operations selinux_ops = {
|
|||
.task_to_inode = selinux_task_to_inode,
|
||||
|
||||
.ipc_permission = selinux_ipc_permission,
|
||||
.ipc_getsecid = selinux_ipc_getsecid,
|
||||
|
||||
.msg_msg_alloc_security = selinux_msg_msg_alloc_security,
|
||||
.msg_msg_free_security = selinux_msg_msg_free_security,
|
||||
|
|
@ -5463,12 +5481,24 @@ static struct security_operations selinux_ops = {
|
|||
.key_free = selinux_key_free,
|
||||
.key_permission = selinux_key_permission,
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_AUDIT
|
||||
.audit_rule_init = selinux_audit_rule_init,
|
||||
.audit_rule_known = selinux_audit_rule_known,
|
||||
.audit_rule_match = selinux_audit_rule_match,
|
||||
.audit_rule_free = selinux_audit_rule_free,
|
||||
#endif
|
||||
};
|
||||
|
||||
static __init int selinux_init(void)
|
||||
{
|
||||
struct task_security_struct *tsec;
|
||||
|
||||
if (!security_module_enable(&selinux_ops)) {
|
||||
selinux_enabled = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!selinux_enabled) {
|
||||
printk(KERN_INFO "SELinux: Disabled at boot.\n");
|
||||
return 0;
|
||||
|
|
|
|||
65
security/selinux/include/audit.h
Normal file
65
security/selinux/include/audit.h
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* SELinux support for the Audit LSM hooks
|
||||
*
|
||||
* Most of below header was moved from include/linux/selinux.h which
|
||||
* is released under below copyrights:
|
||||
*
|
||||
* Author: James Morris <jmorris@redhat.com>
|
||||
*
|
||||
* Copyright (C) 2005 Red Hat, Inc., James Morris <jmorris@redhat.com>
|
||||
* Copyright (C) 2006 Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com>
|
||||
* Copyright (C) 2006 IBM Corporation, Timothy R. Chavez <tinytim@us.ibm.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2,
|
||||
* as published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef _SELINUX_AUDIT_H
|
||||
#define _SELINUX_AUDIT_H
|
||||
|
||||
/**
|
||||
* selinux_audit_rule_init - alloc/init an selinux audit rule structure.
|
||||
* @field: the field this rule refers to
|
||||
* @op: the operater the rule uses
|
||||
* @rulestr: the text "target" of the rule
|
||||
* @rule: pointer to the new rule structure returned via this
|
||||
*
|
||||
* Returns 0 if successful, -errno if not. On success, the rule structure
|
||||
* will be allocated internally. The caller must free this structure with
|
||||
* selinux_audit_rule_free() after use.
|
||||
*/
|
||||
int selinux_audit_rule_init(u32 field, u32 op, char *rulestr, void **rule);
|
||||
|
||||
/**
|
||||
* selinux_audit_rule_free - free an selinux audit rule structure.
|
||||
* @rule: pointer to the audit rule to be freed
|
||||
*
|
||||
* This will free all memory associated with the given rule.
|
||||
* If @rule is NULL, no operation is performed.
|
||||
*/
|
||||
void selinux_audit_rule_free(void *rule);
|
||||
|
||||
/**
|
||||
* selinux_audit_rule_match - determine if a context ID matches a rule.
|
||||
* @sid: the context ID to check
|
||||
* @field: the field this rule refers to
|
||||
* @op: the operater the rule uses
|
||||
* @rule: pointer to the audit rule to check against
|
||||
* @actx: the audit context (can be NULL) associated with the check
|
||||
*
|
||||
* Returns 1 if the context id matches the rule, 0 if it does not, and
|
||||
* -errno on failure.
|
||||
*/
|
||||
int selinux_audit_rule_match(u32 sid, u32 field, u32 op, void *rule,
|
||||
struct audit_context *actx);
|
||||
|
||||
/**
|
||||
* selinux_audit_rule_known - check to see if rule contains selinux fields.
|
||||
* @rule: rule to be checked
|
||||
* Returns 1 if there are selinux fields specified in the rule, 0 otherwise.
|
||||
*/
|
||||
int selinux_audit_rule_known(struct audit_krule *krule);
|
||||
|
||||
#endif /* _SELINUX_AUDIT_H */
|
||||
|
||||
|
|
@ -57,6 +57,7 @@
|
|||
#include "netlabel.h"
|
||||
#include "xfrm.h"
|
||||
#include "ebitmap.h"
|
||||
#include "audit.h"
|
||||
|
||||
extern void selnl_notify_policyload(u32 seqno);
|
||||
unsigned int policydb_loaded_version;
|
||||
|
|
@ -2296,21 +2297,23 @@ struct selinux_audit_rule {
|
|||
struct context au_ctxt;
|
||||
};
|
||||
|
||||
void selinux_audit_rule_free(struct selinux_audit_rule *rule)
|
||||
void selinux_audit_rule_free(void *vrule)
|
||||
{
|
||||
struct selinux_audit_rule *rule = vrule;
|
||||
|
||||
if (rule) {
|
||||
context_destroy(&rule->au_ctxt);
|
||||
kfree(rule);
|
||||
}
|
||||
}
|
||||
|
||||
int selinux_audit_rule_init(u32 field, u32 op, char *rulestr,
|
||||
struct selinux_audit_rule **rule)
|
||||
int selinux_audit_rule_init(u32 field, u32 op, char *rulestr, void **vrule)
|
||||
{
|
||||
struct selinux_audit_rule *tmprule;
|
||||
struct role_datum *roledatum;
|
||||
struct type_datum *typedatum;
|
||||
struct user_datum *userdatum;
|
||||
struct selinux_audit_rule **rule = (struct selinux_audit_rule **)vrule;
|
||||
int rc = 0;
|
||||
|
||||
*rule = NULL;
|
||||
|
|
@ -2397,12 +2400,37 @@ int selinux_audit_rule_init(u32 field, u32 op, char *rulestr,
|
|||
return rc;
|
||||
}
|
||||
|
||||
int selinux_audit_rule_match(u32 sid, u32 field, u32 op,
|
||||
struct selinux_audit_rule *rule,
|
||||
/* Check to see if the rule contains any selinux fields */
|
||||
int selinux_audit_rule_known(struct audit_krule *rule)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < rule->field_count; i++) {
|
||||
struct audit_field *f = &rule->fields[i];
|
||||
switch (f->type) {
|
||||
case AUDIT_SUBJ_USER:
|
||||
case AUDIT_SUBJ_ROLE:
|
||||
case AUDIT_SUBJ_TYPE:
|
||||
case AUDIT_SUBJ_SEN:
|
||||
case AUDIT_SUBJ_CLR:
|
||||
case AUDIT_OBJ_USER:
|
||||
case AUDIT_OBJ_ROLE:
|
||||
case AUDIT_OBJ_TYPE:
|
||||
case AUDIT_OBJ_LEV_LOW:
|
||||
case AUDIT_OBJ_LEV_HIGH:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int selinux_audit_rule_match(u32 sid, u32 field, u32 op, void *vrule,
|
||||
struct audit_context *actx)
|
||||
{
|
||||
struct context *ctxt;
|
||||
struct mls_level *level;
|
||||
struct selinux_audit_rule *rule = vrule;
|
||||
int match = 0;
|
||||
|
||||
if (!rule) {
|
||||
|
|
@ -2509,7 +2537,7 @@ out:
|
|||
return match;
|
||||
}
|
||||
|
||||
static int (*aurule_callback)(void) = NULL;
|
||||
static int (*aurule_callback)(void) = audit_update_lsm_rules;
|
||||
|
||||
static int aurule_avc_callback(u32 event, u32 ssid, u32 tsid,
|
||||
u16 class, u32 perms, u32 *retained)
|
||||
|
|
@ -2534,11 +2562,6 @@ static int __init aurule_init(void)
|
|||
}
|
||||
__initcall(aurule_init);
|
||||
|
||||
void selinux_audit_set_callback(int (*callback)(void))
|
||||
{
|
||||
aurule_callback = callback;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NETLABEL
|
||||
/**
|
||||
* security_netlbl_cache_add - Add an entry to the NetLabel cache
|
||||
|
|
|
|||
Loading…
Reference in a new issue