xref: /freebsd/sys/security/audit/bsm_domain.c (revision a0ee8cc6)
1 /*-
2  * Copyright (c) 2008 Apple Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
21  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
26  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
32 
33 #include <sys/param.h>
34 #include <sys/socket.h>
35 
36 #include <security/audit/audit.h>
37 
38 #include <bsm/audit_domain.h>
39 #include <bsm/audit_record.h>
40 
41 struct bsm_domain {
42 	u_short	bd_bsm_domain;
43 	int	bd_local_domain;
44 };
45 
46 #define	PF_NO_LOCAL_MAPPING	-600
47 
48 static const struct bsm_domain bsm_domains[] = {
49 	{ BSM_PF_UNSPEC, PF_UNSPEC },
50 	{ BSM_PF_LOCAL, PF_LOCAL },
51 	{ BSM_PF_INET, PF_INET },
52 	{ BSM_PF_IMPLINK,
53 #ifdef PF_IMPLINK
54 	PF_IMPLINK
55 #else
56 	PF_NO_LOCAL_MAPPING
57 #endif
58 	},
59 	{ BSM_PF_PUP,
60 #ifdef PF_PUP
61 	PF_PUP
62 #else
63 	PF_NO_LOCAL_MAPPING
64 #endif
65 	},
66 	{ BSM_PF_CHAOS,
67 #ifdef PF_CHAOS
68 	PF_CHAOS
69 #else
70 	PF_NO_LOCAL_MAPPING
71 #endif
72 	},
73 	{ BSM_PF_NS,
74 #ifdef PF_NS
75 	PF_NS
76 #else
77 	PF_NO_LOCAL_MAPPING
78 #endif
79 	},
80 	{ BSM_PF_NBS,
81 #ifdef PF_NBS
82 	PF_NBS
83 #else
84 	PF_NO_LOCAL_MAPPING
85 #endif
86 	},
87 	{ BSM_PF_ECMA,
88 #ifdef PF_ECMA
89 	PF_ECMA
90 #else
91 	PF_NO_LOCAL_MAPPING
92 #endif
93 	},
94 	{ BSM_PF_DATAKIT,
95 #ifdef PF_DATAKIT
96 	PF_DATAKIT
97 #else
98 	PF_NO_LOCAL_MAPPING
99 #endif
100 	},
101 	{ BSM_PF_CCITT,
102 #ifdef PF_CCITT
103 	PF_CCITT
104 #else
105 	PF_NO_LOCAL_MAPPING
106 #endif
107 	},
108 	{ BSM_PF_SNA, PF_SNA },
109 	{ BSM_PF_DECnet, PF_DECnet },
110 	{ BSM_PF_DLI,
111 #ifdef PF_DLI
112 	PF_DLI
113 #else
114 	PF_NO_LOCAL_MAPPING
115 #endif
116 	},
117 	{ BSM_PF_LAT,
118 #ifdef PF_LAT
119 	PF_LAT
120 #else
121 	PF_NO_LOCAL_MAPPING
122 #endif
123 	},
124 	{ BSM_PF_HYLINK,
125 #ifdef PF_HYLINK
126 	PF_HYLINK
127 #else
128 	PF_NO_LOCAL_MAPPING
129 #endif
130 	},
131 	{ BSM_PF_APPLETALK, PF_APPLETALK },
132 	{ BSM_PF_NIT,
133 #ifdef PF_NIT
134 	PF_NIT
135 #else
136 	PF_NO_LOCAL_MAPPING
137 #endif
138 	},
139 	{ BSM_PF_802,
140 #ifdef PF_802
141 	PF_802
142 #else
143 	PF_NO_LOCAL_MAPPING
144 #endif
145 	},
146 	{ BSM_PF_OSI,
147 #ifdef PF_OSI
148 	PF_OSI
149 #else
150 	PF_NO_LOCAL_MAPPING
151 #endif
152 	},
153 	{ BSM_PF_X25,
154 #ifdef PF_X25
155 	PF_X25
156 #else
157 	PF_NO_LOCAL_MAPPING
158 #endif
159 	},
160 	{ BSM_PF_OSINET,
161 #ifdef PF_OSINET
162 	PF_OSINET
163 #else
164 	PF_NO_LOCAL_MAPPING
165 #endif
166 	},
167 	{ BSM_PF_GOSIP,
168 #ifdef PF_GOSIP
169 	PF_GOSIP
170 #else
171 	PF_NO_LOCAL_MAPPING
172 #endif
173 	},
174 	{ BSM_PF_IPX, PF_IPX },
175 	{ BSM_PF_ROUTE, PF_ROUTE },
176 	{ BSM_PF_LINK,
177 #ifdef PF_LINK
178 	PF_LINK
179 #else
180 	PF_NO_LOCAL_MAPPING
181 #endif
182 	},
183 	{ BSM_PF_INET6, PF_INET6 },
184 	{ BSM_PF_KEY, PF_KEY },
185 	{ BSM_PF_NCA,
186 #ifdef PF_NCA
187 	PF_NCA
188 #else
189 	PF_NO_LOCAL_MAPPING
190 #endif
191 	},
192 	{ BSM_PF_POLICY,
193 #ifdef PF_POLICY
194 	PF_POLICY
195 #else
196 	PF_NO_LOCAL_MAPPING
197 #endif
198 	},
199 	{ BSM_PF_INET_OFFLOAD,
200 #ifdef PF_INET_OFFLOAD
201 	PF_INET_OFFLOAD
202 #else
203 	PF_NO_LOCAL_MAPPING
204 #endif
205 	},
206 	{ BSM_PF_NETBIOS,
207 #ifdef PF_NETBIOS
208 	PF_NETBIOS
209 #else
210 	PF_NO_LOCAL_MAPPING
211 #endif
212 	},
213 	{ BSM_PF_ISO,
214 #ifdef PF_ISO
215 	PF_ISO
216 #else
217 	PF_NO_LOCAL_MAPPING
218 #endif
219 	},
220 	{ BSM_PF_XTP,
221 #ifdef PF_XTP
222 	PF_XTP
223 #else
224 	PF_NO_LOCAL_MAPPING
225 #endif
226 	},
227 	{ BSM_PF_COIP,
228 #ifdef PF_COIP
229 	PF_COIP
230 #else
231 	PF_NO_LOCAL_MAPPING
232 #endif
233 	},
234 	{ BSM_PF_CNT,
235 #ifdef PF_CNT
236 	PF_CNT
237 #else
238 	PF_NO_LOCAL_MAPPING
239 #endif
240 	},
241 	{ BSM_PF_RTIP,
242 #ifdef PF_RTIP
243 	PF_RTIP
244 #else
245 	PF_NO_LOCAL_MAPPING
246 #endif
247 	},
248 	{ BSM_PF_SIP,
249 #ifdef PF_SIP
250 	PF_SIP
251 #else
252 	PF_NO_LOCAL_MAPPING
253 #endif
254 	},
255 	{ BSM_PF_PIP,
256 #ifdef PF_PIP
257 	PF_PIP
258 #else
259 	PF_NO_LOCAL_MAPPING
260 #endif
261 	},
262 	{ BSM_PF_ISDN,
263 #ifdef PF_ISDN
264 	PF_ISDN
265 #else
266 	PF_NO_LOCAL_MAPPING
267 #endif
268 	},
269 	{ BSM_PF_E164,
270 #ifdef PF_E164
271 	PF_E164
272 #else
273 	PF_NO_LOCAL_MAPPING
274 #endif
275 	},
276 	{ BSM_PF_NATM,
277 #ifdef PF_NATM
278 	PF_NATM
279 #else
280 	PF_NO_LOCAL_MAPPING
281 #endif
282 	},
283 	{ BSM_PF_ATM,
284 #ifdef PF_ATM
285 	PF_ATM
286 #else
287 	PF_NO_LOCAL_MAPPING
288 #endif
289 	},
290 	{ BSM_PF_NETGRAPH,
291 #ifdef PF_NETGRAPH
292 	PF_NETGRAPH
293 #else
294 	PF_NO_LOCAL_MAPPING
295 #endif
296 	},
297 	{ BSM_PF_SLOW,
298 #ifdef PF_SLOW
299 	PF_SLOW
300 #else
301 	PF_NO_LOCAL_MAPPING
302 #endif
303 	},
304 	{ BSM_PF_SCLUSTER,
305 #ifdef PF_SCLUSTER
306 	PF_SCLUSTER
307 #else
308 	PF_NO_LOCAL_MAPPING
309 #endif
310 	},
311 	{ BSM_PF_ARP,
312 #ifdef PF_ARP
313 	PF_ARP
314 #else
315 	PF_NO_LOCAL_MAPPING
316 #endif
317 	},
318 	{ BSM_PF_BLUETOOTH,
319 #ifdef PF_BLUETOOTH
320 	PF_BLUETOOTH
321 #else
322 	PF_NO_LOCAL_MAPPING
323 #endif
324 	},
325 	{ BSM_PF_AX25,
326 #ifdef PF_AX25
327 	PF_AX25
328 #else
329 	PF_NO_LOCAL_MAPPING
330 #endif
331 	},
332 	{ BSM_PF_ROSE,
333 #ifdef PF_ROSE
334 	PF_ROSE
335 #else
336 	PF_NO_LOCAL_MAPPING
337 #endif
338 	},
339 	{ BSM_PF_NETBEUI,
340 #ifdef PF_NETBEUI
341 	PF_NETBEUI
342 #else
343 	PF_NO_LOCAL_MAPPING
344 #endif
345 	},
346 	{ BSM_PF_SECURITY,
347 #ifdef PF_SECURITY
348 	PF_SECURITY
349 #else
350 	PF_NO_LOCAL_MAPPING
351 #endif
352 	},
353 	{ BSM_PF_PACKET,
354 #ifdef PF_PACKET
355 	PF_PACKET
356 #else
357 	PF_NO_LOCAL_MAPPING
358 #endif
359 	},
360 	{ BSM_PF_ASH,
361 #ifdef PF_ASH
362 	PF_ASH
363 #else
364 	PF_NO_LOCAL_MAPPING
365 #endif
366 	},
367 	{ BSM_PF_ECONET,
368 #ifdef PF_ECONET
369 	PF_ECONET
370 #else
371 	PF_NO_LOCAL_MAPPING
372 #endif
373 	},
374 	{ BSM_PF_ATMSVC,
375 #ifdef PF_ATMSVC
376 	PF_ATMSVC
377 #else
378 	PF_NO_LOCAL_MAPPING
379 #endif
380 	},
381 	{ BSM_PF_IRDA,
382 #ifdef PF_IRDA
383 	PF_IRDA
384 #else
385 	PF_NO_LOCAL_MAPPING
386 #endif
387 	},
388 	{ BSM_PF_PPPOX,
389 #ifdef PF_PPPOX
390 	PF_PPPOX
391 #else
392 	PF_NO_LOCAL_MAPPING
393 #endif
394 	},
395 	{ BSM_PF_WANPIPE,
396 #ifdef PF_WANPIPE
397 	PF_WANPIPE
398 #else
399 	PF_NO_LOCAL_MAPPING
400 #endif
401 	},
402 	{ BSM_PF_LLC,
403 #ifdef PF_LLC
404 	PF_LLC
405 #else
406 	PF_NO_LOCAL_MAPPING
407 #endif
408 	},
409 	{ BSM_PF_CAN,
410 #ifdef PF_CAN
411 	PF_CAN
412 #else
413 	PF_NO_LOCAL_MAPPING
414 #endif
415 	},
416 	{ BSM_PF_TIPC,
417 #ifdef PF_TIPC
418 	PF_TIPC
419 #else
420 	PF_NO_LOCAL_MAPPING
421 #endif
422 	},
423 	{ BSM_PF_IUCV,
424 #ifdef PF_IUCV
425 	PF_IUCV
426 #else
427 	PF_NO_LOCAL_MAPPING
428 #endif
429 	},
430 	{ BSM_PF_RXRPC,
431 #ifdef PF_RXRPC
432 	PF_RXRPC
433 #else
434 	PF_NO_LOCAL_MAPPING
435 #endif
436 	},
437 	{ BSM_PF_PHONET,
438 #ifdef PF_PHONET
439 	PF_PHONET
440 #else
441 	PF_NO_LOCAL_MAPPING
442 #endif
443 	},
444 };
445 static const int bsm_domains_count = sizeof(bsm_domains) /
446 	    sizeof(bsm_domains[0]);
447 
448 static const struct bsm_domain *
449 bsm_lookup_local_domain(int local_domain)
450 {
451 	int i;
452 
453 	for (i = 0; i < bsm_domains_count; i++) {
454 		if (bsm_domains[i].bd_local_domain == local_domain)
455 			return (&bsm_domains[i]);
456 	}
457 	return (NULL);
458 }
459 
460 u_short
461 au_domain_to_bsm(int local_domain)
462 {
463 	const struct bsm_domain *bstp;
464 
465 	bstp = bsm_lookup_local_domain(local_domain);
466 	if (bstp == NULL)
467 		return (BSM_PF_UNKNOWN);
468 	return (bstp->bd_bsm_domain);
469 }
470 
471 static const struct bsm_domain *
472 bsm_lookup_bsm_domain(u_short bsm_domain)
473 {
474 	int i;
475 
476 	for (i = 0; i < bsm_domains_count; i++) {
477 		if (bsm_domains[i].bd_bsm_domain == bsm_domain)
478 			return (&bsm_domains[i]);
479 	}
480 	return (NULL);
481 }
482 
483 int
484 au_bsm_to_domain(u_short bsm_domain, int *local_domainp)
485 {
486 	const struct bsm_domain *bstp;
487 
488 	bstp = bsm_lookup_bsm_domain(bsm_domain);
489 	if (bstp == NULL || bstp->bd_local_domain)
490 		return (-1);
491 	*local_domainp = bstp->bd_local_domain;
492 	return (0);
493 }
494