forked from spotify/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This patch creates auditing functions usable by LSM to audit security events. It provides standard dumping of FS, NET, task etc ... events (code borrowed from SELinux) and provides 2 callbacks to define LSM specific auditing, which should be flexible enough to convert SELinux too. Signed-off-by: Etienne Basset <[email protected]> Acked-by: Casey Schaufler <[email protected]> cked-by: Eric Paris <[email protected]> Signed-off-by: James Morris <[email protected]>
- Loading branch information
Showing
2 changed files
with
497 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
/* | ||
* Common LSM logging functions | ||
* Heavily borrowed from selinux/avc.h | ||
* | ||
* Author : Etienne BASSET <[email protected]> | ||
* | ||
* All credits to : Stephen Smalley, <[email protected]> | ||
* All BUGS to : Etienne BASSET <[email protected]> | ||
*/ | ||
#ifndef _LSM_COMMON_LOGGING_ | ||
#define _LSM_COMMON_LOGGING_ | ||
|
||
#include <linux/stddef.h> | ||
#include <linux/errno.h> | ||
#include <linux/kernel.h> | ||
#include <linux/kdev_t.h> | ||
#include <linux/spinlock.h> | ||
#include <linux/init.h> | ||
#include <linux/audit.h> | ||
#include <linux/in6.h> | ||
#include <linux/path.h> | ||
#include <linux/key.h> | ||
#include <linux/skbuff.h> | ||
#include <asm/system.h> | ||
|
||
|
||
/* Auxiliary data to use in generating the audit record. */ | ||
struct common_audit_data { | ||
char type; | ||
#define LSM_AUDIT_DATA_FS 1 | ||
#define LSM_AUDIT_DATA_NET 2 | ||
#define LSM_AUDIT_DATA_CAP 3 | ||
#define LSM_AUDIT_DATA_IPC 4 | ||
#define LSM_AUDIT_DATA_TASK 5 | ||
#define LSM_AUDIT_DATA_KEY 6 | ||
struct task_struct *tsk; | ||
union { | ||
struct { | ||
struct path path; | ||
struct inode *inode; | ||
} fs; | ||
struct { | ||
int netif; | ||
struct sock *sk; | ||
u16 family; | ||
__be16 dport; | ||
__be16 sport; | ||
union { | ||
struct { | ||
__be32 daddr; | ||
__be32 saddr; | ||
} v4; | ||
struct { | ||
struct in6_addr daddr; | ||
struct in6_addr saddr; | ||
} v6; | ||
} fam; | ||
} net; | ||
int cap; | ||
int ipc_id; | ||
struct task_struct *tsk; | ||
#ifdef CONFIG_KEYS | ||
struct { | ||
key_serial_t key; | ||
char *key_desc; | ||
} key_struct; | ||
#endif | ||
} u; | ||
const char *function; | ||
/* this union contains LSM specific data */ | ||
union { | ||
/* SMACK data */ | ||
struct smack_audit_data { | ||
char *subject; | ||
char *object; | ||
char *request; | ||
int result; | ||
} smack_audit_data; | ||
/* SELinux data */ | ||
struct { | ||
u32 ssid; | ||
u32 tsid; | ||
u16 tclass; | ||
u32 requested; | ||
u32 audited; | ||
struct av_decision *avd; | ||
int result; | ||
} selinux_audit_data; | ||
} lsm_priv; | ||
/* these callback will be implemented by a specific LSM */ | ||
void (*lsm_pre_audit)(struct audit_buffer *, void *); | ||
void (*lsm_post_audit)(struct audit_buffer *, void *); | ||
}; | ||
|
||
#define v4info fam.v4 | ||
#define v6info fam.v6 | ||
|
||
int ipv4_skb_to_auditdata(struct sk_buff *skb, | ||
struct common_audit_data *ad, u8 *proto); | ||
|
||
int ipv6_skb_to_auditdata(struct sk_buff *skb, | ||
struct common_audit_data *ad, u8 *proto); | ||
|
||
/* Initialize an LSM audit data structure. */ | ||
#define COMMON_AUDIT_DATA_INIT(_d, _t) \ | ||
{ memset((_d), 0, sizeof(struct common_audit_data)); \ | ||
(_d)->type = LSM_AUDIT_DATA_##_t; (_d)->function = __func__; } | ||
|
||
void common_lsm_audit(struct common_audit_data *a); | ||
|
||
#endif |
Oops, something went wrong.