LCOV - code coverage report
Current view: top level - security/apparmor - net.c (source / functions) Hit Total Coverage
Test: gcov_data_raspi2_qemu_modules_combined.info Lines: 0 46 0.0 %
Date: 2020-09-30 20:25:01 Functions: 0 6 0.0 %
Branches: 0 28 0.0 %

           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
       6                 :            :  *
       7                 :            :  * Copyright (C) 1998-2008 Novell/SUSE
       8                 :            :  * Copyright 2009-2017 Canonical Ltd.
       9                 :            :  */
      10                 :            : 
      11                 :            : #include "include/apparmor.h"
      12                 :            : #include "include/audit.h"
      13                 :            : #include "include/cred.h"
      14                 :            : #include "include/label.h"
      15                 :            : #include "include/net.h"
      16                 :            : #include "include/policy.h"
      17                 :            : #include "include/secid.h"
      18                 :            : 
      19                 :            : #include "net_names.h"
      20                 :            : 
      21                 :            : 
      22                 :            : struct aa_sfs_entry aa_sfs_entry_network[] = {
      23                 :            :         AA_SFS_FILE_STRING("af_mask", AA_SFS_AF_MASK),
      24                 :            :         { }
      25                 :            : };
      26                 :            : 
      27                 :            : static const char * const net_mask_names[] = {
      28                 :            :         "unknown",
      29                 :            :         "send",
      30                 :            :         "receive",
      31                 :            :         "unknown",
      32                 :            : 
      33                 :            :         "create",
      34                 :            :         "shutdown",
      35                 :            :         "connect",
      36                 :            :         "unknown",
      37                 :            : 
      38                 :            :         "setattr",
      39                 :            :         "getattr",
      40                 :            :         "setcred",
      41                 :            :         "getcred",
      42                 :            : 
      43                 :            :         "chmod",
      44                 :            :         "chown",
      45                 :            :         "chgrp",
      46                 :            :         "lock",
      47                 :            : 
      48                 :            :         "mmap",
      49                 :            :         "mprot",
      50                 :            :         "unknown",
      51                 :            :         "unknown",
      52                 :            : 
      53                 :            :         "accept",
      54                 :            :         "bind",
      55                 :            :         "listen",
      56                 :            :         "unknown",
      57                 :            : 
      58                 :            :         "setopt",
      59                 :            :         "getopt",
      60                 :            :         "unknown",
      61                 :            :         "unknown",
      62                 :            : 
      63                 :            :         "unknown",
      64                 :            :         "unknown",
      65                 :            :         "unknown",
      66                 :            :         "unknown",
      67                 :            : };
      68                 :            : 
      69                 :            : 
      70                 :            : /* audit callback for net specific fields */
      71                 :          0 : void audit_net_cb(struct audit_buffer *ab, void *va)
      72                 :            : {
      73                 :            :         struct common_audit_data *sa = va;
      74                 :            : 
      75                 :          0 :         audit_log_format(ab, " family=");
      76         [ #  # ]:          0 :         if (address_family_names[sa->u.net->family])
      77                 :          0 :                 audit_log_string(ab, address_family_names[sa->u.net->family]);
      78                 :            :         else
      79                 :          0 :                 audit_log_format(ab, "\"unknown(%d)\"", sa->u.net->family);
      80                 :          0 :         audit_log_format(ab, " sock_type=");
      81         [ #  # ]:          0 :         if (sock_type_names[aad(sa)->net.type])
      82                 :          0 :                 audit_log_string(ab, sock_type_names[aad(sa)->net.type]);
      83                 :            :         else
      84                 :          0 :                 audit_log_format(ab, "\"unknown(%d)\"", aad(sa)->net.type);
      85                 :          0 :         audit_log_format(ab, " protocol=%d", aad(sa)->net.protocol);
      86                 :            : 
      87         [ #  # ]:          0 :         if (aad(sa)->request & NET_PERMS_MASK) {
      88                 :          0 :                 audit_log_format(ab, " requested_mask=");
      89                 :          0 :                 aa_audit_perm_mask(ab, aad(sa)->request, NULL, 0,
      90                 :            :                                    net_mask_names, NET_PERMS_MASK);
      91                 :            : 
      92         [ #  # ]:          0 :                 if (aad(sa)->denied & NET_PERMS_MASK) {
      93                 :          0 :                         audit_log_format(ab, " denied_mask=");
      94                 :          0 :                         aa_audit_perm_mask(ab, aad(sa)->denied, NULL, 0,
      95                 :            :                                            net_mask_names, NET_PERMS_MASK);
      96                 :            :                 }
      97                 :            :         }
      98         [ #  # ]:          0 :         if (aad(sa)->peer) {
      99                 :          0 :                 audit_log_format(ab, " peer=");
     100                 :          0 :                 aa_label_xaudit(ab, labels_ns(aad(sa)->label), aad(sa)->peer,
     101                 :            :                                 FLAGS_NONE, GFP_ATOMIC);
     102                 :            :         }
     103                 :          0 : }
     104                 :            : 
     105                 :            : /* Generic af perm */
     106                 :          0 : int aa_profile_af_perm(struct aa_profile *profile, struct common_audit_data *sa,
     107                 :            :                        u32 request, u16 family, int type)
     108                 :            : {
     109                 :          0 :         struct aa_perms perms = { };
     110                 :            :         unsigned int state;
     111                 :            :         __be16 buffer[2];
     112                 :            : 
     113                 :            :         AA_BUG(family >= AF_MAX);
     114                 :            :         AA_BUG(type < 0 || type >= SOCK_MAX);
     115                 :            : 
     116         [ #  # ]:          0 :         if (profile_unconfined(profile))
     117                 :            :                 return 0;
     118                 :          0 :         state = PROFILE_MEDIATES(profile, AA_CLASS_NET);
     119         [ #  # ]:          0 :         if (!state)
     120                 :            :                 return 0;
     121                 :            : 
     122                 :          0 :         buffer[0] = cpu_to_be16(family);
     123                 :          0 :         buffer[1] = cpu_to_be16((u16) type);
     124                 :          0 :         state = aa_dfa_match_len(profile->policy.dfa, state, (char *) &buffer,
     125                 :            :                                  4);
     126                 :          0 :         aa_compute_perms(profile->policy.dfa, state, &perms);
     127                 :          0 :         aa_apply_modes_to_perms(profile, &perms);
     128                 :            : 
     129                 :          0 :         return aa_check_perms(profile, &perms, request, sa, audit_net_cb);
     130                 :            : }
     131                 :            : 
     132                 :          0 : int aa_af_perm(struct aa_label *label, const char *op, u32 request, u16 family,
     133                 :            :                int type, int protocol)
     134                 :            : {
     135                 :            :         struct aa_profile *profile;
     136                 :          0 :         DEFINE_AUDIT_NET(sa, op, NULL, family, type, protocol);
     137                 :            : 
     138   [ #  #  #  # ]:          0 :         return fn_for_each_confined(label, profile,
     139                 :            :                         aa_profile_af_perm(profile, &sa, request, family,
     140                 :            :                                            type));
     141                 :            : }
     142                 :            : 
     143                 :          0 : static int aa_label_sk_perm(struct aa_label *label, const char *op, u32 request,
     144                 :            :                             struct sock *sk)
     145                 :            : {
     146                 :            :         int error = 0;
     147                 :            : 
     148                 :            :         AA_BUG(!label);
     149                 :            :         AA_BUG(!sk);
     150                 :            : 
     151         [ #  # ]:          0 :         if (!unconfined(label)) {
     152                 :            :                 struct aa_profile *profile;
     153   [ #  #  #  # ]:          0 :                 DEFINE_AUDIT_SK(sa, op, sk);
     154                 :            : 
     155   [ #  #  #  # ]:          0 :                 error = fn_for_each_confined(label, profile,
     156                 :            :                             aa_profile_af_sk_perm(profile, &sa, request, sk));
     157                 :            :         }
     158                 :            : 
     159                 :          0 :         return error;
     160                 :            : }
     161                 :            : 
     162                 :          0 : int aa_sk_perm(const char *op, u32 request, struct sock *sk)
     163                 :            : {
     164                 :            :         struct aa_label *label;
     165                 :            :         int error;
     166                 :            : 
     167                 :            :         AA_BUG(!sk);
     168                 :            :         AA_BUG(in_interrupt());
     169                 :            : 
     170                 :            :         /* TODO: switch to begin_current_label ???? */
     171                 :          0 :         label = begin_current_label_crit_section();
     172                 :          0 :         error = aa_label_sk_perm(label, op, request, sk);
     173                 :          0 :         end_current_label_crit_section(label);
     174                 :            : 
     175                 :          0 :         return error;
     176                 :            : }
     177                 :            : 
     178                 :            : 
     179                 :          0 : int aa_sock_file_perm(struct aa_label *label, const char *op, u32 request,
     180                 :            :                       struct socket *sock)
     181                 :            : {
     182                 :            :         AA_BUG(!label);
     183                 :            :         AA_BUG(!sock);
     184                 :            :         AA_BUG(!sock->sk);
     185                 :            : 
     186                 :          0 :         return aa_label_sk_perm(label, op, request, sock->sk);
     187                 :            : }
     188                 :            : 
     189                 :            : #ifdef CONFIG_NETWORK_SECMARK
     190                 :            : static int apparmor_secmark_init(struct aa_secmark *secmark)
     191                 :            : {
     192                 :            :         struct aa_label *label;
     193                 :            : 
     194                 :            :         if (secmark->label[0] == '*') {
     195                 :            :                 secmark->secid = AA_SECID_WILDCARD;
     196                 :            :                 return 0;
     197                 :            :         }
     198                 :            : 
     199                 :            :         label = aa_label_strn_parse(&root_ns->unconfined->label,
     200                 :            :                                     secmark->label, strlen(secmark->label),
     201                 :            :                                     GFP_ATOMIC, false, false);
     202                 :            : 
     203                 :            :         if (IS_ERR(label))
     204                 :            :                 return PTR_ERR(label);
     205                 :            : 
     206                 :            :         secmark->secid = label->secid;
     207                 :            : 
     208                 :            :         return 0;
     209                 :            : }
     210                 :            : 
     211                 :            : static int aa_secmark_perm(struct aa_profile *profile, u32 request, u32 secid,
     212                 :            :                            struct common_audit_data *sa, struct sock *sk)
     213                 :            : {
     214                 :            :         int i, ret;
     215                 :            :         struct aa_perms perms = { };
     216                 :            : 
     217                 :            :         if (profile->secmark_count == 0)
     218                 :            :                 return 0;
     219                 :            : 
     220                 :            :         for (i = 0; i < profile->secmark_count; i++) {
     221                 :            :                 if (!profile->secmark[i].secid) {
     222                 :            :                         ret = apparmor_secmark_init(&profile->secmark[i]);
     223                 :            :                         if (ret)
     224                 :            :                                 return ret;
     225                 :            :                 }
     226                 :            : 
     227                 :            :                 if (profile->secmark[i].secid == secid ||
     228                 :            :                     profile->secmark[i].secid == AA_SECID_WILDCARD) {
     229                 :            :                         if (profile->secmark[i].deny)
     230                 :            :                                 perms.deny = ALL_PERMS_MASK;
     231                 :            :                         else
     232                 :            :                                 perms.allow = ALL_PERMS_MASK;
     233                 :            : 
     234                 :            :                         if (profile->secmark[i].audit)
     235                 :            :                                 perms.audit = ALL_PERMS_MASK;
     236                 :            :                 }
     237                 :            :         }
     238                 :            : 
     239                 :            :         aa_apply_modes_to_perms(profile, &perms);
     240                 :            : 
     241                 :            :         return aa_check_perms(profile, &perms, request, sa, audit_net_cb);
     242                 :            : }
     243                 :            : 
     244                 :            : int apparmor_secmark_check(struct aa_label *label, char *op, u32 request,
     245                 :            :                            u32 secid, struct sock *sk)
     246                 :            : {
     247                 :            :         struct aa_profile *profile;
     248                 :            :         DEFINE_AUDIT_SK(sa, op, sk);
     249                 :            : 
     250                 :            :         return fn_for_each_confined(label, profile,
     251                 :            :                                     aa_secmark_perm(profile, request, secid,
     252                 :            :                                                     &sa, sk));
     253                 :            : }
     254                 :            : #endif

Generated by: LCOV version 1.14