blob: 3ed4fea2a2de354a3888dee9dcca6b5a6023f7d2 [file] [log] [blame]
Thomas Gleixner1ccea772019-05-19 15:51:43 +02001// SPDX-License-Identifier: GPL-2.0-or-later
Paul Moored15c3452006-08-03 16:48:37 -07002/*
3 * NetLabel NETLINK Interface
4 *
5 * This file defines the NETLINK interface for the NetLabel system. The
6 * NetLabel system manages static and dynamic label mappings for network
7 * protocols such as CIPSO and RIPSO.
8 *
Paul Moore82c21bf2011-08-01 11:10:33 +00009 * Author: Paul Moore <paul@paul-moore.com>
Paul Moored15c3452006-08-03 16:48:37 -070010 */
11
12/*
13 * (c) Copyright Hewlett-Packard Development Company, L.P., 2006
Paul Moored15c3452006-08-03 16:48:37 -070014 */
15
16#include <linux/init.h>
17#include <linux/types.h>
18#include <linux/list.h>
19#include <linux/socket.h>
Paul Moore32f50cd2006-09-28 14:51:47 -070020#include <linux/audit.h>
21#include <linux/tty.h>
22#include <linux/security.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090023#include <linux/gfp.h>
Paul Moored15c3452006-08-03 16:48:37 -070024#include <net/sock.h>
25#include <net/netlink.h>
26#include <net/genetlink.h>
27#include <net/netlabel.h>
28#include <asm/bug.h>
29
30#include "netlabel_mgmt.h"
31#include "netlabel_unlabeled.h"
32#include "netlabel_cipso_v4.h"
Huw Daviescb72d382016-06-27 15:02:46 -040033#include "netlabel_calipso.h"
Paul Moored15c3452006-08-03 16:48:37 -070034#include "netlabel_user.h"
35
36/*
37 * NetLabel NETLINK Setup Functions
38 */
39
40/**
41 * netlbl_netlink_init - Initialize the NETLINK communication channel
42 *
43 * Description:
44 * Call out to the NetLabel components so they can register their families and
45 * commands with the Generic NETLINK mechanism. Returns zero on success and
46 * non-zero on failure.
47 *
48 */
Pavel Emelyanov05705e42008-02-17 22:33:57 -080049int __init netlbl_netlink_init(void)
Paul Moored15c3452006-08-03 16:48:37 -070050{
51 int ret_val;
52
53 ret_val = netlbl_mgmt_genl_init();
54 if (ret_val != 0)
55 return ret_val;
56
57 ret_val = netlbl_cipsov4_genl_init();
58 if (ret_val != 0)
59 return ret_val;
60
Huw Daviescb72d382016-06-27 15:02:46 -040061 ret_val = netlbl_calipso_genl_init();
62 if (ret_val != 0)
63 return ret_val;
64
Fabian Frederick16b99a42014-10-08 20:37:01 +020065 return netlbl_unlabel_genl_init();
Paul Moored15c3452006-08-03 16:48:37 -070066}
Paul Moore32f50cd2006-09-28 14:51:47 -070067
68/*
69 * NetLabel Audit Functions
70 */
71
72/**
73 * netlbl_audit_start_common - Start an audit message
74 * @type: audit message type
Paul Moore95d4e6b2006-09-29 17:05:05 -070075 * @audit_info: NetLabel audit information
Paul Moore32f50cd2006-09-28 14:51:47 -070076 *
77 * Description:
78 * Start an audit message using the type specified in @type and fill the audit
79 * message with some fields common to all NetLabel audit messages. Returns
80 * a pointer to the audit buffer on success, NULL on failure.
81 *
82 */
Paul Moore95d4e6b2006-09-29 17:05:05 -070083struct audit_buffer *netlbl_audit_start_common(int type,
84 struct netlbl_audit *audit_info)
Paul Moore32f50cd2006-09-28 14:51:47 -070085{
Paul Moore32f50cd2006-09-28 14:51:47 -070086 struct audit_buffer *audit_buf;
Paul Moore32f50cd2006-09-28 14:51:47 -070087 char *secctx;
88 u32 secctx_len;
89
Richard Guy Briggsf7859592018-06-05 19:20:39 -040090 if (audit_enabled == AUDIT_OFF)
Paul Moorede646882006-11-17 17:38:55 -050091 return NULL;
92
Richard Guy Briggscdfb6b32018-05-12 21:58:20 -040093 audit_buf = audit_log_start(audit_context(), GFP_ATOMIC, type);
Paul Moore32f50cd2006-09-28 14:51:47 -070094 if (audit_buf == NULL)
95 return NULL;
96
Eric Paris25323862008-04-18 10:09:25 -040097 audit_log_format(audit_buf, "netlabel: auid=%u ses=%u",
Eric W. Biedermane1760bd2012-09-10 22:39:43 -070098 from_kuid(&init_user_ns, audit_info->loginuid),
Eric Paris25323862008-04-18 10:09:25 -040099 audit_info->sessionid);
Paul Moore32f50cd2006-09-28 14:51:47 -0700100
Paul Moore95d4e6b2006-09-29 17:05:05 -0700101 if (audit_info->secid != 0 &&
102 security_secid_to_secctx(audit_info->secid,
103 &secctx,
Paul Mooree6e08712007-08-01 11:12:59 -0400104 &secctx_len) == 0) {
Paul Moore32f50cd2006-09-28 14:51:47 -0700105 audit_log_format(audit_buf, " subj=%s", secctx);
Paul Mooree6e08712007-08-01 11:12:59 -0400106 security_release_secctx(secctx, secctx_len);
107 }
Paul Moore32f50cd2006-09-28 14:51:47 -0700108
109 return audit_buf;
110}