0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _KERNEL_AUDIT_H_
0010 #define _KERNEL_AUDIT_H_
0011
0012 #include <linux/fs.h>
0013 #include <linux/audit.h>
0014 #include <linux/skbuff.h>
0015 #include <uapi/linux/mqueue.h>
0016 #include <linux/tty.h>
0017 #include <uapi/linux/openat2.h> // struct open_how
0018
0019
0020
0021
0022 #define AUDIT_NAMES 5
0023
0024
0025
0026
0027 enum audit_state {
0028 AUDIT_STATE_DISABLED,
0029
0030
0031 AUDIT_STATE_BUILD,
0032
0033
0034
0035
0036
0037 AUDIT_STATE_RECORD
0038
0039
0040
0041 };
0042
0043
0044 struct audit_watch;
0045 struct audit_fsnotify_mark;
0046 struct audit_tree;
0047 struct audit_chunk;
0048
0049 struct audit_entry {
0050 struct list_head list;
0051 struct rcu_head rcu;
0052 struct audit_krule rule;
0053 };
0054
0055 struct audit_cap_data {
0056 kernel_cap_t permitted;
0057 kernel_cap_t inheritable;
0058 union {
0059 unsigned int fE;
0060 kernel_cap_t effective;
0061 };
0062 kernel_cap_t ambient;
0063 kuid_t rootid;
0064 };
0065
0066
0067
0068
0069
0070
0071 struct audit_names {
0072 struct list_head list;
0073
0074 struct filename *name;
0075 int name_len;
0076 bool hidden;
0077
0078 unsigned long ino;
0079 dev_t dev;
0080 umode_t mode;
0081 kuid_t uid;
0082 kgid_t gid;
0083 dev_t rdev;
0084 u32 osid;
0085 struct audit_cap_data fcap;
0086 unsigned int fcap_ver;
0087 unsigned char type;
0088
0089
0090
0091
0092
0093 bool should_free;
0094 };
0095
0096 struct audit_proctitle {
0097 int len;
0098 char *value;
0099 };
0100
0101
0102 struct audit_context {
0103 int dummy;
0104 enum {
0105 AUDIT_CTX_UNUSED,
0106 AUDIT_CTX_SYSCALL,
0107 AUDIT_CTX_URING,
0108 } context;
0109 enum audit_state state, current_state;
0110 unsigned int serial;
0111 int major;
0112 int uring_op;
0113 struct timespec64 ctime;
0114 unsigned long argv[4];
0115 long return_code;
0116 u64 prio;
0117 int return_valid;
0118
0119
0120
0121
0122
0123
0124
0125
0126 struct audit_names preallocated_names[AUDIT_NAMES];
0127 int name_count;
0128 struct list_head names_list;
0129 char *filterkey;
0130 struct path pwd;
0131 struct audit_aux_data *aux;
0132 struct audit_aux_data *aux_pids;
0133 struct sockaddr_storage *sockaddr;
0134 size_t sockaddr_len;
0135
0136 pid_t pid, ppid;
0137 kuid_t uid, euid, suid, fsuid;
0138 kgid_t gid, egid, sgid, fsgid;
0139 unsigned long personality;
0140 int arch;
0141
0142 pid_t target_pid;
0143 kuid_t target_auid;
0144 kuid_t target_uid;
0145 unsigned int target_sessionid;
0146 u32 target_sid;
0147 char target_comm[TASK_COMM_LEN];
0148
0149 struct audit_tree_refs *trees, *first_trees;
0150 struct list_head killed_trees;
0151 int tree_count;
0152
0153 int type;
0154 union {
0155 struct {
0156 int nargs;
0157 long args[6];
0158 } socketcall;
0159 struct {
0160 kuid_t uid;
0161 kgid_t gid;
0162 umode_t mode;
0163 u32 osid;
0164 int has_perm;
0165 uid_t perm_uid;
0166 gid_t perm_gid;
0167 umode_t perm_mode;
0168 unsigned long qbytes;
0169 } ipc;
0170 struct {
0171 mqd_t mqdes;
0172 struct mq_attr mqstat;
0173 } mq_getsetattr;
0174 struct {
0175 mqd_t mqdes;
0176 int sigev_signo;
0177 } mq_notify;
0178 struct {
0179 mqd_t mqdes;
0180 size_t msg_len;
0181 unsigned int msg_prio;
0182 struct timespec64 abs_timeout;
0183 } mq_sendrecv;
0184 struct {
0185 int oflag;
0186 umode_t mode;
0187 struct mq_attr attr;
0188 } mq_open;
0189 struct {
0190 pid_t pid;
0191 struct audit_cap_data cap;
0192 } capset;
0193 struct {
0194 int fd;
0195 int flags;
0196 } mmap;
0197 struct open_how openat2;
0198 struct {
0199 int argc;
0200 } execve;
0201 struct {
0202 char *name;
0203 } module;
0204 struct {
0205 struct audit_ntp_data ntp_data;
0206 struct timespec64 tk_injoffset;
0207 } time;
0208 };
0209 int fds[2];
0210 struct audit_proctitle proctitle;
0211 };
0212
0213 extern bool audit_ever_enabled;
0214
0215 extern void audit_log_session_info(struct audit_buffer *ab);
0216
0217 extern int auditd_test_task(struct task_struct *task);
0218
0219 #define AUDIT_INODE_BUCKETS 32
0220 extern struct list_head audit_inode_hash[AUDIT_INODE_BUCKETS];
0221
0222 static inline int audit_hash_ino(u32 ino)
0223 {
0224 return (ino & (AUDIT_INODE_BUCKETS-1));
0225 }
0226
0227
0228 #define AUDIT_NAME_FULL -1
0229
0230 extern int audit_match_class(int class, unsigned syscall);
0231 extern int audit_comparator(const u32 left, const u32 op, const u32 right);
0232 extern int audit_uid_comparator(kuid_t left, u32 op, kuid_t right);
0233 extern int audit_gid_comparator(kgid_t left, u32 op, kgid_t right);
0234 extern int parent_len(const char *path);
0235 extern int audit_compare_dname_path(const struct qstr *dname, const char *path, int plen);
0236 extern struct sk_buff *audit_make_reply(int seq, int type, int done, int multi,
0237 const void *payload, int size);
0238 extern void audit_panic(const char *message);
0239
0240 struct audit_netlink_list {
0241 __u32 portid;
0242 struct net *net;
0243 struct sk_buff_head q;
0244 };
0245
0246 int audit_send_list_thread(void *_dest);
0247
0248 extern int selinux_audit_rule_update(void);
0249
0250 extern struct mutex audit_filter_mutex;
0251 extern int audit_del_rule(struct audit_entry *entry);
0252 extern void audit_free_rule_rcu(struct rcu_head *head);
0253 extern struct list_head audit_filter_list[];
0254
0255 extern struct audit_entry *audit_dupe_rule(struct audit_krule *old);
0256
0257 extern void audit_log_d_path_exe(struct audit_buffer *ab,
0258 struct mm_struct *mm);
0259
0260 extern struct tty_struct *audit_get_tty(void);
0261 extern void audit_put_tty(struct tty_struct *tty);
0262
0263
0264 #ifdef CONFIG_AUDITSYSCALL
0265 extern unsigned int audit_serial(void);
0266 extern int auditsc_get_stamp(struct audit_context *ctx,
0267 struct timespec64 *t, unsigned int *serial);
0268
0269 extern void audit_put_watch(struct audit_watch *watch);
0270 extern void audit_get_watch(struct audit_watch *watch);
0271 extern int audit_to_watch(struct audit_krule *krule, char *path, int len,
0272 u32 op);
0273 extern int audit_add_watch(struct audit_krule *krule, struct list_head **list);
0274 extern void audit_remove_watch_rule(struct audit_krule *krule);
0275 extern char *audit_watch_path(struct audit_watch *watch);
0276 extern int audit_watch_compare(struct audit_watch *watch, unsigned long ino,
0277 dev_t dev);
0278
0279 extern struct audit_fsnotify_mark *audit_alloc_mark(struct audit_krule *krule,
0280 char *pathname, int len);
0281 extern char *audit_mark_path(struct audit_fsnotify_mark *mark);
0282 extern void audit_remove_mark(struct audit_fsnotify_mark *audit_mark);
0283 extern void audit_remove_mark_rule(struct audit_krule *krule);
0284 extern int audit_mark_compare(struct audit_fsnotify_mark *mark,
0285 unsigned long ino, dev_t dev);
0286 extern int audit_dupe_exe(struct audit_krule *new, struct audit_krule *old);
0287 extern int audit_exe_compare(struct task_struct *tsk,
0288 struct audit_fsnotify_mark *mark);
0289
0290 extern struct audit_chunk *audit_tree_lookup(const struct inode *inode);
0291 extern void audit_put_chunk(struct audit_chunk *chunk);
0292 extern bool audit_tree_match(struct audit_chunk *chunk,
0293 struct audit_tree *tree);
0294 extern int audit_make_tree(struct audit_krule *rule, char *pathname, u32 op);
0295 extern int audit_add_tree_rule(struct audit_krule *rule);
0296 extern int audit_remove_tree_rule(struct audit_krule *rule);
0297 extern void audit_trim_trees(void);
0298 extern int audit_tag_tree(char *old, char *new);
0299 extern const char *audit_tree_path(struct audit_tree *tree);
0300 extern void audit_put_tree(struct audit_tree *tree);
0301 extern void audit_kill_trees(struct audit_context *context);
0302
0303 extern int audit_signal_info_syscall(struct task_struct *t);
0304 extern void audit_filter_inodes(struct task_struct *tsk,
0305 struct audit_context *ctx);
0306 extern struct list_head *audit_killed_trees(void);
0307 #else
0308 #define auditsc_get_stamp(c, t, s) 0
0309 #define audit_put_watch(w) do { } while (0)
0310 #define audit_get_watch(w) do { } while (0)
0311 #define audit_to_watch(k, p, l, o) (-EINVAL)
0312 #define audit_add_watch(k, l) (-EINVAL)
0313 #define audit_remove_watch_rule(k) BUG()
0314 #define audit_watch_path(w) ""
0315 #define audit_watch_compare(w, i, d) 0
0316
0317 #define audit_alloc_mark(k, p, l) (ERR_PTR(-EINVAL))
0318 #define audit_mark_path(m) ""
0319 #define audit_remove_mark(m) do { } while (0)
0320 #define audit_remove_mark_rule(k) do { } while (0)
0321 #define audit_mark_compare(m, i, d) 0
0322 #define audit_exe_compare(t, m) (-EINVAL)
0323 #define audit_dupe_exe(n, o) (-EINVAL)
0324
0325 #define audit_remove_tree_rule(rule) BUG()
0326 #define audit_add_tree_rule(rule) -EINVAL
0327 #define audit_make_tree(rule, str, op) -EINVAL
0328 #define audit_trim_trees() do { } while (0)
0329 #define audit_put_tree(tree) do { } while (0)
0330 #define audit_tag_tree(old, new) -EINVAL
0331 #define audit_tree_path(rule) ""
0332 #define audit_kill_trees(context) BUG()
0333
0334 static inline int audit_signal_info_syscall(struct task_struct *t)
0335 {
0336 return 0;
0337 }
0338
0339 #define audit_filter_inodes(t, c) AUDIT_STATE_DISABLED
0340 #endif
0341
0342 extern char *audit_unpack_string(void **bufp, size_t *remain, size_t len);
0343
0344 extern int audit_filter(int msgtype, unsigned int listtype);
0345
0346 extern void audit_ctl_lock(void);
0347 extern void audit_ctl_unlock(void);
0348
0349 #endif