1/* 2 * Common LSM logging functions 3 * Heavily borrowed from selinux/avc.h 4 * 5 * Author : Etienne BASSET <etienne.basset@ensta.org> 6 * 7 * All credits to : Stephen Smalley, <sds@epoch.ncsc.mil> 8 * All BUGS to : Etienne BASSET <etienne.basset@ensta.org> 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. */ 28struct 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 struct task_struct *tsk; 38 union { 39 struct { 40 struct path path; 41 struct inode *inode; 42 } fs; 43 struct { 44 int netif; 45 struct sock *sk; 46 u16 family; 47 __be16 dport; 48 __be16 sport; 49 union { 50 struct { 51 __be32 daddr; 52 __be32 saddr; 53 } v4; 54 struct { 55 struct in6_addr daddr; 56 struct in6_addr saddr; 57 } v6; 58 } fam; 59 } net; 60 int cap; 61 int ipc_id; 62 struct task_struct *tsk; 63#ifdef CONFIG_KEYS 64 struct { 65 key_serial_t key; 66 char *key_desc; 67 } key_struct; 68#endif 69 } u; 70 /* this union contains LSM specific data */ 71 union { 72#ifdef CONFIG_SECURITY_SMACK 73 /* SMACK data */ 74 struct smack_audit_data { 75 const char *function; 76 char *subject; 77 char *object; 78 char *request; 79 int result; 80 } smack_audit_data; 81#endif 82#ifdef CONFIG_SECURITY_SELINUX 83 /* SELinux data */ 84 struct { 85 u32 ssid; 86 u32 tsid; 87 u16 tclass; 88 u32 requested; 89 u32 audited; 90 u32 denied; 91 struct av_decision *avd; 92 int result; 93 } selinux_audit_data; 94#endif 95 }; 96 /* these callback will be implemented by a specific LSM */ 97 void (*lsm_pre_audit)(struct audit_buffer *, void *); 98 void (*lsm_post_audit)(struct audit_buffer *, void *); 99}; 100 101#define v4info fam.v4 102#define v6info fam.v6 103 104int ipv4_skb_to_auditdata(struct sk_buff *skb, 105 struct common_audit_data *ad, u8 *proto); 106 107int ipv6_skb_to_auditdata(struct sk_buff *skb, 108 struct common_audit_data *ad, u8 *proto); 109 110/* Initialize an LSM audit data structure. */ 111#define COMMON_AUDIT_DATA_INIT(_d, _t) \ 112 { memset((_d), 0, sizeof(struct common_audit_data)); \ 113 (_d)->type = LSM_AUDIT_DATA_##_t; } 114 115void common_lsm_audit(struct common_audit_data *a); 116 117#endif 118