Thomas Gleixner | b886d83c | 2019-06-01 10:08:55 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
John Johansen | 56974a6 | 2017-07-18 23:18:33 -0700 | [diff] [blame] | 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. |
John Johansen | 56974a6 | 2017-07-18 23:18:33 -0700 | [diff] [blame] | 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 | |
Matthew Garrett | 9caafbe | 2018-05-24 13:27:46 -0700 | [diff] [blame] | 82 | struct aa_secmark { |
| 83 | u8 audit; |
| 84 | u8 deny; |
| 85 | u32 secid; |
| 86 | char *label; |
| 87 | }; |
| 88 | |
John Johansen | 56974a6 | 2017-07-18 23:18:33 -0700 | [diff] [blame] | 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 | return aa_profile_af_perm(profile, sa, request, sk->sk_family, |
| 102 | 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 | |
Matthew Garrett | 9caafbe | 2018-05-24 13:27:46 -0700 | [diff] [blame] | 109 | int apparmor_secmark_check(struct aa_label *label, char *op, u32 request, |
| 110 | u32 secid, struct sock *sk); |
| 111 | |
John Johansen | 56974a6 | 2017-07-18 23:18:33 -0700 | [diff] [blame] | 112 | #endif /* __AA_NET_H */ |