@ -23,7 +23,6 @@
# include <linux/netfilter.h>
# include <linux/module.h>
# include <linux/cache.h>
# include <linux/audit.h>
# include <net/xfrm.h>
# include <net/ip.h>
@ -850,10 +849,9 @@ xfrm_policy_flush_secctx_check(u8 type, struct xfrm_audit *audit_info)
continue ;
err = security_xfrm_policy_delete ( pol ) ;
if ( err ) {
xfrm_audit_log ( audit_info - > loginuid ,
audit_info - > secid ,
AUDIT_MAC_IPSEC_DELSPD , 0 ,
pol , NULL ) ;
xfrm_audit_policy_delete ( pol , 0 ,
audit_info - > loginuid ,
audit_info - > secid ) ;
return err ;
}
}
@ -865,10 +863,9 @@ xfrm_policy_flush_secctx_check(u8 type, struct xfrm_audit *audit_info)
continue ;
err = security_xfrm_policy_delete ( pol ) ;
if ( err ) {
xfrm_audit_log ( audit_info - > loginuid ,
audit_info - > secid ,
AUDIT_MAC_IPSEC_DELSPD ,
0 , pol , NULL ) ;
xfrm_audit_policy_delete ( pol , 0 ,
audit_info - > loginuid ,
audit_info - > secid ) ;
return err ;
}
}
@ -909,8 +906,8 @@ int xfrm_policy_flush(u8 type, struct xfrm_audit *audit_info)
hlist_del ( & pol - > byidx ) ;
write_unlock_bh ( & xfrm_policy_lock ) ;
xfrm_audit_log ( audit_info - > loginuid , audit_info - > sec id,
AUDIT_MAC_IPSEC_DELSPD , 1 , pol , NULL ) ;
xfrm_audit_policy_delete ( pol , 1 , audit_info - > loginu id,
audit_info - > secid ) ;
xfrm_policy_kill ( pol ) ;
killed + + ;
@ -930,11 +927,9 @@ int xfrm_policy_flush(u8 type, struct xfrm_audit *audit_info)
hlist_del ( & pol - > byidx ) ;
write_unlock_bh ( & xfrm_policy_lock ) ;
xfrm_audit_log ( audit_info - > loginuid ,
audit_info - > secid ,
AUDIT_MAC_IPSEC_DELSPD , 1 ,
pol , NULL ) ;
xfrm_audit_policy_delete ( pol , 1 ,
audit_info - > loginuid ,
audit_info - > secid ) ;
xfrm_policy_kill ( pol ) ;
killed + + ;
@ -2150,123 +2145,6 @@ int xfrm_bundle_ok(struct xfrm_policy *pol, struct xfrm_dst *first,
EXPORT_SYMBOL ( xfrm_bundle_ok ) ;
# ifdef CONFIG_AUDITSYSCALL
/* Audit addition and deletion of SAs and ipsec policy */
void xfrm_audit_log ( uid_t auid , u32 sid , int type , int result ,
struct xfrm_policy * xp , struct xfrm_state * x )
{
char * secctx ;
u32 secctx_len ;
struct xfrm_sec_ctx * sctx = NULL ;
struct audit_buffer * audit_buf ;
int family ;
extern int audit_enabled ;
if ( audit_enabled = = 0 )
return ;
BUG_ON ( ( type = = AUDIT_MAC_IPSEC_ADDSA | |
type = = AUDIT_MAC_IPSEC_DELSA ) & & ! x ) ;
BUG_ON ( ( type = = AUDIT_MAC_IPSEC_ADDSPD | |
type = = AUDIT_MAC_IPSEC_DELSPD ) & & ! xp ) ;
audit_buf = audit_log_start ( current - > audit_context , GFP_ATOMIC , type ) ;
if ( audit_buf = = NULL )
return ;
switch ( type ) {
case AUDIT_MAC_IPSEC_ADDSA :
audit_log_format ( audit_buf , " SAD add: auid=%u " , auid ) ;
break ;
case AUDIT_MAC_IPSEC_DELSA :
audit_log_format ( audit_buf , " SAD delete: auid=%u " , auid ) ;
break ;
case AUDIT_MAC_IPSEC_ADDSPD :
audit_log_format ( audit_buf , " SPD add: auid=%u " , auid ) ;
break ;
case AUDIT_MAC_IPSEC_DELSPD :
audit_log_format ( audit_buf , " SPD delete: auid=%u " , auid ) ;
break ;
default :
return ;
}
if ( sid ! = 0 & &
security_secid_to_secctx ( sid , & secctx , & secctx_len ) = = 0 ) {
audit_log_format ( audit_buf , " subj=%s " , secctx ) ;
security_release_secctx ( secctx , secctx_len ) ;
} else
audit_log_task_context ( audit_buf ) ;
if ( xp ) {
family = xp - > selector . family ;
if ( xp - > security )
sctx = xp - > security ;
} else {
family = x - > props . family ;
if ( x - > security )
sctx = x - > security ;
}
if ( sctx )
audit_log_format ( audit_buf ,
" sec_alg=%u sec_doi=%u sec_obj=%s " ,
sctx - > ctx_alg , sctx - > ctx_doi , sctx - > ctx_str ) ;
switch ( family ) {
case AF_INET :
{
struct in_addr saddr , daddr ;
if ( xp ) {
saddr . s_addr = xp - > selector . saddr . a4 ;
daddr . s_addr = xp - > selector . daddr . a4 ;
} else {
saddr . s_addr = x - > props . saddr . a4 ;
daddr . s_addr = x - > id . daddr . a4 ;
}
audit_log_format ( audit_buf ,
" src=%u.%u.%u.%u dst=%u.%u.%u.%u " ,
NIPQUAD ( saddr ) , NIPQUAD ( daddr ) ) ;
}
break ;
case AF_INET6 :
{
struct in6_addr saddr6 , daddr6 ;
if ( xp ) {
memcpy ( & saddr6 , xp - > selector . saddr . a6 ,
sizeof ( struct in6_addr ) ) ;
memcpy ( & daddr6 , xp - > selector . daddr . a6 ,
sizeof ( struct in6_addr ) ) ;
} else {
memcpy ( & saddr6 , x - > props . saddr . a6 ,
sizeof ( struct in6_addr ) ) ;
memcpy ( & daddr6 , x - > id . daddr . a6 ,
sizeof ( struct in6_addr ) ) ;
}
audit_log_format ( audit_buf ,
" src= " NIP6_FMT " dst= " NIP6_FMT ,
NIP6 ( saddr6 ) , NIP6 ( daddr6 ) ) ;
}
break ;
}
if ( x )
audit_log_format ( audit_buf , " spi=%lu(0x%lx) protocol=%s " ,
( unsigned long ) ntohl ( x - > id . spi ) ,
( unsigned long ) ntohl ( x - > id . spi ) ,
x - > id . proto = = IPPROTO_AH ? " AH " :
( x - > id . proto = = IPPROTO_ESP ?
" ESP " : " IPCOMP " ) ) ;
audit_log_format ( audit_buf , " res=%u " , result ) ;
audit_log_end ( audit_buf ) ;
}
EXPORT_SYMBOL ( xfrm_audit_log ) ;
# endif /* CONFIG_AUDITSYSCALL */
int xfrm_policy_register_afinfo ( struct xfrm_policy_afinfo * afinfo )
{
int err = 0 ;
@ -2412,6 +2290,72 @@ void __init xfrm_init(void)
xfrm_input_init ( ) ;
}
# ifdef CONFIG_AUDITSYSCALL
static inline void xfrm_audit_common_policyinfo ( struct xfrm_policy * xp ,
struct audit_buffer * audit_buf )
{
if ( xp - > security )
audit_log_format ( audit_buf , " sec_alg=%u sec_doi=%u sec_obj=%s " ,
xp - > security - > ctx_alg , xp - > security - > ctx_doi ,
xp - > security - > ctx_str ) ;
switch ( xp - > selector . family ) {
case AF_INET :
audit_log_format ( audit_buf , " src=%u.%u.%u.%u dst=%u.%u.%u.%u " ,
NIPQUAD ( xp - > selector . saddr . a4 ) ,
NIPQUAD ( xp - > selector . daddr . a4 ) ) ;
break ;
case AF_INET6 :
{
struct in6_addr saddr6 , daddr6 ;
memcpy ( & saddr6 , xp - > selector . saddr . a6 ,
sizeof ( struct in6_addr ) ) ;
memcpy ( & daddr6 , xp - > selector . daddr . a6 ,
sizeof ( struct in6_addr ) ) ;
audit_log_format ( audit_buf ,
" src= " NIP6_FMT " dst= " NIP6_FMT ,
NIP6 ( saddr6 ) , NIP6 ( daddr6 ) ) ;
}
break ;
}
}
void
xfrm_audit_policy_add ( struct xfrm_policy * xp , int result , u32 auid , u32 sid )
{
struct audit_buffer * audit_buf ;
extern int audit_enabled ;
if ( audit_enabled = = 0 )
return ;
audit_buf = xfrm_audit_start ( sid , auid ) ;
if ( audit_buf = = NULL )
return ;
audit_log_format ( audit_buf , " op=SPD-add res=%u " , result ) ;
xfrm_audit_common_policyinfo ( xp , audit_buf ) ;
audit_log_end ( audit_buf ) ;
}
EXPORT_SYMBOL_GPL ( xfrm_audit_policy_add ) ;
void
xfrm_audit_policy_delete ( struct xfrm_policy * xp , int result , u32 auid , u32 sid )
{
struct audit_buffer * audit_buf ;
extern int audit_enabled ;
if ( audit_enabled = = 0 )
return ;
audit_buf = xfrm_audit_start ( sid , auid ) ;
if ( audit_buf = = NULL )
return ;
audit_log_format ( audit_buf , " op=SPD-delete res=%u " , result ) ;
xfrm_audit_common_policyinfo ( xp , audit_buf ) ;
audit_log_end ( audit_buf ) ;
}
EXPORT_SYMBOL_GPL ( xfrm_audit_policy_delete ) ;
# endif
# ifdef CONFIG_XFRM_MIGRATE
static int xfrm_migrate_selector_match ( struct xfrm_selector * sel_cmp ,
struct xfrm_selector * sel_tgt )