1 /* 2 * Common LSM logging functions 3 * Heavily borrowed from selinux/avc.h 4 * 5 * Author : Etienne BASSET <[email protected]> 6 * 7 * All credits to : Stephen Smalley, <[email protected]> 8 * All BUGS to : Etienne BASSET <[email protected]> 9 */ 10 #ifndef _LSM_COMMON_LOGGING_ 11 #define _LSM_COMMON_LOGGING_ 12 13 #include <linux/stddef.h> 14 #include <linux/errno.h> 15 #include <linux/kernel.h> 16 #include <linux/kdev_t.h> 17 #include <linux/spinlock.h> 18 #include <linux/init.h> 19 #include <linux/audit.h> 20 #include <linux/in6.h> 21 #include <linux/path.h> 22 #include <linux/key.h> 23 #include <linux/skbuff.h> 24 #include <asm/system.h> 25 26 27 /* Auxiliary data to use in generating the audit record. */ 28 struct common_audit_data { 29 char type; 30 #define LSM_AUDIT_DATA_FS 1 31 #define LSM_AUDIT_DATA_NET 2 32 #define LSM_AUDIT_DATA_CAP 3 33 #define LSM_AUDIT_DATA_IPC 4 34 #define LSM_AUDIT_DATA_TASK 5 35 #define LSM_AUDIT_DATA_KEY 6 36 #define LSM_AUDIT_NO_AUDIT 7 37 #define LSM_AUDIT_DATA_KMOD 8 38 struct task_struct *tsk; 39 union { 40 struct { 41 struct path path; 42 struct inode *inode; 43 } fs; 44 struct { 45 int netif; 46 struct sock *sk; 47 u16 family; 48 __be16 dport; 49 __be16 sport; 50 union { 51 struct { 52 __be32 daddr; 53 __be32 saddr; 54 } v4; 55 struct { 56 struct in6_addr daddr; 57 struct in6_addr saddr; 58 } v6; 59 } fam; 60 } net; 61 int cap; 62 int ipc_id; 63 struct task_struct *tsk; 64 #ifdef CONFIG_KEYS 65 struct { 66 key_serial_t key; 67 char *key_desc; 68 } key_struct; 69 #endif 70 char *kmod_name; 71 } u; 72 /* this union contains LSM specific data */ 73 union { 74 #ifdef CONFIG_SECURITY_SMACK 75 /* SMACK data */ 76 struct smack_audit_data { 77 const char *function; 78 char *subject; 79 char *object; 80 char *request; 81 int result; 82 } smack_audit_data; 83 #endif 84 #ifdef CONFIG_SECURITY_SELINUX 85 /* SELinux data */ 86 struct { 87 u32 ssid; 88 u32 tsid; 89 u16 tclass; 90 u32 requested; 91 u32 audited; 92 u32 denied; 93 struct av_decision *avd; 94 int result; 95 } selinux_audit_data; 96 #endif 97 }; 98 /* these callback will be implemented by a specific LSM */ 99 void (*lsm_pre_audit)(struct audit_buffer *, void *); 100 void (*lsm_post_audit)(struct audit_buffer *, void *); 101 }; 102 103 #define v4info fam.v4 104 #define v6info fam.v6 105 106 int ipv4_skb_to_auditdata(struct sk_buff *skb, 107 struct common_audit_data *ad, u8 *proto); 108 109 int ipv6_skb_to_auditdata(struct sk_buff *skb, 110 struct common_audit_data *ad, u8 *proto); 111 112 /* Initialize an LSM audit data structure. */ 113 #define COMMON_AUDIT_DATA_INIT(_d, _t) \ 114 { memset((_d), 0, sizeof(struct common_audit_data)); \ 115 (_d)->type = LSM_AUDIT_DATA_##_t; } 116 117 void common_lsm_audit(struct common_audit_data *a); 118 119 #endif 120