Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0-only */
2 : : /*
3 : : * AppArmor security module
4 : : *
5 : : * This file contains AppArmor network mediation definitions.
6 : : *
7 : : * Copyright (C) 1998-2008 Novell/SUSE
8 : : * Copyright 2009-2017 Canonical Ltd.
9 : : */
10 : :
11 : : #ifndef __AA_NET_H
12 : : #define __AA_NET_H
13 : :
14 : : #include <net/sock.h>
15 : : #include <linux/path.h>
16 : :
17 : : #include "apparmorfs.h"
18 : : #include "label.h"
19 : : #include "perms.h"
20 : : #include "policy.h"
21 : :
22 : : #define AA_MAY_SEND AA_MAY_WRITE
23 : : #define AA_MAY_RECEIVE AA_MAY_READ
24 : :
25 : : #define AA_MAY_SHUTDOWN AA_MAY_DELETE
26 : :
27 : : #define AA_MAY_CONNECT AA_MAY_OPEN
28 : : #define AA_MAY_ACCEPT 0x00100000
29 : :
30 : : #define AA_MAY_BIND 0x00200000
31 : : #define AA_MAY_LISTEN 0x00400000
32 : :
33 : : #define AA_MAY_SETOPT 0x01000000
34 : : #define AA_MAY_GETOPT 0x02000000
35 : :
36 : : #define NET_PERMS_MASK (AA_MAY_SEND | AA_MAY_RECEIVE | AA_MAY_CREATE | \
37 : : AA_MAY_SHUTDOWN | AA_MAY_BIND | AA_MAY_LISTEN | \
38 : : AA_MAY_CONNECT | AA_MAY_ACCEPT | AA_MAY_SETATTR | \
39 : : AA_MAY_GETATTR | AA_MAY_SETOPT | AA_MAY_GETOPT)
40 : :
41 : : #define NET_FS_PERMS (AA_MAY_SEND | AA_MAY_RECEIVE | AA_MAY_CREATE | \
42 : : AA_MAY_SHUTDOWN | AA_MAY_CONNECT | AA_MAY_RENAME |\
43 : : AA_MAY_SETATTR | AA_MAY_GETATTR | AA_MAY_CHMOD | \
44 : : AA_MAY_CHOWN | AA_MAY_CHGRP | AA_MAY_LOCK | \
45 : : AA_MAY_MPROT)
46 : :
47 : : #define NET_PEER_MASK (AA_MAY_SEND | AA_MAY_RECEIVE | AA_MAY_CONNECT | \
48 : : AA_MAY_ACCEPT)
49 : : struct aa_sk_ctx {
50 : : struct aa_label *label;
51 : : struct aa_label *peer;
52 : : };
53 : :
54 : : #define SK_CTX(X) ((X)->sk_security)
55 : : #define SOCK_ctx(X) SOCK_INODE(X)->i_security
56 : : #define DEFINE_AUDIT_NET(NAME, OP, SK, F, T, P) \
57 : : struct lsm_network_audit NAME ## _net = { .sk = (SK), \
58 : : .family = (F)}; \
59 : : DEFINE_AUDIT_DATA(NAME, \
60 : : ((SK) && (F) != AF_UNIX) ? LSM_AUDIT_DATA_NET : \
61 : : LSM_AUDIT_DATA_NONE, \
62 : : OP); \
63 : : NAME.u.net = &(NAME ## _net); \
64 : : aad(&NAME)->net.type = (T); \
65 : : aad(&NAME)->net.protocol = (P)
66 : :
67 : : #define DEFINE_AUDIT_SK(NAME, OP, SK) \
68 : : DEFINE_AUDIT_NET(NAME, OP, SK, (SK)->sk_family, (SK)->sk_type, \
69 : : (SK)->sk_protocol)
70 : :
71 : :
72 : : #define af_select(FAMILY, FN, DEF_FN) \
73 : : ({ \
74 : : int __e; \
75 : : switch ((FAMILY)) { \
76 : : default: \
77 : : __e = DEF_FN; \
78 : : } \
79 : : __e; \
80 : : })
81 : :
82 : : struct aa_secmark {
83 : : u8 audit;
84 : : u8 deny;
85 : : u32 secid;
86 : : char *label;
87 : : };
88 : :
89 : : extern struct aa_sfs_entry aa_sfs_entry_network[];
90 : :
91 : : void audit_net_cb(struct audit_buffer *ab, void *va);
92 : : int aa_profile_af_perm(struct aa_profile *profile, struct common_audit_data *sa,
93 : : u32 request, u16 family, int type);
94 : : int aa_af_perm(struct aa_label *label, const char *op, u32 request, u16 family,
95 : : int type, int protocol);
96 : : static inline int aa_profile_af_sk_perm(struct aa_profile *profile,
97 : : struct common_audit_data *sa,
98 : : u32 request,
99 : : struct sock *sk)
100 : : {
101 : 0 : return aa_profile_af_perm(profile, sa, request, sk->sk_family,
102 : 0 : sk->sk_type);
103 : : }
104 : : int aa_sk_perm(const char *op, u32 request, struct sock *sk);
105 : :
106 : : int aa_sock_file_perm(struct aa_label *label, const char *op, u32 request,
107 : : struct socket *sock);
108 : :
109 : : int apparmor_secmark_check(struct aa_label *label, char *op, u32 request,
110 : : u32 secid, struct sock *sk);
111 : :
112 : : #endif /* __AA_NET_H */
|