2019-06-01 10:08:55 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2010-07-29 14:48:05 -07:00
/*
* AppArmor security module
*
* This file contains AppArmor ipc mediation
*
* Copyright ( C ) 1998 - 2008 Novell / SUSE
2017-06-09 14:22:14 -07:00
* Copyright 2009 - 2017 Canonical Ltd .
2010-07-29 14:48:05 -07:00
*/
# include <linux/gfp.h>
# include "include/audit.h"
# include "include/capability.h"
2017-10-11 01:04:48 -07:00
# include "include/cred.h"
2010-07-29 14:48:05 -07:00
# include "include/policy.h"
2011-08-29 10:40:54 +10:00
# include "include/ipc.h"
2017-07-18 22:56:22 -07:00
# include "include/sig_names.h"
2010-07-29 14:48:05 -07:00
2017-07-18 22:56:22 -07:00
static inline int map_signal_num ( int sig )
{
if ( sig > SIGRTMAX )
return SIGUNKNOWN ;
else if ( sig > = SIGRTMIN )
2018-02-01 12:32:02 +01:00
return sig - SIGRTMIN + SIGRT_BASE ;
2017-11-08 08:09:52 -08:00
else if ( sig < MAXMAPPED_SIG )
2017-07-18 22:56:22 -07:00
return sig_map [ sig ] ;
return SIGUNKNOWN ;
}
/**
2020-07-13 15:51:59 -04:00
* audit_signal_mask - convert mask to permission string
2017-07-18 22:56:22 -07:00
* @ mask : permission mask to convert
2020-07-13 15:51:59 -04:00
*
* Returns : pointer to static string
2017-07-18 22:56:22 -07:00
*/
2020-07-13 15:51:59 -04:00
static const char * audit_signal_mask ( u32 mask )
2017-07-18 22:56:22 -07:00
{
if ( mask & MAY_READ )
2020-07-13 15:51:59 -04:00
return " receive " ;
2017-07-18 22:56:22 -07:00
if ( mask & MAY_WRITE )
2020-07-13 15:51:59 -04:00
return " send " ;
return " " ;
2017-07-18 22:56:22 -07:00
}
/**
2022-10-08 14:34:11 +08:00
* audit_signal_cb ( ) - call back for signal specific audit fields
2017-07-18 22:56:22 -07:00
* @ ab : audit_buffer ( NOT NULL )
* @ va : audit struct to audit values of ( NOT NULL )
*/
static void audit_signal_cb ( struct audit_buffer * ab , void * va )
{
struct common_audit_data * sa = va ;
if ( aad ( sa ) - > request & AA_SIGNAL_PERM_MASK ) {
2020-07-13 15:51:59 -04:00
audit_log_format ( ab , " requested_mask= \" %s \" " ,
audit_signal_mask ( aad ( sa ) - > request ) ) ;
2017-07-18 22:56:22 -07:00
if ( aad ( sa ) - > denied & AA_SIGNAL_PERM_MASK ) {
2020-07-13 15:51:59 -04:00
audit_log_format ( ab , " denied_mask= \" %s \" " ,
audit_signal_mask ( aad ( sa ) - > denied ) ) ;
2017-07-18 22:56:22 -07:00
}
}
2018-02-01 12:32:02 +01:00
if ( aad ( sa ) - > signal = = SIGUNKNOWN )
audit_log_format ( ab , " signal=unknown(%d) " ,
aad ( sa ) - > unmappedsig ) ;
else if ( aad ( sa ) - > signal < MAXMAPPED_SIGNAME )
2017-07-18 22:56:22 -07:00
audit_log_format ( ab , " signal=%s " , sig_names [ aad ( sa ) - > signal ] ) ;
else
audit_log_format ( ab , " signal=rtmin+%d " ,
2018-02-01 12:32:02 +01:00
aad ( sa ) - > signal - SIGRT_BASE ) ;
2017-07-18 22:56:22 -07:00
audit_log_format ( ab , " peer= " ) ;
aa_label_xaudit ( ab , labels_ns ( aad ( sa ) - > label ) , aad ( sa ) - > peer ,
FLAGS_NONE , GFP_ATOMIC ) ;
}
static int profile_signal_perm ( struct aa_profile * profile ,
2017-12-12 01:02:13 -08:00
struct aa_label * peer , u32 request ,
2017-07-18 22:56:22 -07:00
struct common_audit_data * sa )
{
2022-09-05 20:47:36 -07:00
struct aa_ruleset * rules = list_first_entry ( & profile - > rules ,
typeof ( * rules ) , list ) ;
2017-07-18 22:56:22 -07:00
struct aa_perms perms ;
2022-01-17 13:43:49 -08:00
aa_state_t state ;
2017-07-18 22:56:22 -07:00
if ( profile_unconfined ( profile ) | |
2022-09-05 20:47:36 -07:00
! ANY_RULE_MEDIATES ( & profile - > rules , AA_CLASS_SIGNAL ) )
2017-07-18 22:56:22 -07:00
return 0 ;
2017-12-12 01:02:13 -08:00
aad ( sa ) - > peer = peer ;
/* TODO: secondary cache check <profile, profile, perm> */
2022-07-29 17:17:31 -07:00
state = aa_dfa_next ( rules - > policy . dfa ,
rules - > policy . start [ AA_CLASS_SIGNAL ] ,
2017-12-12 01:02:13 -08:00
aad ( sa ) - > signal ) ;
2022-07-29 17:17:31 -07:00
aa_label_match ( profile , rules , peer , state , false , request , & perms ) ;
2017-07-18 22:56:22 -07:00
aa_apply_modes_to_perms ( profile , & perms ) ;
return aa_check_perms ( profile , & perms , request , sa , audit_signal_cb ) ;
}
int aa_may_signal ( struct aa_label * sender , struct aa_label * target , int sig )
{
2017-12-12 01:02:13 -08:00
struct aa_profile * profile ;
2022-04-19 16:25:55 -07:00
DEFINE_AUDIT_DATA ( sa , LSM_AUDIT_DATA_NONE , AA_CLASS_SIGNAL , OP_SIGNAL ) ;
2017-07-18 22:56:22 -07:00
aad ( & sa ) - > signal = map_signal_num ( sig ) ;
2018-02-01 12:32:02 +01:00
aad ( & sa ) - > unmappedsig = sig ;
2017-12-12 01:02:13 -08:00
return xcheck_labels ( sender , target , profile ,
profile_signal_perm ( profile , target , MAY_WRITE , & sa ) ,
profile_signal_perm ( profile , sender , MAY_READ , & sa ) ) ;
2017-07-18 22:56:22 -07:00
}