1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* audit -- definition of audit_context structure and supporting types 3 * 4 * Copyright 2003-2004 Red Hat, Inc. 5 * Copyright 2005 Hewlett-Packard Development Company, L.P. 6 * Copyright 2005 IBM Corporation 7 */ 8 9 #ifndef _KERNEL_AUDIT_H_ 10 #define _KERNEL_AUDIT_H_ 11 12 #include <linux/fs.h> 13 #include <linux/audit.h> 14 #include <linux/skbuff.h> 15 #include <uapi/linux/mqueue.h> 16 #include <linux/tty.h> 17 18 /* AUDIT_NAMES is the number of slots we reserve in the audit_context 19 * for saving names from getname(). If we get more names we will allocate 20 * a name dynamically and also add those to the list anchored by names_list. */ 21 #define AUDIT_NAMES 5 22 23 /* At task start time, the audit_state is set in the audit_context using 24 a per-task filter. At syscall entry, the audit_state is augmented by 25 the syscall filter. */ 26 enum audit_state { 27 AUDIT_STATE_DISABLED, /* Do not create per-task audit_context. 28 * No syscall-specific audit records can 29 * be generated. */ 30 AUDIT_STATE_BUILD, /* Create the per-task audit_context, 31 * and fill it in at syscall 32 * entry time. This makes a full 33 * syscall record available if some 34 * other part of the kernel decides it 35 * should be recorded. */ 36 AUDIT_STATE_RECORD /* Create the per-task audit_context, 37 * always fill it in at syscall entry 38 * time, and always write out the audit 39 * record at syscall exit time. */ 40 }; 41 42 /* Rule lists */ 43 struct audit_watch; 44 struct audit_fsnotify_mark; 45 struct audit_tree; 46 struct audit_chunk; 47 48 struct audit_entry { 49 struct list_head list; 50 struct rcu_head rcu; 51 struct audit_krule rule; 52 }; 53 54 struct audit_cap_data { 55 kernel_cap_t permitted; 56 kernel_cap_t inheritable; 57 union { 58 unsigned int fE; /* effective bit of file cap */ 59 kernel_cap_t effective; /* effective set of process */ 60 }; 61 kernel_cap_t ambient; 62 kuid_t rootid; 63 }; 64 65 /* When fs/namei.c:getname() is called, we store the pointer in name and bump 66 * the refcnt in the associated filename struct. 67 * 68 * Further, in fs/namei.c:path_lookup() we store the inode and device. 69 */ 70 struct audit_names { 71 struct list_head list; /* audit_context->names_list */ 72 73 struct filename *name; 74 int name_len; /* number of chars to log */ 75 bool hidden; /* don't log this record */ 76 77 unsigned long ino; 78 dev_t dev; 79 umode_t mode; 80 kuid_t uid; 81 kgid_t gid; 82 dev_t rdev; 83 u32 osid; 84 struct audit_cap_data fcap; 85 unsigned int fcap_ver; 86 unsigned char type; /* record type */ 87 /* 88 * This was an allocated audit_names and not from the array of 89 * names allocated in the task audit context. Thus this name 90 * should be freed on syscall exit. 91 */ 92 bool should_free; 93 }; 94 95 struct audit_proctitle { 96 int len; /* length of the cmdline field. */ 97 char *value; /* the cmdline field */ 98 }; 99 100 /* The per-task audit context. */ 101 struct audit_context { 102 int dummy; /* must be the first element */ 103 enum { 104 AUDIT_CTX_UNUSED, /* audit_context is currently unused */ 105 AUDIT_CTX_SYSCALL, /* in use by syscall */ 106 AUDIT_CTX_URING, /* in use by io_uring */ 107 } context; 108 enum audit_state state, current_state; 109 unsigned int serial; /* serial number for record */ 110 int major; /* syscall number */ 111 int uring_op; /* uring operation */ 112 struct timespec64 ctime; /* time of syscall entry */ 113 unsigned long argv[4]; /* syscall arguments */ 114 long return_code;/* syscall return code */ 115 u64 prio; 116 int return_valid; /* return code is valid */ 117 /* 118 * The names_list is the list of all audit_names collected during this 119 * syscall. The first AUDIT_NAMES entries in the names_list will 120 * actually be from the preallocated_names array for performance 121 * reasons. Except during allocation they should never be referenced 122 * through the preallocated_names array and should only be found/used 123 * by running the names_list. 124 */ 125 struct audit_names preallocated_names[AUDIT_NAMES]; 126 int name_count; /* total records in names_list */ 127 struct list_head names_list; /* struct audit_names->list anchor */ 128 char *filterkey; /* key for rule that triggered record */ 129 struct path pwd; 130 struct audit_aux_data *aux; 131 struct audit_aux_data *aux_pids; 132 struct sockaddr_storage *sockaddr; 133 size_t sockaddr_len; 134 /* Save things to print about task_struct */ 135 pid_t pid, ppid; 136 kuid_t uid, euid, suid, fsuid; 137 kgid_t gid, egid, sgid, fsgid; 138 unsigned long personality; 139 int arch; 140 141 pid_t target_pid; 142 kuid_t target_auid; 143 kuid_t target_uid; 144 unsigned int target_sessionid; 145 u32 target_sid; 146 char target_comm[TASK_COMM_LEN]; 147 148 struct audit_tree_refs *trees, *first_trees; 149 struct list_head killed_trees; 150 int tree_count; 151 152 int type; 153 union { 154 struct { 155 int nargs; 156 long args[6]; 157 } socketcall; 158 struct { 159 kuid_t uid; 160 kgid_t gid; 161 umode_t mode; 162 u32 osid; 163 int has_perm; 164 uid_t perm_uid; 165 gid_t perm_gid; 166 umode_t perm_mode; 167 unsigned long qbytes; 168 } ipc; 169 struct { 170 mqd_t mqdes; 171 struct mq_attr mqstat; 172 } mq_getsetattr; 173 struct { 174 mqd_t mqdes; 175 int sigev_signo; 176 } mq_notify; 177 struct { 178 mqd_t mqdes; 179 size_t msg_len; 180 unsigned int msg_prio; 181 struct timespec64 abs_timeout; 182 } mq_sendrecv; 183 struct { 184 int oflag; 185 umode_t mode; 186 struct mq_attr attr; 187 } mq_open; 188 struct { 189 pid_t pid; 190 struct audit_cap_data cap; 191 } capset; 192 struct { 193 int fd; 194 int flags; 195 } mmap; 196 struct { 197 int argc; 198 } execve; 199 struct { 200 char *name; 201 } module; 202 }; 203 int fds[2]; 204 struct audit_proctitle proctitle; 205 }; 206 207 extern bool audit_ever_enabled; 208 209 extern void audit_log_session_info(struct audit_buffer *ab); 210 211 extern int auditd_test_task(struct task_struct *task); 212 213 #define AUDIT_INODE_BUCKETS 32 214 extern struct list_head audit_inode_hash[AUDIT_INODE_BUCKETS]; 215 216 static inline int audit_hash_ino(u32 ino) 217 { 218 return (ino & (AUDIT_INODE_BUCKETS-1)); 219 } 220 221 /* Indicates that audit should log the full pathname. */ 222 #define AUDIT_NAME_FULL -1 223 224 extern int audit_match_class(int class, unsigned syscall); 225 extern int audit_comparator(const u32 left, const u32 op, const u32 right); 226 extern int audit_uid_comparator(kuid_t left, u32 op, kuid_t right); 227 extern int audit_gid_comparator(kgid_t left, u32 op, kgid_t right); 228 extern int parent_len(const char *path); 229 extern int audit_compare_dname_path(const struct qstr *dname, const char *path, int plen); 230 extern struct sk_buff *audit_make_reply(int seq, int type, int done, int multi, 231 const void *payload, int size); 232 extern void audit_panic(const char *message); 233 234 struct audit_netlink_list { 235 __u32 portid; 236 struct net *net; 237 struct sk_buff_head q; 238 }; 239 240 int audit_send_list_thread(void *_dest); 241 242 extern int selinux_audit_rule_update(void); 243 244 extern struct mutex audit_filter_mutex; 245 extern int audit_del_rule(struct audit_entry *entry); 246 extern void audit_free_rule_rcu(struct rcu_head *head); 247 extern struct list_head audit_filter_list[]; 248 249 extern struct audit_entry *audit_dupe_rule(struct audit_krule *old); 250 251 extern void audit_log_d_path_exe(struct audit_buffer *ab, 252 struct mm_struct *mm); 253 254 extern struct tty_struct *audit_get_tty(void); 255 extern void audit_put_tty(struct tty_struct *tty); 256 257 /* audit watch/mark/tree functions */ 258 #ifdef CONFIG_AUDITSYSCALL 259 extern unsigned int audit_serial(void); 260 extern int auditsc_get_stamp(struct audit_context *ctx, 261 struct timespec64 *t, unsigned int *serial); 262 263 extern void audit_put_watch(struct audit_watch *watch); 264 extern void audit_get_watch(struct audit_watch *watch); 265 extern int audit_to_watch(struct audit_krule *krule, char *path, int len, 266 u32 op); 267 extern int audit_add_watch(struct audit_krule *krule, struct list_head **list); 268 extern void audit_remove_watch_rule(struct audit_krule *krule); 269 extern char *audit_watch_path(struct audit_watch *watch); 270 extern int audit_watch_compare(struct audit_watch *watch, unsigned long ino, 271 dev_t dev); 272 273 extern struct audit_fsnotify_mark *audit_alloc_mark(struct audit_krule *krule, 274 char *pathname, int len); 275 extern char *audit_mark_path(struct audit_fsnotify_mark *mark); 276 extern void audit_remove_mark(struct audit_fsnotify_mark *audit_mark); 277 extern void audit_remove_mark_rule(struct audit_krule *krule); 278 extern int audit_mark_compare(struct audit_fsnotify_mark *mark, 279 unsigned long ino, dev_t dev); 280 extern int audit_dupe_exe(struct audit_krule *new, struct audit_krule *old); 281 extern int audit_exe_compare(struct task_struct *tsk, 282 struct audit_fsnotify_mark *mark); 283 284 extern struct audit_chunk *audit_tree_lookup(const struct inode *inode); 285 extern void audit_put_chunk(struct audit_chunk *chunk); 286 extern bool audit_tree_match(struct audit_chunk *chunk, 287 struct audit_tree *tree); 288 extern int audit_make_tree(struct audit_krule *rule, char *pathname, u32 op); 289 extern int audit_add_tree_rule(struct audit_krule *rule); 290 extern int audit_remove_tree_rule(struct audit_krule *rule); 291 extern void audit_trim_trees(void); 292 extern int audit_tag_tree(char *old, char *new); 293 extern const char *audit_tree_path(struct audit_tree *tree); 294 extern void audit_put_tree(struct audit_tree *tree); 295 extern void audit_kill_trees(struct audit_context *context); 296 297 extern int audit_signal_info_syscall(struct task_struct *t); 298 extern void audit_filter_inodes(struct task_struct *tsk, 299 struct audit_context *ctx); 300 extern struct list_head *audit_killed_trees(void); 301 #else /* CONFIG_AUDITSYSCALL */ 302 #define auditsc_get_stamp(c, t, s) 0 303 #define audit_put_watch(w) do { } while (0) 304 #define audit_get_watch(w) do { } while (0) 305 #define audit_to_watch(k, p, l, o) (-EINVAL) 306 #define audit_add_watch(k, l) (-EINVAL) 307 #define audit_remove_watch_rule(k) BUG() 308 #define audit_watch_path(w) "" 309 #define audit_watch_compare(w, i, d) 0 310 311 #define audit_alloc_mark(k, p, l) (ERR_PTR(-EINVAL)) 312 #define audit_mark_path(m) "" 313 #define audit_remove_mark(m) do { } while (0) 314 #define audit_remove_mark_rule(k) do { } while (0) 315 #define audit_mark_compare(m, i, d) 0 316 #define audit_exe_compare(t, m) (-EINVAL) 317 #define audit_dupe_exe(n, o) (-EINVAL) 318 319 #define audit_remove_tree_rule(rule) BUG() 320 #define audit_add_tree_rule(rule) -EINVAL 321 #define audit_make_tree(rule, str, op) -EINVAL 322 #define audit_trim_trees() do { } while (0) 323 #define audit_put_tree(tree) do { } while (0) 324 #define audit_tag_tree(old, new) -EINVAL 325 #define audit_tree_path(rule) "" /* never called */ 326 #define audit_kill_trees(context) BUG() 327 328 static inline int audit_signal_info_syscall(struct task_struct *t) 329 { 330 return 0; 331 } 332 333 #define audit_filter_inodes(t, c) AUDIT_STATE_DISABLED 334 #endif /* CONFIG_AUDITSYSCALL */ 335 336 extern char *audit_unpack_string(void **bufp, size_t *remain, size_t len); 337 338 extern int audit_filter(int msgtype, unsigned int listtype); 339 340 extern void audit_ctl_lock(void); 341 extern void audit_ctl_unlock(void); 342 343 #endif 344