1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * adt_xlate.h 23 * 24 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. 25 * 26 */ 27 28 #ifndef _BSM_XLATE_H 29 #define _BSM_XLATE_H 30 31 #include <priv.h> 32 33 #include <bsm/libbsm.h> 34 35 #include <tsol/label.h> 36 37 #include "adt_event.h" 38 39 #ifdef __cplusplus 40 extern "C" { 41 #endif 42 43 #ifndef TEXT_DOMAIN 44 #define TEXT_DOMAIN "SYS_TEST" 45 #endif 46 47 /* 48 * values for adt_session_model 49 * In the session model, the session and process are unrelated, so 50 * such things as the supplementary group token make no sense. In 51 * the process model, the process and session are the same. 52 */ 53 #define ADT_SESSION_MODEL 1 54 #define ADT_PROCESS_MODEL 0 55 56 #define ADT_HAVE_MASK 0x01 57 #define ADT_HAVE_TID 0x02 58 #define ADT_HAVE_AUID 0x04 59 #define ADT_HAVE_ASID 0x08 60 #define ADT_HAVE_IDS 0x10 61 #define ADT_HAVE_ALL (uint32_t)\ 62 (ADT_HAVE_MASK | ADT_HAVE_TID | ADT_HAVE_AUID | ADT_HAVE_ASID |\ 63 ADT_HAVE_IDS) 64 65 /* 66 * dummy token types for privilege 67 */ 68 #define ADT_AUT_PRIV_L -100 /* limit set */ 69 #define ADT_AUT_PRIV_I -101 /* inherited set */ 70 #define ADT_AUT_PRIV_E -102 /* effective set */ 71 #define ADT_CMD_ALT -103 /* dummy token type for alternate command */ 72 #define ADT_IN_PEER -104 /* peer address in_addr and in_port */ 73 #define ADT_IN_REMOTE -105 /* specified address in_addr */ 74 75 enum adt_generic {ADT_GENERIC}; /* base for text enums */ 76 77 typedef struct adt_internal_state adt_internal_state_t; 78 79 union union_of_events { 80 union adt_event_data d0; 81 }; 82 83 /* 84 * The order of the lists MUST match the order in 85 * struct msg_text adt_msg_text that is generated by 86 * auditxml in adt_xlate.c. 87 */ 88 enum adt_msg_list { 89 ADT_LIST_FAIL_PAM, 90 ADT_LIST_FAIL_VALUE, 91 ADT_LIST_LOGIN_TEXT, 92 ADT_LIST_TPM_E, 93 ADT_LIST_UADMIN_FCN}; 94 95 enum datatype {ADT_UNDEFINED = 0, 96 ADT_DATE, 97 ADT_MSG, 98 ADT_UINT, 99 ADT_INT, 100 ADT_INT32, 101 ADT_UINT16, 102 ADT_UINT32, 103 ADT_UINT32STAR, 104 ADT_UINT32ARRAY, 105 ADT_UID, 106 ADT_GID, 107 ADT_UIDSTAR, 108 ADT_GIDSTAR, 109 ADT_UINT64, 110 ADT_LONG, 111 ADT_ULONG, 112 ADT_CHAR, 113 ADT_CHARSTAR, 114 ADT_CHAR2STAR, /* char ** */ 115 ADT_PID, 116 ADT_PRIVSTAR, 117 ADT_TERMIDSTAR, 118 ADT_MLABELSTAR, 119 ADT_FD 120 }; 121 typedef enum datatype datatype_t; 122 123 union convert { 124 enum adt_generic msg_selector; 125 boolean_t tbool; 126 uint_t tuint; 127 int tint; 128 int32_t tint32; 129 uint16_t tuint16; 130 uint32_t tuint32; 131 uint64_t tuint64; 132 int32_t *tint32star; 133 uint32_t *tuint32star; 134 uid_t tuid; 135 gid_t tgid; 136 uid_t *tuidstar; 137 gid_t *tgidstar; 138 pid_t tpid; 139 long tlong; 140 ulong_t tulong; 141 char tchar; 142 char *tcharstar; 143 char **tchar2star; 144 au_tid_addr_t *ttermid; 145 priv_set_t *tprivstar; 146 m_label_t *tm_label; 147 fd_t tfd; 148 }; 149 150 struct adt_event_state { 151 union union_of_events ae_event_data; 152 153 /* above is user's area; below is internal. Order matters */ 154 155 uint_t ae_check; /* see adt_internal_state */ 156 int ae_event_handle; 157 au_event_t ae_event_id; /* external id */ 158 au_event_t ae_internal_id; /* translated */ 159 int ae_rc; /* exit token rc */ 160 int ae_type; /* exit error type */ 161 struct adt_internal_state *ae_session; 162 }; 163 164 struct datadefs { 165 datatype_t dd_datatype; /* input data type */ 166 size_t dd_input_size; /* input data size */ 167 }; 168 typedef struct datadefs datadef; 169 170 typedef void (* adt_token_func_t)(datadef *, void *, int, 171 struct adt_event_state *, char *); 172 173 typedef char *(* adt_msg_func_t)(enum adt_generic); 174 175 #define ADT_VALID 0xAAAA5555 176 177 struct adt_internal_state { 178 uint32_t as_check; /* == ADT_VALID when created, */ 179 /* == zero when freed */ 180 uid_t as_euid; 181 uid_t as_ruid; 182 gid_t as_egid; 183 gid_t as_rgid; 184 185 struct auditinfo_addr as_info; 186 /* 187 * ai_auid audit id 188 * ai_mask.am_success pre-selection mask 189 * ai_mask.am_failure 190 * ai_termid .at_port terminal id 191 * .at_type 192 * .ai_termid.at_addr[0] 193 * .ai_termid.at_addr[1] 194 * .ai_termid.at_addr[2] 195 * .ai_termid.at_addr[3] 196 * ai_asid session id 197 */ 198 int as_audit_state; /* audit state */ 199 /* 200 * data above this line is exported / imported 201 * To maintain upward compatibility, the above structures 202 * can't change, so for version 2, all changes will need 203 * to be added here and the old format (above) maintained. 204 */ 205 206 uint32_t as_have_user_data; 207 208 uint32_t as_kernel_audit_policy; 209 int as_session_model; 210 adt_session_flags_t as_flags; 211 pid_t as_pid; 212 m_label_t *as_label; /* if is_system_labeled */ 213 adt_translation_t **as_xlate; 214 void (*as_preload)(au_event_t, adt_event_data_t *); 215 }; 216 217 /* 218 * export data format 219 * version number changes when adt_internal_state's export portion 220 * changes. 221 */ 222 #define PROTOCOL_VERSION_1 1 223 #define PROTOCOL_VERSION_2 2 224 225 /* 226 * most recent version is at the top; down level consumers are 227 * expected to search down via "prev_offsetX" to a version they 228 * understand. "v1" is first, "v0" is used to illustrate correct 229 * order for future use. 230 */ 231 232 struct adt_export_v2 { 233 int32_t ax_euid; 234 int32_t ax_ruid; 235 int32_t ax_egid; 236 int32_t ax_rgid; 237 int32_t ax_auid; 238 uint32_t ax_mask_success; 239 uint32_t ax_mask_failure; 240 uint32_t ax_port; 241 uint32_t ax_type; 242 uint32_t ax_addr[4]; 243 uint32_t ax_asid; 244 int ax_audit_state; 245 pid_t ax_pid; 246 size32_t ax_label_len; /* 0, unlabeled */ 247 /* char ax_label[ax_label_len]; if, is_system_labeled */ 248 }; 249 struct adt_export_v1 { 250 int32_t ax_euid; 251 int32_t ax_ruid; 252 int32_t ax_egid; 253 int32_t ax_rgid; 254 int32_t ax_auid; 255 uint32_t ax_mask_success; 256 uint32_t ax_mask_failure; 257 uint32_t ax_port; 258 uint32_t ax_type; 259 uint32_t ax_addr[4]; 260 uint32_t ax_asid; 261 int ax_audit_state; 262 uint32_t ax_size_of_tsol_data; /* zero for non-TSOL systems */ 263 }; 264 struct export_link { 265 int32_t ax_version; 266 int32_t ax_offset; 267 }; 268 struct export_header { 269 uint32_t ax_check; 270 int32_t ax_buffer_length; 271 struct export_link ax_link; 272 }; 273 274 struct adt_export_data { 275 struct export_header ax_header; 276 277 struct adt_export_v2 ax_v2; 278 /* 279 * end of version 2 data 280 */ 281 struct export_link ax_next_v1; 282 struct adt_export_v1 ax_v1; 283 /* 284 * end of version 1 data 285 * struct export_link ax_next_A; 286 * data for older version 287 * struct adt_export_v0 ax_v0; 288 */ 289 struct export_link ax_last; /* terminator */ 290 }; 291 292 /* 293 * struct entry defines rows in tables defined in adt_xlate.c 294 */ 295 296 struct entry { 297 char en_token_id; /* token id */ 298 int en_count_types; /* # of input fields for this token */ 299 datadef *en_type_def; /* field type and size of each input */ 300 struct entry *en_next_token; /* linked list pointer */ 301 size_t en_offset; /* offset into structure for input */ 302 int en_required; /* if 1, always output a token */ 303 int en_tsol; /* if 1, reserved if for TX */ 304 char *en_msg_format; /* pointer to sprintf format string */ 305 }; 306 307 struct translation { 308 int tx_offsetsCalculated; /* eponymous */ 309 au_event_t tx_external_event; /* event id, external view */ 310 au_event_t tx_internal_event; /* event id, internal view */ 311 int tx_entries; /* array size of entry array */ 312 struct entry *tx_first_entry; /* start of linked list */ 313 struct entry *tx_top_entry; /* first array element */ 314 }; 315 316 struct token_jmp { 317 long jmp_id; 318 adt_token_func_t jmp_to; 319 }; 320 321 struct msg_text { 322 int ml_min_index; 323 int ml_max_index; 324 char **ml_msg_list; 325 int ml_offset; 326 }; 327 328 extern struct msg_text adt_msg_text[]; 329 330 extern void adt_write_syslog(const char *, int); 331 extern void adt_token_open(struct adt_event_state *); 332 extern int adt_token_close(struct adt_event_state *); 333 extern void adt_generate_token(struct entry *, void *, 334 struct adt_event_state *); 335 extern void *adt_adjust_address(void *, size_t, size_t); 336 337 #ifdef __cplusplus 338 } 339 #endif 340 341 #endif /* _BSM_XLATE_H */ 342