Merge branch 'audit.b10' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current
* 'audit.b10' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current:
[PATCH] Audit Filter Performance
[PATCH] Rework of IPC auditing
[PATCH] More user space subject labels
[PATCH] Reworked patch for labels on user space messages
[PATCH] change lspp ipc auditing
[PATCH] audit inode patch
[PATCH] support for context based audit filtering, part 2
[PATCH] support for context based audit filtering
[PATCH] no need to wank with task_lock() and pinning task down in audit_syscall_exit()
[PATCH] drop task argument of audit_syscall_{entry,exit}
[PATCH] drop gfp_mask in audit_log_exit()
[PATCH] move call of audit_free() into do_exit()
[PATCH] sockaddr patch
[PATCH] deal with deadlocks in audit_free()
This commit is contained in:
@@ -83,6 +83,7 @@
|
||||
#define AUDIT_CONFIG_CHANGE 1305 /* Audit system configuration change */
|
||||
#define AUDIT_SOCKADDR 1306 /* sockaddr copied as syscall arg */
|
||||
#define AUDIT_CWD 1307 /* Current working directory */
|
||||
#define AUDIT_IPC_SET_PERM 1311 /* IPC new permissions record type */
|
||||
|
||||
#define AUDIT_AVC 1400 /* SE Linux avc denial or grant */
|
||||
#define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */
|
||||
@@ -145,6 +146,11 @@
|
||||
#define AUDIT_PERS 10
|
||||
#define AUDIT_ARCH 11
|
||||
#define AUDIT_MSGTYPE 12
|
||||
#define AUDIT_SE_USER 13 /* security label user */
|
||||
#define AUDIT_SE_ROLE 14 /* security label role */
|
||||
#define AUDIT_SE_TYPE 15 /* security label type */
|
||||
#define AUDIT_SE_SEN 16 /* security label sensitivity label */
|
||||
#define AUDIT_SE_CLR 17 /* security label clearance label */
|
||||
|
||||
/* These are ONLY useful when checking
|
||||
* at syscall exit time (AUDIT_AT_EXIT). */
|
||||
@@ -287,10 +293,10 @@ struct netlink_skb_parms;
|
||||
/* Public API */
|
||||
extern int audit_alloc(struct task_struct *task);
|
||||
extern void audit_free(struct task_struct *task);
|
||||
extern void audit_syscall_entry(struct task_struct *task, int arch,
|
||||
extern void audit_syscall_entry(int arch,
|
||||
int major, unsigned long a0, unsigned long a1,
|
||||
unsigned long a2, unsigned long a3);
|
||||
extern void audit_syscall_exit(struct task_struct *task, int failed, long return_code);
|
||||
extern void audit_syscall_exit(int failed, long return_code);
|
||||
extern void audit_getname(const char *name);
|
||||
extern void audit_putname(const char *name);
|
||||
extern void __audit_inode(const char *name, const struct inode *inode, unsigned flags);
|
||||
@@ -314,7 +320,8 @@ extern void auditsc_get_stamp(struct audit_context *ctx,
|
||||
struct timespec *t, unsigned int *serial);
|
||||
extern int audit_set_loginuid(struct task_struct *task, uid_t loginuid);
|
||||
extern uid_t audit_get_loginuid(struct audit_context *ctx);
|
||||
extern int audit_ipc_perms(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode, struct kern_ipc_perm *ipcp);
|
||||
extern int audit_ipc_obj(struct kern_ipc_perm *ipcp);
|
||||
extern int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode, struct kern_ipc_perm *ipcp);
|
||||
extern int audit_socketcall(int nargs, unsigned long *args);
|
||||
extern int audit_sockaddr(int len, void *addr);
|
||||
extern int audit_avc_path(struct dentry *dentry, struct vfsmount *mnt);
|
||||
@@ -323,8 +330,8 @@ extern int audit_set_macxattr(const char *name);
|
||||
#else
|
||||
#define audit_alloc(t) ({ 0; })
|
||||
#define audit_free(t) do { ; } while (0)
|
||||
#define audit_syscall_entry(t,ta,a,b,c,d,e) do { ; } while (0)
|
||||
#define audit_syscall_exit(t,f,r) do { ; } while (0)
|
||||
#define audit_syscall_entry(ta,a,b,c,d,e) do { ; } while (0)
|
||||
#define audit_syscall_exit(f,r) do { ; } while (0)
|
||||
#define audit_getname(n) do { ; } while (0)
|
||||
#define audit_putname(n) do { ; } while (0)
|
||||
#define __audit_inode(n,i,f) do { ; } while (0)
|
||||
@@ -333,7 +340,8 @@ extern int audit_set_macxattr(const char *name);
|
||||
#define audit_inode_child(d,i,p) do { ; } while (0)
|
||||
#define auditsc_get_stamp(c,t,s) do { BUG(); } while (0)
|
||||
#define audit_get_loginuid(c) ({ -1; })
|
||||
#define audit_ipc_perms(q,u,g,m,i) ({ 0; })
|
||||
#define audit_ipc_obj(i) ({ 0; })
|
||||
#define audit_ipc_set_perm(q,u,g,m,i) ({ 0; })
|
||||
#define audit_socketcall(n,a) ({ 0; })
|
||||
#define audit_sockaddr(len, addr) ({ 0; })
|
||||
#define audit_avc_path(dentry, mnt) ({ 0; })
|
||||
@@ -366,7 +374,7 @@ extern void audit_log_d_path(struct audit_buffer *ab,
|
||||
extern int audit_filter_user(struct netlink_skb_parms *cb, int type);
|
||||
extern int audit_filter_type(int type);
|
||||
extern int audit_receive_filter(int type, int pid, int uid, int seq,
|
||||
void *data, size_t datasz, uid_t loginuid);
|
||||
void *data, size_t datasz, uid_t loginuid, u32 sid);
|
||||
#else
|
||||
#define audit_log(c,g,t,f,...) do { ; } while (0)
|
||||
#define audit_log_start(c,g,t) ({ NULL; })
|
||||
|
||||
@@ -143,6 +143,7 @@ struct netlink_skb_parms
|
||||
__u32 dst_group;
|
||||
kernel_cap_t eff_cap;
|
||||
__u32 loginuid; /* Login (audit) uid */
|
||||
__u32 sid; /* SELinux security id */
|
||||
};
|
||||
|
||||
#define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb))
|
||||
|
||||
@@ -869,11 +869,6 @@ struct swap_info_struct;
|
||||
* @ipcp contains the kernel IPC permission structure
|
||||
* @flag contains the desired (requested) permission set
|
||||
* Return 0 if permission is granted.
|
||||
* @ipc_getsecurity:
|
||||
* Copy the security label associated with the ipc object into
|
||||
* @buffer. @buffer may be NULL to request the size of the buffer
|
||||
* required. @size indicates the size of @buffer in bytes. Return
|
||||
* number of bytes used/required on success.
|
||||
*
|
||||
* Security hooks for individual messages held in System V IPC message queues
|
||||
* @msg_msg_alloc_security:
|
||||
@@ -1223,7 +1218,6 @@ struct security_operations {
|
||||
void (*task_to_inode)(struct task_struct *p, struct inode *inode);
|
||||
|
||||
int (*ipc_permission) (struct kern_ipc_perm * ipcp, short flag);
|
||||
int (*ipc_getsecurity)(struct kern_ipc_perm *ipcp, void *buffer, size_t size);
|
||||
|
||||
int (*msg_msg_alloc_security) (struct msg_msg * msg);
|
||||
void (*msg_msg_free_security) (struct msg_msg * msg);
|
||||
@@ -1887,11 +1881,6 @@ static inline int security_ipc_permission (struct kern_ipc_perm *ipcp,
|
||||
return security_ops->ipc_permission (ipcp, flag);
|
||||
}
|
||||
|
||||
static inline int security_ipc_getsecurity(struct kern_ipc_perm *ipcp, void *buffer, size_t size)
|
||||
{
|
||||
return security_ops->ipc_getsecurity(ipcp, buffer, size);
|
||||
}
|
||||
|
||||
static inline int security_msg_msg_alloc (struct msg_msg * msg)
|
||||
{
|
||||
return security_ops->msg_msg_alloc_security (msg);
|
||||
@@ -2532,11 +2521,6 @@ static inline int security_ipc_permission (struct kern_ipc_perm *ipcp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int security_ipc_getsecurity(struct kern_ipc_perm *ipcp, void *buffer, size_t size)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int security_msg_msg_alloc (struct msg_msg * msg)
|
||||
{
|
||||
return 0;
|
||||
|
||||
177
include/linux/selinux.h
Normal file
177
include/linux/selinux.h
Normal file
@@ -0,0 +1,177 @@
|
||||
/*
|
||||
* SELinux services exported to the rest of the kernel.
|
||||
*
|
||||
* 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 _LINUX_SELINUX_H
|
||||
#define _LINUX_SELINUX_H
|
||||
|
||||
struct selinux_audit_rule;
|
||||
struct audit_context;
|
||||
struct inode;
|
||||
struct kern_ipc_perm;
|
||||
|
||||
#ifdef CONFIG_SECURITY_SELINUX
|
||||
|
||||
/**
|
||||
* 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,
|
||||
struct selinux_audit_rule **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(struct selinux_audit_rule *rule);
|
||||
|
||||
/**
|
||||
* selinux_audit_rule_match - determine if a context ID matches a rule.
|
||||
* @ctxid: 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 ctxid, u32 field, u32 op,
|
||||
struct selinux_audit_rule *rule,
|
||||
struct audit_context *actx);
|
||||
|
||||
/**
|
||||
* selinux_audit_set_callback - set the callback for policy reloads.
|
||||
* @callback: the function to call when the policy is reloaded
|
||||
*
|
||||
* This sets the function callback function that will update the rules
|
||||
* upon policy reloads. This callback should rebuild all existing rules
|
||||
* using selinux_audit_rule_init().
|
||||
*/
|
||||
void selinux_audit_set_callback(int (*callback)(void));
|
||||
|
||||
/**
|
||||
* selinux_task_ctxid - determine a context ID for a process.
|
||||
* @tsk: the task object
|
||||
* @ctxid: ID value returned via this
|
||||
*
|
||||
* On return, ctxid will contain an ID for the context. This value
|
||||
* should only be used opaquely.
|
||||
*/
|
||||
void selinux_task_ctxid(struct task_struct *tsk, u32 *ctxid);
|
||||
|
||||
/**
|
||||
* selinux_ctxid_to_string - map a security context ID to a string
|
||||
* @ctxid: security context ID to be converted.
|
||||
* @ctx: address of context string to be returned
|
||||
* @ctxlen: length of returned context string.
|
||||
*
|
||||
* Returns 0 if successful, -errno if not. On success, the context
|
||||
* string will be allocated internally, and the caller must call
|
||||
* kfree() on it after use.
|
||||
*/
|
||||
int selinux_ctxid_to_string(u32 ctxid, char **ctx, u32 *ctxlen);
|
||||
|
||||
/**
|
||||
* selinux_get_inode_sid - get the inode's security context ID
|
||||
* @inode: inode structure to get the sid from.
|
||||
* @sid: pointer to security context ID to be filled in.
|
||||
*
|
||||
* Returns nothing
|
||||
*/
|
||||
void selinux_get_inode_sid(const struct inode *inode, u32 *sid);
|
||||
|
||||
/**
|
||||
* selinux_get_ipc_sid - get the ipc security context ID
|
||||
* @ipcp: ipc structure to get the sid from.
|
||||
* @sid: pointer to security context ID to be filled in.
|
||||
*
|
||||
* Returns nothing
|
||||
*/
|
||||
void selinux_get_ipc_sid(const struct kern_ipc_perm *ipcp, u32 *sid);
|
||||
|
||||
/**
|
||||
* selinux_get_task_sid - return the SID of task
|
||||
* @tsk: the task whose SID will be returned
|
||||
* @sid: pointer to security context ID to be filled in.
|
||||
*
|
||||
* Returns nothing
|
||||
*/
|
||||
void selinux_get_task_sid(struct task_struct *tsk, u32 *sid);
|
||||
|
||||
|
||||
#else
|
||||
|
||||
static inline int selinux_audit_rule_init(u32 field, u32 op,
|
||||
char *rulestr,
|
||||
struct selinux_audit_rule **rule)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline void selinux_audit_rule_free(struct selinux_audit_rule *rule)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline int selinux_audit_rule_match(u32 ctxid, u32 field, u32 op,
|
||||
struct selinux_audit_rule *rule,
|
||||
struct audit_context *actx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void selinux_audit_set_callback(int (*callback)(void))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void selinux_task_ctxid(struct task_struct *tsk, u32 *ctxid)
|
||||
{
|
||||
*ctxid = 0;
|
||||
}
|
||||
|
||||
static inline int selinux_ctxid_to_string(u32 ctxid, char **ctx, u32 *ctxlen)
|
||||
{
|
||||
*ctx = NULL;
|
||||
*ctxlen = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void selinux_get_inode_sid(const struct inode *inode, u32 *sid)
|
||||
{
|
||||
*sid = 0;
|
||||
}
|
||||
|
||||
static inline void selinux_get_ipc_sid(const struct kern_ipc_perm *ipcp, u32 *sid)
|
||||
{
|
||||
*sid = 0;
|
||||
}
|
||||
|
||||
static inline void selinux_get_task_sid(struct task_struct *tsk, u32 *sid)
|
||||
{
|
||||
*sid = 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SECURITY_SELINUX */
|
||||
|
||||
#endif /* _LINUX_SELINUX_H */
|
||||
Reference in New Issue
Block a user