audit_bsm.c 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858
  1. /*
  2. * SPDX-License-Identifier: BSD-3-Clause
  3. *
  4. * Copyright (c) 1999-2009 Apple Inc.
  5. * Copyright (c) 2016-2017 Robert N. M. Watson
  6. * All rights reserved.
  7. *
  8. * Portions of this software were developed by BAE Systems, the University of
  9. * Cambridge Computer Laboratory, and Memorial University under DARPA/AFRL
  10. * contract FA8650-15-C-7558 ("CADETS"), as part of the DARPA Transparent
  11. * Computing (TC) research program.
  12. *
  13. * Redistribution and use in source and binary forms, with or without
  14. * modification, are permitted provided that the following conditions
  15. * are met:
  16. * 1. Redistributions of source code must retain the above copyright
  17. * notice, this list of conditions and the following disclaimer.
  18. * 2. Redistributions in binary form must reproduce the above copyright
  19. * notice, this list of conditions and the following disclaimer in the
  20. * documentation and/or other materials provided with the distribution.
  21. * 3. Neither the name of Apple Inc. ("Apple") nor the names of
  22. * its contributors may be used to endorse or promote products derived
  23. * from this software without specific prior written permission.
  24. *
  25. * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
  26. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  27. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  28. * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
  29. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  30. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  31. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  32. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  33. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  34. * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  35. * POSSIBILITY OF SUCH DAMAGE.
  36. */
  37. #include <sys/param.h>
  38. #include <sys/vnode.h>
  39. #include <sys/ipc.h>
  40. #include <sys/lock.h>
  41. #include <sys/malloc.h>
  42. #include <sys/mutex.h>
  43. #include <sys/socket.h>
  44. #include <sys/extattr.h>
  45. #include <sys/fcntl.h>
  46. #include <sys/user.h>
  47. #include <sys/systm.h>
  48. #include <bsm/audit.h>
  49. #include <bsm/audit_internal.h>
  50. #include <bsm/audit_record.h>
  51. #include <bsm/audit_kevents.h>
  52. #include <security/audit/audit.h>
  53. #include <security/audit/audit_private.h>
  54. #include <netinet/in_systm.h>
  55. #include <netinet/in.h>
  56. #include <netinet/ip.h>
  57. MALLOC_DEFINE(M_AUDITBSM, "audit_bsm", "Audit BSM data");
  58. static void audit_sys_auditon(struct audit_record *ar,
  59. struct au_record *rec);
  60. /*
  61. * Initialize the BSM auditing subsystem.
  62. */
  63. void
  64. kau_init(void)
  65. {
  66. au_evclassmap_init();
  67. au_evnamemap_init();
  68. }
  69. /*
  70. * This call reserves memory for the audit record. Memory must be guaranteed
  71. * before any auditable event can be generated. The au_record structure
  72. * maintains a reference to the memory allocated above and also the list of
  73. * tokens associated with this record.
  74. */
  75. static struct au_record *
  76. kau_open(void)
  77. {
  78. struct au_record *rec;
  79. rec = malloc(sizeof(*rec), M_AUDITBSM, M_WAITOK);
  80. rec->data = NULL;
  81. TAILQ_INIT(&rec->token_q);
  82. rec->len = 0;
  83. rec->used = 1;
  84. return (rec);
  85. }
  86. /*
  87. * Store the token with the record descriptor.
  88. */
  89. static void
  90. kau_write(struct au_record *rec, struct au_token *tok)
  91. {
  92. KASSERT(tok != NULL, ("kau_write: tok == NULL"));
  93. TAILQ_INSERT_TAIL(&rec->token_q, tok, tokens);
  94. rec->len += tok->len;
  95. }
  96. /*
  97. * Close out the audit record by adding the header token, identifying any
  98. * missing tokens. Write out the tokens to the record memory.
  99. */
  100. static void
  101. kau_close(struct au_record *rec, struct timespec *ctime, short event)
  102. {
  103. u_char *dptr;
  104. size_t tot_rec_size;
  105. token_t *cur, *hdr, *trail;
  106. struct timeval tm;
  107. size_t hdrsize;
  108. struct auditinfo_addr ak;
  109. struct in6_addr *ap;
  110. audit_get_kinfo(&ak);
  111. hdrsize = 0;
  112. switch (ak.ai_termid.at_type) {
  113. case AU_IPv4:
  114. hdrsize = (ak.ai_termid.at_addr[0] == INADDR_ANY) ?
  115. AUDIT_HEADER_SIZE : AUDIT_HEADER_EX_SIZE(&ak);
  116. break;
  117. case AU_IPv6:
  118. ap = (struct in6_addr *)&ak.ai_termid.at_addr[0];
  119. hdrsize = (IN6_IS_ADDR_UNSPECIFIED(ap)) ? AUDIT_HEADER_SIZE :
  120. AUDIT_HEADER_EX_SIZE(&ak);
  121. break;
  122. default:
  123. panic("kau_close: invalid address family");
  124. }
  125. tot_rec_size = rec->len + hdrsize + AUDIT_TRAILER_SIZE;
  126. rec->data = malloc(tot_rec_size, M_AUDITBSM, M_WAITOK | M_ZERO);
  127. tm.tv_usec = ctime->tv_nsec / 1000;
  128. tm.tv_sec = ctime->tv_sec;
  129. if (hdrsize != AUDIT_HEADER_SIZE)
  130. hdr = au_to_header32_ex_tm(tot_rec_size, event, 0, tm, &ak);
  131. else
  132. hdr = au_to_header32_tm(tot_rec_size, event, 0, tm);
  133. TAILQ_INSERT_HEAD(&rec->token_q, hdr, tokens);
  134. trail = au_to_trailer(tot_rec_size);
  135. TAILQ_INSERT_TAIL(&rec->token_q, trail, tokens);
  136. rec->len = tot_rec_size;
  137. dptr = rec->data;
  138. TAILQ_FOREACH(cur, &rec->token_q, tokens) {
  139. memcpy(dptr, cur->t_data, cur->len);
  140. dptr += cur->len;
  141. }
  142. }
  143. /*
  144. * Free a BSM audit record by releasing all the tokens and clearing the audit
  145. * record information.
  146. */
  147. void
  148. kau_free(struct au_record *rec)
  149. {
  150. struct au_token *tok;
  151. /* Free the token list. */
  152. while ((tok = TAILQ_FIRST(&rec->token_q))) {
  153. TAILQ_REMOVE(&rec->token_q, tok, tokens);
  154. free(tok->t_data, M_AUDITBSM);
  155. free(tok, M_AUDITBSM);
  156. }
  157. rec->used = 0;
  158. rec->len = 0;
  159. free(rec->data, M_AUDITBSM);
  160. free(rec, M_AUDITBSM);
  161. }
  162. /*
  163. * XXX: May want turn some (or all) of these macros into functions in order
  164. * to reduce the generated code size.
  165. *
  166. * XXXAUDIT: These macros assume that 'kar', 'ar', 'rec', and 'tok' in the
  167. * caller are OK with this.
  168. */
  169. #define ATFD1_TOKENS(argnum) do { \
  170. if (ARG_IS_VALID(kar, ARG_ATFD1)) { \
  171. tok = au_to_arg32(argnum, "at fd 1", ar->ar_arg_atfd1); \
  172. kau_write(rec, tok); \
  173. } \
  174. } while (0)
  175. #define ATFD2_TOKENS(argnum) do { \
  176. if (ARG_IS_VALID(kar, ARG_ATFD2)) { \
  177. tok = au_to_arg32(argnum, "at fd 2", ar->ar_arg_atfd2); \
  178. kau_write(rec, tok); \
  179. } \
  180. } while (0)
  181. #define UPATH1_TOKENS do { \
  182. if (ARG_IS_VALID(kar, ARG_UPATH1)) { \
  183. tok = au_to_path(ar->ar_arg_upath1); \
  184. kau_write(rec, tok); \
  185. } \
  186. } while (0)
  187. #define UPATH2_TOKENS do { \
  188. if (ARG_IS_VALID(kar, ARG_UPATH2)) { \
  189. tok = au_to_path(ar->ar_arg_upath2); \
  190. kau_write(rec, tok); \
  191. } \
  192. } while (0)
  193. #define VNODE1_TOKENS do { \
  194. if (ARG_IS_VALID(kar, ARG_ATFD)) { \
  195. tok = au_to_arg32(1, "at fd", ar->ar_arg_atfd); \
  196. kau_write(rec, tok); \
  197. } \
  198. if (ARG_IS_VALID(kar, ARG_VNODE1)) { \
  199. tok = au_to_attr32(&ar->ar_arg_vnode1); \
  200. kau_write(rec, tok); \
  201. } \
  202. } while (0)
  203. #define UPATH1_VNODE1_TOKENS do { \
  204. UPATH1_TOKENS; \
  205. if (ARG_IS_VALID(kar, ARG_VNODE1)) { \
  206. tok = au_to_attr32(&ar->ar_arg_vnode1); \
  207. kau_write(rec, tok); \
  208. } \
  209. } while (0)
  210. #define VNODE2_TOKENS do { \
  211. if (ARG_IS_VALID(kar, ARG_VNODE2)) { \
  212. tok = au_to_attr32(&ar->ar_arg_vnode2); \
  213. kau_write(rec, tok); \
  214. } \
  215. } while (0)
  216. #define FD_VNODE1_TOKENS do { \
  217. if (ARG_IS_VALID(kar, ARG_VNODE1)) { \
  218. if (ARG_IS_VALID(kar, ARG_FD)) { \
  219. tok = au_to_arg32(1, "fd", ar->ar_arg_fd); \
  220. kau_write(rec, tok); \
  221. } \
  222. tok = au_to_attr32(&ar->ar_arg_vnode1); \
  223. kau_write(rec, tok); \
  224. } else { \
  225. if (ARG_IS_VALID(kar, ARG_FD)) { \
  226. tok = au_to_arg32(1, "non-file: fd", \
  227. ar->ar_arg_fd); \
  228. kau_write(rec, tok); \
  229. } \
  230. } \
  231. } while (0)
  232. #define PROCESS_PID_TOKENS(argn) do { \
  233. if ((ar->ar_arg_pid > 0) /* Reference a single process */ \
  234. && (ARG_IS_VALID(kar, ARG_PROCESS))) { \
  235. tok = au_to_process32_ex(ar->ar_arg_auid, \
  236. ar->ar_arg_euid, ar->ar_arg_egid, \
  237. ar->ar_arg_ruid, ar->ar_arg_rgid, \
  238. ar->ar_arg_pid, ar->ar_arg_asid, \
  239. &ar->ar_arg_termid_addr); \
  240. kau_write(rec, tok); \
  241. } else if (ARG_IS_VALID(kar, ARG_PID)) { \
  242. tok = au_to_arg32(argn, "process", ar->ar_arg_pid); \
  243. kau_write(rec, tok); \
  244. } \
  245. } while (0)
  246. #define EXTATTR_TOKENS(namespace_argnum) do { \
  247. if (ARG_IS_VALID(kar, ARG_VALUE)) { \
  248. switch (ar->ar_arg_value) { \
  249. case EXTATTR_NAMESPACE_USER: \
  250. tok = au_to_text(EXTATTR_NAMESPACE_USER_STRING);\
  251. break; \
  252. case EXTATTR_NAMESPACE_SYSTEM: \
  253. tok = au_to_text(EXTATTR_NAMESPACE_SYSTEM_STRING);\
  254. break; \
  255. default: \
  256. tok = au_to_arg32((namespace_argnum), \
  257. "attrnamespace", ar->ar_arg_value); \
  258. break; \
  259. } \
  260. kau_write(rec, tok); \
  261. } \
  262. /* attrname is in the text field */ \
  263. if (ARG_IS_VALID(kar, ARG_TEXT)) { \
  264. tok = au_to_text(ar->ar_arg_text); \
  265. kau_write(rec, tok); \
  266. } \
  267. } while (0)
  268. /*
  269. * Not all pointer arguments to system calls are of interest, but in some
  270. * cases they reflect delegation of rights, such as mmap(2) followed by
  271. * minherit(2) before execve(2), so do the best we can.
  272. */
  273. #define ADDR_TOKEN(argnum, argname) do { \
  274. if (ARG_IS_VALID(kar, ARG_ADDR)) { \
  275. if (sizeof(void *) == sizeof(uint32_t)) \
  276. tok = au_to_arg32((argnum), (argname), \
  277. (uint32_t)(uintptr_t)ar->ar_arg_addr); \
  278. else \
  279. tok = au_to_arg64((argnum), (argname), \
  280. (uint64_t)(uintptr_t)ar->ar_arg_addr); \
  281. kau_write(rec, tok); \
  282. } \
  283. } while (0)
  284. /*
  285. * Implement auditing for the auditon() system call. The audit tokens that
  286. * are generated depend on the command that was sent into the auditon()
  287. * system call.
  288. */
  289. static void
  290. audit_sys_auditon(struct audit_record *ar, struct au_record *rec)
  291. {
  292. struct au_token *tok;
  293. tok = au_to_arg32(3, "length", ar->ar_arg_len);
  294. kau_write(rec, tok);
  295. switch (ar->ar_arg_cmd) {
  296. case A_OLDSETPOLICY:
  297. if ((size_t)ar->ar_arg_len == sizeof(int64_t)) {
  298. tok = au_to_arg64(2, "policy",
  299. ar->ar_arg_auditon.au_policy64);
  300. kau_write(rec, tok);
  301. break;
  302. }
  303. /* FALLTHROUGH */
  304. case A_SETPOLICY:
  305. tok = au_to_arg32(2, "policy", ar->ar_arg_auditon.au_policy);
  306. kau_write(rec, tok);
  307. break;
  308. case A_SETKMASK:
  309. tok = au_to_arg32(2, "setkmask:as_success",
  310. ar->ar_arg_auditon.au_mask.am_success);
  311. kau_write(rec, tok);
  312. tok = au_to_arg32(2, "setkmask:as_failure",
  313. ar->ar_arg_auditon.au_mask.am_failure);
  314. kau_write(rec, tok);
  315. break;
  316. case A_OLDSETQCTRL:
  317. if ((size_t)ar->ar_arg_len == sizeof(au_qctrl64_t)) {
  318. tok = au_to_arg64(2, "setqctrl:aq_hiwater",
  319. ar->ar_arg_auditon.au_qctrl64.aq64_hiwater);
  320. kau_write(rec, tok);
  321. tok = au_to_arg64(2, "setqctrl:aq_lowater",
  322. ar->ar_arg_auditon.au_qctrl64.aq64_lowater);
  323. kau_write(rec, tok);
  324. tok = au_to_arg64(2, "setqctrl:aq_bufsz",
  325. ar->ar_arg_auditon.au_qctrl64.aq64_bufsz);
  326. kau_write(rec, tok);
  327. tok = au_to_arg64(2, "setqctrl:aq_delay",
  328. ar->ar_arg_auditon.au_qctrl64.aq64_delay);
  329. kau_write(rec, tok);
  330. tok = au_to_arg64(2, "setqctrl:aq_minfree",
  331. ar->ar_arg_auditon.au_qctrl64.aq64_minfree);
  332. kau_write(rec, tok);
  333. break;
  334. }
  335. /* FALLTHROUGH */
  336. case A_SETQCTRL:
  337. tok = au_to_arg32(2, "setqctrl:aq_hiwater",
  338. ar->ar_arg_auditon.au_qctrl.aq_hiwater);
  339. kau_write(rec, tok);
  340. tok = au_to_arg32(2, "setqctrl:aq_lowater",
  341. ar->ar_arg_auditon.au_qctrl.aq_lowater);
  342. kau_write(rec, tok);
  343. tok = au_to_arg32(2, "setqctrl:aq_bufsz",
  344. ar->ar_arg_auditon.au_qctrl.aq_bufsz);
  345. kau_write(rec, tok);
  346. tok = au_to_arg32(2, "setqctrl:aq_delay",
  347. ar->ar_arg_auditon.au_qctrl.aq_delay);
  348. kau_write(rec, tok);
  349. tok = au_to_arg32(2, "setqctrl:aq_minfree",
  350. ar->ar_arg_auditon.au_qctrl.aq_minfree);
  351. kau_write(rec, tok);
  352. break;
  353. case A_SETUMASK:
  354. tok = au_to_arg32(2, "setumask:as_success",
  355. ar->ar_arg_auditon.au_auinfo.ai_mask.am_success);
  356. kau_write(rec, tok);
  357. tok = au_to_arg32(2, "setumask:as_failure",
  358. ar->ar_arg_auditon.au_auinfo.ai_mask.am_failure);
  359. kau_write(rec, tok);
  360. break;
  361. case A_SETSMASK:
  362. tok = au_to_arg32(2, "setsmask:as_success",
  363. ar->ar_arg_auditon.au_auinfo.ai_mask.am_success);
  364. kau_write(rec, tok);
  365. tok = au_to_arg32(2, "setsmask:as_failure",
  366. ar->ar_arg_auditon.au_auinfo.ai_mask.am_failure);
  367. kau_write(rec, tok);
  368. break;
  369. case A_OLDSETCOND:
  370. if ((size_t)ar->ar_arg_len == sizeof(int64_t)) {
  371. tok = au_to_arg64(2, "setcond",
  372. ar->ar_arg_auditon.au_cond64);
  373. kau_write(rec, tok);
  374. break;
  375. }
  376. /* FALLTHROUGH */
  377. case A_SETCOND:
  378. tok = au_to_arg32(2, "setcond", ar->ar_arg_auditon.au_cond);
  379. kau_write(rec, tok);
  380. break;
  381. case A_SETCLASS:
  382. tok = au_to_arg32(2, "setclass:ec_event",
  383. ar->ar_arg_auditon.au_evclass.ec_number);
  384. kau_write(rec, tok);
  385. tok = au_to_arg32(2, "setclass:ec_class",
  386. ar->ar_arg_auditon.au_evclass.ec_class);
  387. kau_write(rec, tok);
  388. break;
  389. case A_SETPMASK:
  390. tok = au_to_arg32(2, "setpmask:as_success",
  391. ar->ar_arg_auditon.au_aupinfo.ap_mask.am_success);
  392. kau_write(rec, tok);
  393. tok = au_to_arg32(2, "setpmask:as_failure",
  394. ar->ar_arg_auditon.au_aupinfo.ap_mask.am_failure);
  395. kau_write(rec, tok);
  396. break;
  397. case A_SETFSIZE:
  398. tok = au_to_arg32(2, "setfsize:filesize",
  399. ar->ar_arg_auditon.au_fstat.af_filesz);
  400. kau_write(rec, tok);
  401. break;
  402. default:
  403. break;
  404. }
  405. }
  406. /*
  407. * Convert an internal kernel audit record to a BSM record and return a
  408. * success/failure indicator. The BSM record is passed as an out parameter to
  409. * this function.
  410. *
  411. * Return conditions:
  412. * BSM_SUCCESS: The BSM record is valid
  413. * BSM_FAILURE: Failure; the BSM record is NULL.
  414. * BSM_NOAUDIT: The event is not auditable for BSM; the BSM record is NULL.
  415. */
  416. int
  417. kaudit_to_bsm(struct kaudit_record *kar, struct au_record **pau)
  418. {
  419. struct au_token *tok, *subj_tok, *jail_tok;
  420. struct au_record *rec;
  421. au_tid_t tid;
  422. struct audit_record *ar;
  423. int ctr;
  424. KASSERT(kar != NULL, ("kaudit_to_bsm: kar == NULL"));
  425. *pau = NULL;
  426. ar = &kar->k_ar;
  427. rec = kau_open();
  428. /*
  429. * Create the subject token. If this credential was jailed be sure to
  430. * generate a zonename token.
  431. */
  432. if (ar->ar_jailname[0] != '\0')
  433. jail_tok = au_to_zonename(ar->ar_jailname);
  434. else
  435. jail_tok = NULL;
  436. switch (ar->ar_subj_term_addr.at_type) {
  437. case AU_IPv4:
  438. tid.port = ar->ar_subj_term_addr.at_port;
  439. tid.machine = ar->ar_subj_term_addr.at_addr[0];
  440. subj_tok = au_to_subject32(ar->ar_subj_auid, /* audit ID */
  441. ar->ar_subj_cred.cr_uid, /* eff uid */
  442. ar->ar_subj_egid, /* eff group id */
  443. ar->ar_subj_ruid, /* real uid */
  444. ar->ar_subj_rgid, /* real group id */
  445. ar->ar_subj_pid, /* process id */
  446. ar->ar_subj_asid, /* session ID */
  447. &tid);
  448. break;
  449. case AU_IPv6:
  450. subj_tok = au_to_subject32_ex(ar->ar_subj_auid,
  451. ar->ar_subj_cred.cr_uid,
  452. ar->ar_subj_egid,
  453. ar->ar_subj_ruid,
  454. ar->ar_subj_rgid,
  455. ar->ar_subj_pid,
  456. ar->ar_subj_asid,
  457. &ar->ar_subj_term_addr);
  458. break;
  459. default:
  460. bzero(&tid, sizeof(tid));
  461. subj_tok = au_to_subject32(ar->ar_subj_auid,
  462. ar->ar_subj_cred.cr_uid,
  463. ar->ar_subj_egid,
  464. ar->ar_subj_ruid,
  465. ar->ar_subj_rgid,
  466. ar->ar_subj_pid,
  467. ar->ar_subj_asid,
  468. &tid);
  469. }
  470. /*
  471. * The logic inside each case fills in the tokens required for the
  472. * event, except for the header, trailer, and return tokens. The
  473. * header and trailer tokens are added by the kau_close() function.
  474. * The return token is added outside of the switch statement.
  475. */
  476. switch(ar->ar_event) {
  477. case AUE_ACCEPT:
  478. if (ARG_IS_VALID(kar, ARG_FD)) {
  479. tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
  480. kau_write(rec, tok);
  481. }
  482. if (ARG_IS_VALID(kar, ARG_SADDRINET)) {
  483. tok = au_to_sock_inet((struct sockaddr_in *)
  484. &ar->ar_arg_sockaddr);
  485. kau_write(rec, tok);
  486. }
  487. if (ARG_IS_VALID(kar, ARG_SADDRUNIX)) {
  488. tok = au_to_sock_unix((struct sockaddr_un *)
  489. &ar->ar_arg_sockaddr);
  490. kau_write(rec, tok);
  491. UPATH1_TOKENS;
  492. }
  493. break;
  494. case AUE_BIND:
  495. case AUE_LISTEN:
  496. case AUE_CONNECT:
  497. case AUE_RECV:
  498. case AUE_RECVFROM:
  499. case AUE_RECVMSG:
  500. case AUE_SEND:
  501. case AUE_SENDMSG:
  502. case AUE_SENDTO:
  503. /*
  504. * Socket-related events.
  505. */
  506. if (ARG_IS_VALID(kar, ARG_FD)) {
  507. tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
  508. kau_write(rec, tok);
  509. }
  510. if (ARG_IS_VALID(kar, ARG_SADDRINET)) {
  511. tok = au_to_sock_inet((struct sockaddr_in *)
  512. &ar->ar_arg_sockaddr);
  513. kau_write(rec, tok);
  514. }
  515. if (ARG_IS_VALID(kar, ARG_SADDRUNIX)) {
  516. tok = au_to_sock_unix((struct sockaddr_un *)
  517. &ar->ar_arg_sockaddr);
  518. kau_write(rec, tok);
  519. UPATH1_TOKENS;
  520. }
  521. /* XXX Need to handle ARG_SADDRINET6 */
  522. break;
  523. case AUE_BINDAT:
  524. case AUE_CONNECTAT:
  525. ATFD1_TOKENS(1);
  526. if (ARG_IS_VALID(kar, ARG_FD)) {
  527. tok = au_to_arg32(2, "fd", ar->ar_arg_fd);
  528. kau_write(rec, tok);
  529. }
  530. if (ARG_IS_VALID(kar, ARG_SADDRUNIX)) {
  531. tok = au_to_sock_unix((struct sockaddr_un *)
  532. &ar->ar_arg_sockaddr);
  533. kau_write(rec, tok);
  534. UPATH1_TOKENS;
  535. }
  536. break;
  537. case AUE_SENDFILE:
  538. FD_VNODE1_TOKENS;
  539. if (ARG_IS_VALID(kar, ARG_SADDRINET)) {
  540. tok = au_to_sock_inet((struct sockaddr_in *)
  541. &ar->ar_arg_sockaddr);
  542. kau_write(rec, tok);
  543. }
  544. if (ARG_IS_VALID(kar, ARG_SADDRUNIX)) {
  545. tok = au_to_sock_unix((struct sockaddr_un *)
  546. &ar->ar_arg_sockaddr);
  547. kau_write(rec, tok);
  548. UPATH1_TOKENS;
  549. }
  550. /* XXX Need to handle ARG_SADDRINET6 */
  551. break;
  552. case AUE_SOCKET:
  553. case AUE_SOCKETPAIR:
  554. if (ARG_IS_VALID(kar, ARG_SOCKINFO)) {
  555. tok = au_to_arg32(1, "domain",
  556. ar->ar_arg_sockinfo.so_domain);
  557. kau_write(rec, tok);
  558. tok = au_to_arg32(2, "type",
  559. ar->ar_arg_sockinfo.so_type);
  560. kau_write(rec, tok);
  561. tok = au_to_arg32(3, "protocol",
  562. ar->ar_arg_sockinfo.so_protocol);
  563. kau_write(rec, tok);
  564. }
  565. break;
  566. case AUE_SETSOCKOPT:
  567. case AUE_SHUTDOWN:
  568. if (ARG_IS_VALID(kar, ARG_FD)) {
  569. tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
  570. kau_write(rec, tok);
  571. }
  572. break;
  573. case AUE_ACCT:
  574. if (ARG_IS_VALID(kar, ARG_UPATH1)) {
  575. UPATH1_VNODE1_TOKENS;
  576. } else {
  577. tok = au_to_arg32(1, "accounting off", 0);
  578. kau_write(rec, tok);
  579. }
  580. break;
  581. case AUE_SETAUID:
  582. if (ARG_IS_VALID(kar, ARG_AUID)) {
  583. tok = au_to_arg32(2, "setauid", ar->ar_arg_auid);
  584. kau_write(rec, tok);
  585. }
  586. break;
  587. case AUE_SETAUDIT:
  588. if (ARG_IS_VALID(kar, ARG_AUID) &&
  589. ARG_IS_VALID(kar, ARG_ASID) &&
  590. ARG_IS_VALID(kar, ARG_AMASK) &&
  591. ARG_IS_VALID(kar, ARG_TERMID)) {
  592. tok = au_to_arg32(1, "setaudit:auid",
  593. ar->ar_arg_auid);
  594. kau_write(rec, tok);
  595. tok = au_to_arg32(1, "setaudit:port",
  596. ar->ar_arg_termid.port);
  597. kau_write(rec, tok);
  598. tok = au_to_arg32(1, "setaudit:machine",
  599. ar->ar_arg_termid.machine);
  600. kau_write(rec, tok);
  601. tok = au_to_arg32(1, "setaudit:as_success",
  602. ar->ar_arg_amask.am_success);
  603. kau_write(rec, tok);
  604. tok = au_to_arg32(1, "setaudit:as_failure",
  605. ar->ar_arg_amask.am_failure);
  606. kau_write(rec, tok);
  607. tok = au_to_arg32(1, "setaudit:asid",
  608. ar->ar_arg_asid);
  609. kau_write(rec, tok);
  610. }
  611. break;
  612. case AUE_SETAUDIT_ADDR:
  613. if (ARG_IS_VALID(kar, ARG_AUID) &&
  614. ARG_IS_VALID(kar, ARG_ASID) &&
  615. ARG_IS_VALID(kar, ARG_AMASK) &&
  616. ARG_IS_VALID(kar, ARG_TERMID_ADDR)) {
  617. tok = au_to_arg32(1, "setaudit_addr:auid",
  618. ar->ar_arg_auid);
  619. kau_write(rec, tok);
  620. tok = au_to_arg32(1, "setaudit_addr:as_success",
  621. ar->ar_arg_amask.am_success);
  622. kau_write(rec, tok);
  623. tok = au_to_arg32(1, "setaudit_addr:as_failure",
  624. ar->ar_arg_amask.am_failure);
  625. kau_write(rec, tok);
  626. tok = au_to_arg32(1, "setaudit_addr:asid",
  627. ar->ar_arg_asid);
  628. kau_write(rec, tok);
  629. tok = au_to_arg32(1, "setaudit_addr:type",
  630. ar->ar_arg_termid_addr.at_type);
  631. kau_write(rec, tok);
  632. tok = au_to_arg32(1, "setaudit_addr:port",
  633. ar->ar_arg_termid_addr.at_port);
  634. kau_write(rec, tok);
  635. if (ar->ar_arg_termid_addr.at_type == AU_IPv6)
  636. tok = au_to_in_addr_ex((struct in6_addr *)
  637. &ar->ar_arg_termid_addr.at_addr[0]);
  638. if (ar->ar_arg_termid_addr.at_type == AU_IPv4)
  639. tok = au_to_in_addr((struct in_addr *)
  640. &ar->ar_arg_termid_addr.at_addr[0]);
  641. kau_write(rec, tok);
  642. }
  643. break;
  644. case AUE_AUDITON:
  645. /*
  646. * For AUDITON commands without own event, audit the cmd.
  647. */
  648. if (ARG_IS_VALID(kar, ARG_CMD)) {
  649. tok = au_to_arg32(1, "cmd", ar->ar_arg_cmd);
  650. kau_write(rec, tok);
  651. }
  652. /* FALLTHROUGH */
  653. case AUE_AUDITON_GETCAR:
  654. case AUE_AUDITON_GETCLASS:
  655. case AUE_AUDITON_GETCOND:
  656. case AUE_AUDITON_GETCWD:
  657. case AUE_AUDITON_GETKMASK:
  658. case AUE_AUDITON_GETSTAT:
  659. case AUE_AUDITON_GPOLICY:
  660. case AUE_AUDITON_GQCTRL:
  661. case AUE_AUDITON_SETCLASS:
  662. case AUE_AUDITON_SETCOND:
  663. case AUE_AUDITON_SETKMASK:
  664. case AUE_AUDITON_SETSMASK:
  665. case AUE_AUDITON_SETSTAT:
  666. case AUE_AUDITON_SETUMASK:
  667. case AUE_AUDITON_SPOLICY:
  668. case AUE_AUDITON_SQCTRL:
  669. if (ARG_IS_VALID(kar, ARG_AUDITON))
  670. audit_sys_auditon(ar, rec);
  671. break;
  672. case AUE_AUDITCTL:
  673. UPATH1_VNODE1_TOKENS;
  674. break;
  675. case AUE_EXIT:
  676. if (ARG_IS_VALID(kar, ARG_EXIT)) {
  677. tok = au_to_exit(ar->ar_arg_exitretval,
  678. ar->ar_arg_exitstatus);
  679. kau_write(rec, tok);
  680. }
  681. break;
  682. case AUE_ADJTIME:
  683. case AUE_CLOCK_SETTIME:
  684. case AUE_AUDIT:
  685. case AUE_DUP2:
  686. case AUE_GETAUDIT:
  687. case AUE_GETAUDIT_ADDR:
  688. case AUE_GETAUID:
  689. case AUE_GETCWD:
  690. case AUE_GETFSSTAT:
  691. case AUE_GETRESUID:
  692. case AUE_GETRESGID:
  693. case AUE_KQUEUE:
  694. case AUE_MODLOAD:
  695. case AUE_MODUNLOAD:
  696. case AUE_MSGSYS:
  697. case AUE_NTP_ADJTIME:
  698. case AUE_PIPE:
  699. case AUE_POSIX_OPENPT:
  700. case AUE_PROFILE:
  701. case AUE_RTPRIO:
  702. case AUE_SEMSYS:
  703. case AUE_SETFIB:
  704. case AUE_SHMSYS:
  705. case AUE_SETPGRP:
  706. case AUE_SETRLIMIT:
  707. case AUE_SETSID:
  708. case AUE_SETTIMEOFDAY:
  709. case AUE_SYSARCH:
  710. /*
  711. * Header, subject, and return tokens added at end.
  712. */
  713. break;
  714. case AUE_ACL_DELETE_FD:
  715. case AUE_ACL_DELETE_FILE:
  716. case AUE_ACL_CHECK_FD:
  717. case AUE_ACL_CHECK_FILE:
  718. case AUE_ACL_CHECK_LINK:
  719. case AUE_ACL_DELETE_LINK:
  720. case AUE_ACL_GET_FD:
  721. case AUE_ACL_GET_FILE:
  722. case AUE_ACL_GET_LINK:
  723. case AUE_ACL_SET_FD:
  724. case AUE_ACL_SET_FILE:
  725. case AUE_ACL_SET_LINK:
  726. if (ARG_IS_VALID(kar, ARG_VALUE)) {
  727. tok = au_to_arg32(1, "type", ar->ar_arg_value);
  728. kau_write(rec, tok);
  729. }
  730. ATFD1_TOKENS(1);
  731. UPATH1_VNODE1_TOKENS;
  732. break;
  733. /*
  734. * NB: We may want to verify that the appropriate
  735. * audit args are being processed here, but I think
  736. * a bit analysis is required.
  737. *
  738. * Process AUE_JAIL_SET in the next block so we can pickup any path
  739. * related tokens that might exist.
  740. */
  741. case AUE_JAIL_GET:
  742. case AUE_JAIL_ATTACH:
  743. case AUE_JAIL_REMOVE:
  744. break;
  745. case AUE_JAIL_SET:
  746. case AUE_CHDIR:
  747. case AUE_CHROOT:
  748. case AUE_FSTATAT:
  749. case AUE_FUTIMESAT:
  750. case AUE_GETATTRLIST:
  751. case AUE_JAIL:
  752. case AUE_LUTIMES:
  753. case AUE_NFS_GETFH:
  754. case AUE_LGETFH:
  755. case AUE_LSTAT:
  756. case AUE_LPATHCONF:
  757. case AUE_PATHCONF:
  758. case AUE_READLINK:
  759. case AUE_READLINKAT:
  760. case AUE_REVOKE:
  761. case AUE_RMDIR:
  762. case AUE_SEARCHFS:
  763. case AUE_SETATTRLIST:
  764. case AUE_STAT:
  765. case AUE_STATFS:
  766. case AUE_SWAPON:
  767. case AUE_SWAPOFF:
  768. case AUE_TRUNCATE:
  769. case AUE_UNDELETE:
  770. case AUE_UNLINK:
  771. case AUE_UNLINKAT:
  772. case AUE_UTIMES:
  773. case AUE_REALPATHAT:
  774. ATFD1_TOKENS(1);
  775. UPATH1_VNODE1_TOKENS;
  776. break;
  777. case AUE_ACCESS:
  778. case AUE_EACCESS:
  779. case AUE_FACCESSAT:
  780. ATFD1_TOKENS(1);
  781. UPATH1_VNODE1_TOKENS;
  782. if (ARG_IS_VALID(kar, ARG_VALUE)) {
  783. tok = au_to_arg32(2, "mode", ar->ar_arg_value);
  784. kau_write(rec, tok);
  785. }
  786. break;
  787. case AUE_FHSTATFS:
  788. case AUE_FHOPEN:
  789. case AUE_FHSTAT:
  790. /* XXXRW: Need to audit vnode argument. */
  791. break;
  792. case AUE_CHFLAGS:
  793. case AUE_LCHFLAGS:
  794. case AUE_CHFLAGSAT:
  795. if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
  796. tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
  797. kau_write(rec, tok);
  798. }
  799. UPATH1_VNODE1_TOKENS;
  800. break;
  801. case AUE_CHMOD:
  802. case AUE_LCHMOD:
  803. if (ARG_IS_VALID(kar, ARG_MODE)) {
  804. tok = au_to_arg32(2, "new file mode",
  805. ar->ar_arg_mode);
  806. kau_write(rec, tok);
  807. }
  808. UPATH1_VNODE1_TOKENS;
  809. break;
  810. case AUE_FCHMODAT:
  811. ATFD1_TOKENS(1);
  812. if (ARG_IS_VALID(kar, ARG_MODE)) {
  813. tok = au_to_arg32(3, "new file mode",
  814. ar->ar_arg_mode);
  815. kau_write(rec, tok);
  816. }
  817. UPATH1_VNODE1_TOKENS;
  818. break;
  819. case AUE_CHOWN:
  820. case AUE_LCHOWN:
  821. if (ARG_IS_VALID(kar, ARG_UID)) {
  822. tok = au_to_arg32(2, "new file uid", ar->ar_arg_uid);
  823. kau_write(rec, tok);
  824. }
  825. if (ARG_IS_VALID(kar, ARG_GID)) {
  826. tok = au_to_arg32(3, "new file gid", ar->ar_arg_gid);
  827. kau_write(rec, tok);
  828. }
  829. UPATH1_VNODE1_TOKENS;
  830. break;
  831. case AUE_FCHOWNAT:
  832. ATFD1_TOKENS(1);
  833. if (ARG_IS_VALID(kar, ARG_UID)) {
  834. tok = au_to_arg32(3, "new file uid", ar->ar_arg_uid);
  835. kau_write(rec, tok);
  836. }
  837. if (ARG_IS_VALID(kar, ARG_GID)) {
  838. tok = au_to_arg32(4, "new file gid", ar->ar_arg_gid);
  839. kau_write(rec, tok);
  840. }
  841. UPATH1_VNODE1_TOKENS;
  842. break;
  843. case AUE_EXCHANGEDATA:
  844. UPATH1_VNODE1_TOKENS;
  845. UPATH2_TOKENS;
  846. break;
  847. case AUE_CLOSE:
  848. if (ARG_IS_VALID(kar, ARG_FD)) {
  849. tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
  850. kau_write(rec, tok);
  851. }
  852. UPATH1_VNODE1_TOKENS;
  853. break;
  854. case AUE_CLOSEFROM:
  855. if (ARG_IS_VALID(kar, ARG_FD)) {
  856. tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
  857. kau_write(rec, tok);
  858. }
  859. break;
  860. case AUE_CLOSERANGE:
  861. if (ARG_IS_VALID(kar, ARG_FD)) {
  862. tok = au_to_arg32(1, "lowfd", ar->ar_arg_fd);
  863. kau_write(rec, tok);
  864. }
  865. if (ARG_IS_VALID(kar, ARG_CMD)) {
  866. tok = au_to_arg32(2, "highfd", ar->ar_arg_cmd);
  867. kau_write(rec, tok);
  868. }
  869. if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
  870. tok = au_to_arg32(3, "flags", ar->ar_arg_fflags);
  871. kau_write(rec, tok);
  872. }
  873. break;
  874. case AUE_CORE:
  875. if (ARG_IS_VALID(kar, ARG_SIGNUM)) {
  876. tok = au_to_arg32(1, "signal", ar->ar_arg_signum);
  877. kau_write(rec, tok);
  878. }
  879. UPATH1_VNODE1_TOKENS;
  880. break;
  881. case AUE_EXTATTRCTL:
  882. UPATH1_VNODE1_TOKENS;
  883. if (ARG_IS_VALID(kar, ARG_CMD)) {
  884. tok = au_to_arg32(2, "cmd", ar->ar_arg_cmd);
  885. kau_write(rec, tok);
  886. }
  887. /* extattrctl(2) filename parameter is in upath2/vnode2 */
  888. UPATH2_TOKENS;
  889. VNODE2_TOKENS;
  890. EXTATTR_TOKENS(4);
  891. break;
  892. case AUE_EXTATTR_GET_FILE:
  893. case AUE_EXTATTR_SET_FILE:
  894. case AUE_EXTATTR_LIST_FILE:
  895. case AUE_EXTATTR_DELETE_FILE:
  896. case AUE_EXTATTR_GET_LINK:
  897. case AUE_EXTATTR_SET_LINK:
  898. case AUE_EXTATTR_LIST_LINK:
  899. case AUE_EXTATTR_DELETE_LINK:
  900. UPATH1_VNODE1_TOKENS;
  901. EXTATTR_TOKENS(2);
  902. break;
  903. case AUE_EXTATTR_GET_FD:
  904. case AUE_EXTATTR_SET_FD:
  905. case AUE_EXTATTR_LIST_FD:
  906. case AUE_EXTATTR_DELETE_FD:
  907. if (ARG_IS_VALID(kar, ARG_FD)) {
  908. tok = au_to_arg32(2, "fd", ar->ar_arg_fd);
  909. kau_write(rec, tok);
  910. }
  911. EXTATTR_TOKENS(2);
  912. break;
  913. case AUE_FEXECVE:
  914. if (ARG_IS_VALID(kar, ARG_FD)) {
  915. tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
  916. kau_write(rec, tok);
  917. }
  918. /* FALLTHROUGH */
  919. case AUE_EXECVE:
  920. case AUE_MAC_EXECVE:
  921. if (ARG_IS_VALID(kar, ARG_ARGV)) {
  922. tok = au_to_exec_args(ar->ar_arg_argv,
  923. ar->ar_arg_argc);
  924. kau_write(rec, tok);
  925. }
  926. if (ARG_IS_VALID(kar, ARG_ENVV)) {
  927. tok = au_to_exec_env(ar->ar_arg_envv,
  928. ar->ar_arg_envc);
  929. kau_write(rec, tok);
  930. }
  931. UPATH1_VNODE1_TOKENS;
  932. break;
  933. case AUE_FCHMOD:
  934. if (ARG_IS_VALID(kar, ARG_MODE)) {
  935. tok = au_to_arg32(2, "new file mode",
  936. ar->ar_arg_mode);
  937. kau_write(rec, tok);
  938. }
  939. FD_VNODE1_TOKENS;
  940. break;
  941. /*
  942. * XXXRW: Some of these need to handle non-vnode cases as well.
  943. */
  944. case AUE_FCHDIR:
  945. case AUE_FPATHCONF:
  946. case AUE_FSTAT:
  947. case AUE_FSTATFS:
  948. case AUE_FSYNC:
  949. case AUE_FTRUNCATE:
  950. case AUE_FUTIMES:
  951. case AUE_GETDIRENTRIES:
  952. case AUE_GETDIRENTRIESATTR:
  953. case AUE_LSEEK:
  954. case AUE_POLL:
  955. case AUE_POSIX_FALLOCATE:
  956. case AUE_PREAD:
  957. case AUE_PWRITE:
  958. case AUE_READ:
  959. case AUE_READV:
  960. case AUE_WRITE:
  961. case AUE_WRITEV:
  962. FD_VNODE1_TOKENS;
  963. break;
  964. case AUE_FCHOWN:
  965. if (ARG_IS_VALID(kar, ARG_UID)) {
  966. tok = au_to_arg32(2, "new file uid", ar->ar_arg_uid);
  967. kau_write(rec, tok);
  968. }
  969. if (ARG_IS_VALID(kar, ARG_GID)) {
  970. tok = au_to_arg32(3, "new file gid", ar->ar_arg_gid);
  971. kau_write(rec, tok);
  972. }
  973. FD_VNODE1_TOKENS;
  974. break;
  975. case AUE_FCNTL:
  976. if (ARG_IS_VALID(kar, ARG_CMD)) {
  977. tok = au_to_arg32(2, "cmd",
  978. au_fcntl_cmd_to_bsm(ar->ar_arg_cmd));
  979. kau_write(rec, tok);
  980. }
  981. FD_VNODE1_TOKENS;
  982. break;
  983. case AUE_FCHFLAGS:
  984. if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
  985. tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
  986. kau_write(rec, tok);
  987. }
  988. FD_VNODE1_TOKENS;
  989. break;
  990. case AUE_FLOCK:
  991. if (ARG_IS_VALID(kar, ARG_CMD)) {
  992. tok = au_to_arg32(2, "operation", ar->ar_arg_cmd);
  993. kau_write(rec, tok);
  994. }
  995. FD_VNODE1_TOKENS;
  996. break;
  997. case AUE_FSPACECTL:
  998. if (ARG_IS_VALID(kar, ARG_CMD)) {
  999. tok = au_to_arg32(2, "operation", ar->ar_arg_cmd);
  1000. kau_write(rec, tok);
  1001. }
  1002. if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
  1003. tok = au_to_arg32(4, "flags", ar->ar_arg_fflags);
  1004. kau_write(rec, tok);
  1005. }
  1006. FD_VNODE1_TOKENS;
  1007. break;
  1008. case AUE_RFORK:
  1009. if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
  1010. tok = au_to_arg32(1, "flags", ar->ar_arg_fflags);
  1011. kau_write(rec, tok);
  1012. }
  1013. /* FALLTHROUGH */
  1014. case AUE_FORK:
  1015. case AUE_VFORK:
  1016. if (ARG_IS_VALID(kar, ARG_PID)) {
  1017. tok = au_to_arg32(0, "child PID", ar->ar_arg_pid);
  1018. kau_write(rec, tok);
  1019. }
  1020. break;
  1021. case AUE_IOCTL:
  1022. if (ARG_IS_VALID(kar, ARG_CMD)) {
  1023. tok = au_to_arg32(2, "cmd", ar->ar_arg_cmd);
  1024. kau_write(rec, tok);
  1025. }
  1026. if (ARG_IS_VALID(kar, ARG_VNODE1))
  1027. FD_VNODE1_TOKENS;
  1028. else {
  1029. if (ARG_IS_VALID(kar, ARG_SOCKINFO)) {
  1030. tok = kau_to_socket(&ar->ar_arg_sockinfo);
  1031. kau_write(rec, tok);
  1032. } else {
  1033. if (ARG_IS_VALID(kar, ARG_FD)) {
  1034. tok = au_to_arg32(1, "fd",
  1035. ar->ar_arg_fd);
  1036. kau_write(rec, tok);
  1037. }
  1038. }
  1039. }
  1040. break;
  1041. case AUE_KILL:
  1042. case AUE_KILLPG:
  1043. if (ARG_IS_VALID(kar, ARG_SIGNUM)) {
  1044. tok = au_to_arg32(2, "signal", ar->ar_arg_signum);
  1045. kau_write(rec, tok);
  1046. }
  1047. PROCESS_PID_TOKENS(1);
  1048. break;
  1049. case AUE_KTRACE:
  1050. if (ARG_IS_VALID(kar, ARG_CMD)) {
  1051. tok = au_to_arg32(2, "ops", ar->ar_arg_cmd);
  1052. kau_write(rec, tok);
  1053. }
  1054. if (ARG_IS_VALID(kar, ARG_VALUE)) {
  1055. tok = au_to_arg32(3, "trpoints", ar->ar_arg_value);
  1056. kau_write(rec, tok);
  1057. }
  1058. PROCESS_PID_TOKENS(4);
  1059. UPATH1_VNODE1_TOKENS;
  1060. break;
  1061. case AUE_LINK:
  1062. case AUE_LINKAT:
  1063. case AUE_RENAME:
  1064. case AUE_RENAMEAT:
  1065. ATFD1_TOKENS(1);
  1066. UPATH1_VNODE1_TOKENS;
  1067. ATFD2_TOKENS(3);
  1068. UPATH2_TOKENS;
  1069. break;
  1070. case AUE_LOADSHFILE:
  1071. ADDR_TOKEN(4, "base addr");
  1072. UPATH1_VNODE1_TOKENS;
  1073. break;
  1074. case AUE_MKDIR:
  1075. case AUE_MKDIRAT:
  1076. case AUE_MKFIFO:
  1077. case AUE_MKFIFOAT:
  1078. ATFD1_TOKENS(1);
  1079. if (ARG_IS_VALID(kar, ARG_MODE)) {
  1080. tok = au_to_arg32(2, "mode", ar->ar_arg_mode);
  1081. kau_write(rec, tok);
  1082. }
  1083. UPATH1_VNODE1_TOKENS;
  1084. break;
  1085. case AUE_MKNOD:
  1086. case AUE_MKNODAT:
  1087. ATFD1_TOKENS(1);
  1088. if (ARG_IS_VALID(kar, ARG_MODE)) {
  1089. tok = au_to_arg32(2, "mode", ar->ar_arg_mode);
  1090. kau_write(rec, tok);
  1091. }
  1092. if (ARG_IS_VALID(kar, ARG_DEV)) {
  1093. tok = au_to_arg32(3, "dev", ar->ar_arg_dev);
  1094. kau_write(rec, tok);
  1095. }
  1096. UPATH1_VNODE1_TOKENS;
  1097. break;
  1098. case AUE_MMAP:
  1099. case AUE_MUNMAP:
  1100. case AUE_MPROTECT:
  1101. case AUE_MLOCK:
  1102. case AUE_MUNLOCK:
  1103. case AUE_MINHERIT:
  1104. ADDR_TOKEN(1, "addr");
  1105. if (ARG_IS_VALID(kar, ARG_LEN)) {
  1106. tok = au_to_arg32(2, "len", ar->ar_arg_len);
  1107. kau_write(rec, tok);
  1108. }
  1109. if (ar->ar_event == AUE_MMAP)
  1110. FD_VNODE1_TOKENS;
  1111. if (ar->ar_event == AUE_MPROTECT) {
  1112. if (ARG_IS_VALID(kar, ARG_VALUE)) {
  1113. tok = au_to_arg32(3, "protection",
  1114. ar->ar_arg_value);
  1115. kau_write(rec, tok);
  1116. }
  1117. }
  1118. if (ar->ar_event == AUE_MINHERIT) {
  1119. if (ARG_IS_VALID(kar, ARG_VALUE)) {
  1120. tok = au_to_arg32(3, "inherit",
  1121. ar->ar_arg_value);
  1122. kau_write(rec, tok);
  1123. }
  1124. }
  1125. break;
  1126. case AUE_MOUNT:
  1127. case AUE_NMOUNT:
  1128. /* XXX Need to handle NFS mounts */
  1129. if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
  1130. tok = au_to_arg32(3, "flags", ar->ar_arg_fflags);
  1131. kau_write(rec, tok);
  1132. }
  1133. if (ARG_IS_VALID(kar, ARG_TEXT)) {
  1134. tok = au_to_text(ar->ar_arg_text);
  1135. kau_write(rec, tok);
  1136. }
  1137. /* FALLTHROUGH */
  1138. case AUE_NFS_SVC:
  1139. if (ARG_IS_VALID(kar, ARG_CMD)) {
  1140. tok = au_to_arg32(1, "flags", ar->ar_arg_cmd);
  1141. kau_write(rec, tok);
  1142. }
  1143. break;
  1144. case AUE_UMOUNT:
  1145. if (ARG_IS_VALID(kar, ARG_VALUE)) {
  1146. tok = au_to_arg32(2, "flags", ar->ar_arg_value);
  1147. kau_write(rec, tok);
  1148. }
  1149. UPATH1_VNODE1_TOKENS;
  1150. if (ARG_IS_VALID(kar, ARG_TEXT)) {
  1151. tok = au_to_text(ar->ar_arg_text);
  1152. kau_write(rec, tok);
  1153. }
  1154. break;
  1155. case AUE_MSGCTL:
  1156. ar->ar_event = audit_msgctl_to_event(ar->ar_arg_svipc_cmd);
  1157. /* Fall through */
  1158. case AUE_MSGRCV:
  1159. case AUE_MSGSND:
  1160. tok = au_to_arg32(1, "msg ID", ar->ar_arg_svipc_id);
  1161. kau_write(rec, tok);
  1162. if (ar->ar_errno != EINVAL) {
  1163. tok = au_to_ipc(AT_IPC_MSG, ar->ar_arg_svipc_id);
  1164. kau_write(rec, tok);
  1165. }
  1166. break;
  1167. case AUE_MSGGET:
  1168. if (ar->ar_errno == 0) {
  1169. if (ARG_IS_VALID(kar, ARG_SVIPC_ID)) {
  1170. tok = au_to_ipc(AT_IPC_MSG,
  1171. ar->ar_arg_svipc_id);
  1172. kau_write(rec, tok);
  1173. }
  1174. }
  1175. break;
  1176. case AUE_RESETSHFILE:
  1177. ADDR_TOKEN(1, "base addr");
  1178. break;
  1179. case AUE_OPEN_RC:
  1180. case AUE_OPEN_RTC:
  1181. case AUE_OPEN_RWC:
  1182. case AUE_OPEN_RWTC:
  1183. case AUE_OPEN_WC:
  1184. case AUE_OPEN_WTC:
  1185. case AUE_CREAT:
  1186. if (ARG_IS_VALID(kar, ARG_MODE)) {
  1187. tok = au_to_arg32(3, "mode", ar->ar_arg_mode);
  1188. kau_write(rec, tok);
  1189. }
  1190. /* FALLTHROUGH */
  1191. case AUE_OPEN_R:
  1192. case AUE_OPEN_RT:
  1193. case AUE_OPEN_RW:
  1194. case AUE_OPEN_RWT:
  1195. case AUE_OPEN_W:
  1196. case AUE_OPEN_WT:
  1197. if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
  1198. tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
  1199. kau_write(rec, tok);
  1200. }
  1201. UPATH1_VNODE1_TOKENS;
  1202. break;
  1203. case AUE_OPENAT_RC:
  1204. case AUE_OPENAT_RTC:
  1205. case AUE_OPENAT_RWC:
  1206. case AUE_OPENAT_RWTC:
  1207. case AUE_OPENAT_WC:
  1208. case AUE_OPENAT_WTC:
  1209. if (ARG_IS_VALID(kar, ARG_MODE)) {
  1210. tok = au_to_arg32(3, "mode", ar->ar_arg_mode);
  1211. kau_write(rec, tok);
  1212. }
  1213. /* FALLTHROUGH */
  1214. case AUE_OPENAT_R:
  1215. case AUE_OPENAT_RT:
  1216. case AUE_OPENAT_RW:
  1217. case AUE_OPENAT_RWT:
  1218. case AUE_OPENAT_W:
  1219. case AUE_OPENAT_WT:
  1220. if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
  1221. tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
  1222. kau_write(rec, tok);
  1223. }
  1224. ATFD1_TOKENS(1);
  1225. UPATH1_VNODE1_TOKENS;
  1226. break;
  1227. case AUE_PDKILL:
  1228. if (ARG_IS_VALID(kar, ARG_FD)) {
  1229. tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
  1230. kau_write(rec, tok);
  1231. }
  1232. if (ARG_IS_VALID(kar, ARG_SIGNUM)) {
  1233. tok = au_to_arg32(2, "signal", ar->ar_arg_signum);
  1234. kau_write(rec, tok);
  1235. }
  1236. PROCESS_PID_TOKENS(1);
  1237. break;
  1238. case AUE_PDFORK:
  1239. if (ARG_IS_VALID(kar, ARG_PID)) {
  1240. tok = au_to_arg32(0, "child PID", ar->ar_arg_pid);
  1241. kau_write(rec, tok);
  1242. }
  1243. if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
  1244. tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
  1245. kau_write(rec, tok);
  1246. }
  1247. if (ARG_IS_VALID(kar, ARG_FD)) {
  1248. tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
  1249. kau_write(rec, tok);
  1250. }
  1251. break;
  1252. case AUE_PDGETPID:
  1253. if (ARG_IS_VALID(kar, ARG_FD)) {
  1254. tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
  1255. kau_write(rec, tok);
  1256. }
  1257. break;
  1258. case AUE_PROCCTL:
  1259. if (ARG_IS_VALID(kar, ARG_VALUE)) {
  1260. tok = au_to_arg32(1, "idtype", ar->ar_arg_value);
  1261. kau_write(rec, tok);
  1262. }
  1263. if (ARG_IS_VALID(kar, ARG_CMD)) {
  1264. tok = au_to_arg32(2, "com", ar->ar_arg_cmd);
  1265. kau_write(rec, tok);
  1266. }
  1267. PROCESS_PID_TOKENS(3);
  1268. break;
  1269. case AUE_PTRACE:
  1270. if (ARG_IS_VALID(kar, ARG_CMD)) {
  1271. tok = au_to_arg32(1, "request", ar->ar_arg_cmd);
  1272. kau_write(rec, tok);
  1273. }
  1274. if (ARG_IS_VALID(kar, ARG_VALUE)) {
  1275. tok = au_to_arg32(4, "data", ar->ar_arg_value);
  1276. kau_write(rec, tok);
  1277. }
  1278. PROCESS_PID_TOKENS(2);
  1279. break;
  1280. case AUE_QUOTACTL:
  1281. if (ARG_IS_VALID(kar, ARG_CMD)) {
  1282. tok = au_to_arg32(2, "command", ar->ar_arg_cmd);
  1283. kau_write(rec, tok);
  1284. }
  1285. if (ARG_IS_VALID(kar, ARG_UID)) {
  1286. tok = au_to_arg32(3, "uid", ar->ar_arg_uid);
  1287. kau_write(rec, tok);
  1288. }
  1289. if (ARG_IS_VALID(kar, ARG_GID)) {
  1290. tok = au_to_arg32(3, "gid", ar->ar_arg_gid);
  1291. kau_write(rec, tok);
  1292. }
  1293. UPATH1_VNODE1_TOKENS;
  1294. break;
  1295. case AUE_REBOOT:
  1296. if (ARG_IS_VALID(kar, ARG_CMD)) {
  1297. tok = au_to_arg32(1, "howto", ar->ar_arg_cmd);
  1298. kau_write(rec, tok);
  1299. }
  1300. break;
  1301. case AUE_SEMCTL:
  1302. ar->ar_event = audit_semctl_to_event(ar->ar_arg_svipc_cmd);
  1303. /* Fall through */
  1304. case AUE_SEMOP:
  1305. if (ARG_IS_VALID(kar, ARG_SVIPC_ID)) {
  1306. tok = au_to_arg32(1, "sem ID", ar->ar_arg_svipc_id);
  1307. kau_write(rec, tok);
  1308. if (ar->ar_errno != EINVAL) {
  1309. tok = au_to_ipc(AT_IPC_SEM,
  1310. ar->ar_arg_svipc_id);
  1311. kau_write(rec, tok);
  1312. }
  1313. }
  1314. break;
  1315. case AUE_SEMGET:
  1316. if (ar->ar_errno == 0) {
  1317. if (ARG_IS_VALID(kar, ARG_SVIPC_ID)) {
  1318. tok = au_to_ipc(AT_IPC_SEM,
  1319. ar->ar_arg_svipc_id);
  1320. kau_write(rec, tok);
  1321. }
  1322. }
  1323. break;
  1324. case AUE_SETEGID:
  1325. if (ARG_IS_VALID(kar, ARG_EGID)) {
  1326. tok = au_to_arg32(1, "egid", ar->ar_arg_egid);
  1327. kau_write(rec, tok);
  1328. }
  1329. break;
  1330. case AUE_SETEUID:
  1331. if (ARG_IS_VALID(kar, ARG_EUID)) {
  1332. tok = au_to_arg32(1, "euid", ar->ar_arg_euid);
  1333. kau_write(rec, tok);
  1334. }
  1335. break;
  1336. case AUE_SETREGID:
  1337. if (ARG_IS_VALID(kar, ARG_RGID)) {
  1338. tok = au_to_arg32(1, "rgid", ar->ar_arg_rgid);
  1339. kau_write(rec, tok);
  1340. }
  1341. if (ARG_IS_VALID(kar, ARG_EGID)) {
  1342. tok = au_to_arg32(2, "egid", ar->ar_arg_egid);
  1343. kau_write(rec, tok);
  1344. }
  1345. break;
  1346. case AUE_SETREUID:
  1347. if (ARG_IS_VALID(kar, ARG_RUID)) {
  1348. tok = au_to_arg32(1, "ruid", ar->ar_arg_ruid);
  1349. kau_write(rec, tok);
  1350. }
  1351. if (ARG_IS_VALID(kar, ARG_EUID)) {
  1352. tok = au_to_arg32(2, "euid", ar->ar_arg_euid);
  1353. kau_write(rec, tok);
  1354. }
  1355. break;
  1356. case AUE_SETRESGID:
  1357. if (ARG_IS_VALID(kar, ARG_RGID)) {
  1358. tok = au_to_arg32(1, "rgid", ar->ar_arg_rgid);
  1359. kau_write(rec, tok);
  1360. }
  1361. if (ARG_IS_VALID(kar, ARG_EGID)) {
  1362. tok = au_to_arg32(2, "egid", ar->ar_arg_egid);
  1363. kau_write(rec, tok);
  1364. }
  1365. if (ARG_IS_VALID(kar, ARG_SGID)) {
  1366. tok = au_to_arg32(3, "sgid", ar->ar_arg_sgid);
  1367. kau_write(rec, tok);
  1368. }
  1369. break;
  1370. case AUE_SETRESUID:
  1371. if (ARG_IS_VALID(kar, ARG_RUID)) {
  1372. tok = au_to_arg32(1, "ruid", ar->ar_arg_ruid);
  1373. kau_write(rec, tok);
  1374. }
  1375. if (ARG_IS_VALID(kar, ARG_EUID)) {
  1376. tok = au_to_arg32(2, "euid", ar->ar_arg_euid);
  1377. kau_write(rec, tok);
  1378. }
  1379. if (ARG_IS_VALID(kar, ARG_SUID)) {
  1380. tok = au_to_arg32(3, "suid", ar->ar_arg_suid);
  1381. kau_write(rec, tok);
  1382. }
  1383. break;
  1384. case AUE_SETGID:
  1385. if (ARG_IS_VALID(kar, ARG_GID)) {
  1386. tok = au_to_arg32(1, "gid", ar->ar_arg_gid);
  1387. kau_write(rec, tok);
  1388. }
  1389. break;
  1390. case AUE_SETUID:
  1391. if (ARG_IS_VALID(kar, ARG_UID)) {
  1392. tok = au_to_arg32(1, "uid", ar->ar_arg_uid);
  1393. kau_write(rec, tok);
  1394. }
  1395. break;
  1396. case AUE_SETGROUPS:
  1397. if (ARG_IS_VALID(kar, ARG_GROUPSET)) {
  1398. for(ctr = 0; ctr < ar->ar_arg_groups.gidset_size; ctr++)
  1399. {
  1400. tok = au_to_arg32(1, "setgroups",
  1401. ar->ar_arg_groups.gidset[ctr]);
  1402. kau_write(rec, tok);
  1403. }
  1404. }
  1405. break;
  1406. case AUE_SETLOGIN:
  1407. if (ARG_IS_VALID(kar, ARG_LOGIN)) {
  1408. tok = au_to_text(ar->ar_arg_login);
  1409. kau_write(rec, tok);
  1410. }
  1411. break;
  1412. case AUE_SETLOGINCLASS:
  1413. break;
  1414. case AUE_SETPRIORITY:
  1415. if (ARG_IS_VALID(kar, ARG_CMD)) {
  1416. tok = au_to_arg32(1, "which", ar->ar_arg_cmd);
  1417. kau_write(rec, tok);
  1418. }
  1419. if (ARG_IS_VALID(kar, ARG_UID)) {
  1420. tok = au_to_arg32(2, "who", ar->ar_arg_uid);
  1421. kau_write(rec, tok);
  1422. }
  1423. PROCESS_PID_TOKENS(2);
  1424. if (ARG_IS_VALID(kar, ARG_VALUE)) {
  1425. tok = au_to_arg32(3, "priority", ar->ar_arg_value);
  1426. kau_write(rec, tok);
  1427. }
  1428. break;
  1429. case AUE_SETPRIVEXEC:
  1430. if (ARG_IS_VALID(kar, ARG_VALUE)) {
  1431. tok = au_to_arg32(1, "flag", ar->ar_arg_value);
  1432. kau_write(rec, tok);
  1433. }
  1434. break;
  1435. /* AUE_SHMAT, AUE_SHMCTL, AUE_SHMDT and AUE_SHMGET are SysV IPC */
  1436. case AUE_SHMAT:
  1437. if (ARG_IS_VALID(kar, ARG_SVIPC_ID)) {
  1438. tok = au_to_arg32(1, "shmid", ar->ar_arg_svipc_id);
  1439. kau_write(rec, tok);
  1440. /* XXXAUDIT: Does having the ipc token make sense? */
  1441. tok = au_to_ipc(AT_IPC_SHM, ar->ar_arg_svipc_id);
  1442. kau_write(rec, tok);
  1443. }
  1444. if (ARG_IS_VALID(kar, ARG_SVIPC_ADDR)) {
  1445. tok = au_to_arg32(2, "shmaddr",
  1446. (int)(uintptr_t)ar->ar_arg_svipc_addr);
  1447. kau_write(rec, tok);
  1448. }
  1449. if (ARG_IS_VALID(kar, ARG_SVIPC_PERM)) {
  1450. tok = au_to_ipc_perm(&ar->ar_arg_svipc_perm);
  1451. kau_write(rec, tok);
  1452. }
  1453. break;
  1454. case AUE_SHMCTL:
  1455. if (ARG_IS_VALID(kar, ARG_SVIPC_ID)) {
  1456. tok = au_to_arg32(1, "shmid", ar->ar_arg_svipc_id);
  1457. kau_write(rec, tok);
  1458. /* XXXAUDIT: Does having the ipc token make sense? */
  1459. tok = au_to_ipc(AT_IPC_SHM, ar->ar_arg_svipc_id);
  1460. kau_write(rec, tok);
  1461. }
  1462. switch (ar->ar_arg_svipc_cmd) {
  1463. case IPC_STAT:
  1464. ar->ar_event = AUE_SHMCTL_STAT;
  1465. break;
  1466. case IPC_RMID:
  1467. ar->ar_event = AUE_SHMCTL_RMID;
  1468. break;
  1469. case IPC_SET:
  1470. ar->ar_event = AUE_SHMCTL_SET;
  1471. if (ARG_IS_VALID(kar, ARG_SVIPC_PERM)) {
  1472. tok = au_to_ipc_perm(&ar->ar_arg_svipc_perm);
  1473. kau_write(rec, tok);
  1474. }
  1475. break;
  1476. default:
  1477. break; /* We will audit a bad command */
  1478. }
  1479. break;
  1480. case AUE_SHMDT:
  1481. if (ARG_IS_VALID(kar, ARG_SVIPC_ADDR)) {
  1482. tok = au_to_arg32(1, "shmaddr",
  1483. (int)(uintptr_t)ar->ar_arg_svipc_addr);
  1484. kau_write(rec, tok);
  1485. }
  1486. break;
  1487. case AUE_SHMGET:
  1488. /* This is unusual; the return value is in an argument token */
  1489. if (ARG_IS_VALID(kar, ARG_SVIPC_ID)) {
  1490. tok = au_to_arg32(0, "shmid", ar->ar_arg_svipc_id);
  1491. kau_write(rec, tok);
  1492. tok = au_to_ipc(AT_IPC_SHM, ar->ar_arg_svipc_id);
  1493. kau_write(rec, tok);
  1494. }
  1495. if (ARG_IS_VALID(kar, ARG_SVIPC_PERM)) {
  1496. tok = au_to_ipc_perm(&ar->ar_arg_svipc_perm);
  1497. kau_write(rec, tok);
  1498. }
  1499. break;
  1500. /* shm_rename is a non-Posix extension to the Posix shm implementation */
  1501. case AUE_SHMRENAME:
  1502. UPATH1_TOKENS;
  1503. UPATH2_TOKENS;
  1504. if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
  1505. tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
  1506. kau_write(rec, tok);
  1507. }
  1508. break;
  1509. /* AUE_SHMOPEN, AUE_SHMUNLINK, AUE_SEMOPEN, AUE_SEMCLOSE
  1510. * and AUE_SEMUNLINK are Posix IPC */
  1511. case AUE_SHMOPEN:
  1512. if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
  1513. tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
  1514. kau_write(rec, tok);
  1515. }
  1516. if (ARG_IS_VALID(kar, ARG_MODE)) {
  1517. tok = au_to_arg32(3, "mode", ar->ar_arg_mode);
  1518. kau_write(rec, tok);
  1519. }
  1520. /* FALLTHROUGH */
  1521. case AUE_SHMUNLINK:
  1522. UPATH1_TOKENS;
  1523. if (ARG_IS_VALID(kar, ARG_POSIX_IPC_PERM)) {
  1524. struct ipc_perm perm;
  1525. perm.uid = ar->ar_arg_pipc_perm.pipc_uid;
  1526. perm.gid = ar->ar_arg_pipc_perm.pipc_gid;
  1527. perm.cuid = ar->ar_arg_pipc_perm.pipc_uid;
  1528. perm.cgid = ar->ar_arg_pipc_perm.pipc_gid;
  1529. perm.mode = ar->ar_arg_pipc_perm.pipc_mode;
  1530. perm.seq = 0;
  1531. perm.key = 0;
  1532. tok = au_to_ipc_perm(&perm);
  1533. kau_write(rec, tok);
  1534. }
  1535. break;
  1536. case AUE_SEMOPEN:
  1537. if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
  1538. tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
  1539. kau_write(rec, tok);
  1540. }
  1541. if (ARG_IS_VALID(kar, ARG_MODE)) {
  1542. tok = au_to_arg32(3, "mode", ar->ar_arg_mode);
  1543. kau_write(rec, tok);
  1544. }
  1545. if (ARG_IS_VALID(kar, ARG_VALUE)) {
  1546. tok = au_to_arg32(4, "value", ar->ar_arg_value);
  1547. kau_write(rec, tok);
  1548. }
  1549. /* FALLTHROUGH */
  1550. case AUE_SEMUNLINK:
  1551. if (ARG_IS_VALID(kar, ARG_TEXT)) {
  1552. tok = au_to_text(ar->ar_arg_text);
  1553. kau_write(rec, tok);
  1554. }
  1555. if (ARG_IS_VALID(kar, ARG_POSIX_IPC_PERM)) {
  1556. struct ipc_perm perm;
  1557. perm.uid = ar->ar_arg_pipc_perm.pipc_uid;
  1558. perm.gid = ar->ar_arg_pipc_perm.pipc_gid;
  1559. perm.cuid = ar->ar_arg_pipc_perm.pipc_uid;
  1560. perm.cgid = ar->ar_arg_pipc_perm.pipc_gid;
  1561. perm.mode = ar->ar_arg_pipc_perm.pipc_mode;
  1562. perm.seq = 0;
  1563. perm.key = 0;
  1564. tok = au_to_ipc_perm(&perm);
  1565. kau_write(rec, tok);
  1566. }
  1567. break;
  1568. case AUE_SEMCLOSE:
  1569. if (ARG_IS_VALID(kar, ARG_FD)) {
  1570. tok = au_to_arg32(1, "sem", ar->ar_arg_fd);
  1571. kau_write(rec, tok);
  1572. }
  1573. break;
  1574. case AUE_SYMLINK:
  1575. case AUE_SYMLINKAT:
  1576. if (ARG_IS_VALID(kar, ARG_TEXT)) {
  1577. tok = au_to_text(ar->ar_arg_text);
  1578. kau_write(rec, tok);
  1579. }
  1580. ATFD1_TOKENS(1);
  1581. UPATH1_VNODE1_TOKENS;
  1582. break;
  1583. case AUE_SYSCTL:
  1584. case AUE_SYSCTL_NONADMIN:
  1585. if (ARG_IS_VALID(kar, ARG_CTLNAME | ARG_LEN)) {
  1586. for (ctr = 0; ctr < ar->ar_arg_len; ctr++) {
  1587. tok = au_to_arg32(1, "name",
  1588. ar->ar_arg_ctlname[ctr]);
  1589. kau_write(rec, tok);
  1590. }
  1591. }
  1592. if (ARG_IS_VALID(kar, ARG_VALUE)) {
  1593. tok = au_to_arg32(5, "newval", ar->ar_arg_value);
  1594. kau_write(rec, tok);
  1595. }
  1596. if (ARG_IS_VALID(kar, ARG_TEXT)) {
  1597. tok = au_to_text(ar->ar_arg_text);
  1598. kau_write(rec, tok);
  1599. }
  1600. break;
  1601. case AUE_UMASK:
  1602. if (ARG_IS_VALID(kar, ARG_MASK)) {
  1603. tok = au_to_arg32(1, "new mask", ar->ar_arg_mask);
  1604. kau_write(rec, tok);
  1605. }
  1606. tok = au_to_arg32(0, "prev mask", ar->ar_retval);
  1607. kau_write(rec, tok);
  1608. break;
  1609. case AUE_WAIT4:
  1610. case AUE_WAIT6:
  1611. PROCESS_PID_TOKENS(1);
  1612. if (ARG_IS_VALID(kar, ARG_VALUE)) {
  1613. tok = au_to_arg32(3, "options", ar->ar_arg_value);
  1614. kau_write(rec, tok);
  1615. }
  1616. break;
  1617. case AUE_CAP_RIGHTS_LIMIT:
  1618. /*
  1619. * XXXRW/XXXJA: Would be nice to audit socket/etc information.
  1620. */
  1621. FD_VNODE1_TOKENS;
  1622. if (ARG_IS_VALID(kar, ARG_RIGHTS)) {
  1623. tok = au_to_rights(&ar->ar_arg_rights);
  1624. kau_write(rec, tok);
  1625. }
  1626. break;
  1627. case AUE_CAP_FCNTLS_GET:
  1628. case AUE_CAP_IOCTLS_GET:
  1629. case AUE_CAP_IOCTLS_LIMIT:
  1630. case AUE_CAP_RIGHTS_GET:
  1631. if (ARG_IS_VALID(kar, ARG_FD)) {
  1632. tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
  1633. kau_write(rec, tok);
  1634. }
  1635. break;
  1636. case AUE_CAP_FCNTLS_LIMIT:
  1637. FD_VNODE1_TOKENS;
  1638. if (ARG_IS_VALID(kar, ARG_FCNTL_RIGHTS)) {
  1639. tok = au_to_arg32(2, "fcntlrights",
  1640. ar->ar_arg_fcntl_rights);
  1641. kau_write(rec, tok);
  1642. }
  1643. break;
  1644. case AUE_CAP_ENTER:
  1645. case AUE_CAP_GETMODE:
  1646. break;
  1647. case AUE_THR_NEW:
  1648. case AUE_THR_KILL:
  1649. case AUE_THR_EXIT:
  1650. break;
  1651. case AUE_NULL:
  1652. default:
  1653. printf("BSM conversion requested for unknown event %d\n",
  1654. ar->ar_event);
  1655. /*
  1656. * Write the subject token so it is properly freed here.
  1657. */
  1658. if (jail_tok != NULL)
  1659. kau_write(rec, jail_tok);
  1660. kau_write(rec, subj_tok);
  1661. kau_free(rec);
  1662. return (BSM_NOAUDIT);
  1663. }
  1664. if (jail_tok != NULL)
  1665. kau_write(rec, jail_tok);
  1666. kau_write(rec, subj_tok);
  1667. tok = au_to_return32(au_errno_to_bsm(ar->ar_errno), ar->ar_retval);
  1668. kau_write(rec, tok); /* Every record gets a return token */
  1669. kau_close(rec, &ar->ar_endtime, ar->ar_event);
  1670. *pau = rec;
  1671. return (BSM_SUCCESS);
  1672. }
  1673. /*
  1674. * Verify that a record is a valid BSM record. This verification is simple
  1675. * now, but may be expanded on sometime in the future. Return 1 if the
  1676. * record is good, 0 otherwise.
  1677. */
  1678. int
  1679. bsm_rec_verify(void *rec)
  1680. {
  1681. char c = *(char *)rec;
  1682. /*
  1683. * Check the token ID of the first token; it has to be a header
  1684. * token.
  1685. *
  1686. * XXXAUDIT There needs to be a token structure to map a token.
  1687. * XXXAUDIT 'Shouldn't be simply looking at the first char.
  1688. */
  1689. if ((c != AUT_HEADER32) && (c != AUT_HEADER32_EX) &&
  1690. (c != AUT_HEADER64) && (c != AUT_HEADER64_EX))
  1691. return (0);
  1692. return (1);
  1693. }