 4a7fc3018f
			
		
	
	
	4a7fc3018f
	
	
	
		
			
			The reporting of the parent task info is a vestage from old versions of apparmor. The need for this information was removed by unique null- profiles before apparmor was upstreamed so remove this info from logging. Signed-off-by: John Johansen <john.johansen@canonical.com>
		
			
				
	
	
		
			209 lines
		
	
	
	
		
			4.4 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			209 lines
		
	
	
	
		
			4.4 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * AppArmor security module
 | |
|  *
 | |
|  * This file contains AppArmor auditing functions
 | |
|  *
 | |
|  * Copyright (C) 1998-2008 Novell/SUSE
 | |
|  * Copyright 2009-2010 Canonical Ltd.
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU General Public License as
 | |
|  * published by the Free Software Foundation, version 2 of the
 | |
|  * License.
 | |
|  */
 | |
| 
 | |
| #include <linux/audit.h>
 | |
| #include <linux/socket.h>
 | |
| 
 | |
| #include "include/apparmor.h"
 | |
| #include "include/audit.h"
 | |
| #include "include/policy.h"
 | |
| 
 | |
| const char *const op_table[] = {
 | |
| 	"null",
 | |
| 
 | |
| 	"sysctl",
 | |
| 	"capable",
 | |
| 
 | |
| 	"unlink",
 | |
| 	"mkdir",
 | |
| 	"rmdir",
 | |
| 	"mknod",
 | |
| 	"truncate",
 | |
| 	"link",
 | |
| 	"symlink",
 | |
| 	"rename_src",
 | |
| 	"rename_dest",
 | |
| 	"chmod",
 | |
| 	"chown",
 | |
| 	"getattr",
 | |
| 	"open",
 | |
| 
 | |
| 	"file_perm",
 | |
| 	"file_lock",
 | |
| 	"file_mmap",
 | |
| 	"file_mprotect",
 | |
| 
 | |
| 	"create",
 | |
| 	"post_create",
 | |
| 	"bind",
 | |
| 	"connect",
 | |
| 	"listen",
 | |
| 	"accept",
 | |
| 	"sendmsg",
 | |
| 	"recvmsg",
 | |
| 	"getsockname",
 | |
| 	"getpeername",
 | |
| 	"getsockopt",
 | |
| 	"setsockopt",
 | |
| 	"socket_shutdown",
 | |
| 
 | |
| 	"ptrace",
 | |
| 
 | |
| 	"exec",
 | |
| 	"change_hat",
 | |
| 	"change_profile",
 | |
| 	"change_onexec",
 | |
| 
 | |
| 	"setprocattr",
 | |
| 	"setrlimit",
 | |
| 
 | |
| 	"profile_replace",
 | |
| 	"profile_load",
 | |
| 	"profile_remove"
 | |
| };
 | |
| 
 | |
| const char *const audit_mode_names[] = {
 | |
| 	"normal",
 | |
| 	"quiet_denied",
 | |
| 	"quiet",
 | |
| 	"noquiet",
 | |
| 	"all"
 | |
| };
 | |
| 
 | |
| static const char *const aa_audit_type[] = {
 | |
| 	"AUDIT",
 | |
| 	"ALLOWED",
 | |
| 	"DENIED",
 | |
| 	"HINT",
 | |
| 	"STATUS",
 | |
| 	"ERROR",
 | |
| 	"KILLED",
 | |
| 	"AUTO"
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Currently AppArmor auditing is fed straight into the audit framework.
 | |
|  *
 | |
|  * TODO:
 | |
|  * netlink interface for complain mode
 | |
|  * user auditing, - send user auditing to netlink interface
 | |
|  * system control of whether user audit messages go to system log
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * audit_base - core AppArmor function.
 | |
|  * @ab: audit buffer to fill (NOT NULL)
 | |
|  * @ca: audit structure containing data to audit (NOT NULL)
 | |
|  *
 | |
|  * Record common AppArmor audit data from @sa
 | |
|  */
 | |
| static void audit_pre(struct audit_buffer *ab, void *ca)
 | |
| {
 | |
| 	struct common_audit_data *sa = ca;
 | |
| 
 | |
| 	if (aa_g_audit_header) {
 | |
| 		audit_log_format(ab, "apparmor=");
 | |
| 		audit_log_string(ab, aa_audit_type[sa->aad->type]);
 | |
| 	}
 | |
| 
 | |
| 	if (sa->aad->op) {
 | |
| 		audit_log_format(ab, " operation=");
 | |
| 		audit_log_string(ab, op_table[sa->aad->op]);
 | |
| 	}
 | |
| 
 | |
| 	if (sa->aad->info) {
 | |
| 		audit_log_format(ab, " info=");
 | |
| 		audit_log_string(ab, sa->aad->info);
 | |
| 		if (sa->aad->error)
 | |
| 			audit_log_format(ab, " error=%d", sa->aad->error);
 | |
| 	}
 | |
| 
 | |
| 	if (sa->aad->profile) {
 | |
| 		struct aa_profile *profile = sa->aad->profile;
 | |
| 		if (profile->ns != root_ns) {
 | |
| 			audit_log_format(ab, " namespace=");
 | |
| 			audit_log_untrustedstring(ab, profile->ns->base.hname);
 | |
| 		}
 | |
| 		audit_log_format(ab, " profile=");
 | |
| 		audit_log_untrustedstring(ab, profile->base.hname);
 | |
| 	}
 | |
| 
 | |
| 	if (sa->aad->name) {
 | |
| 		audit_log_format(ab, " name=");
 | |
| 		audit_log_untrustedstring(ab, sa->aad->name);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * aa_audit_msg - Log a message to the audit subsystem
 | |
|  * @sa: audit event structure (NOT NULL)
 | |
|  * @cb: optional callback fn for type specific fields (MAYBE NULL)
 | |
|  */
 | |
| void aa_audit_msg(int type, struct common_audit_data *sa,
 | |
| 		  void (*cb) (struct audit_buffer *, void *))
 | |
| {
 | |
| 	sa->aad->type = type;
 | |
| 	common_lsm_audit(sa, audit_pre, cb);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * aa_audit - Log a profile based audit event to the audit subsystem
 | |
|  * @type: audit type for the message
 | |
|  * @profile: profile to check against (NOT NULL)
 | |
|  * @gfp: allocation flags to use
 | |
|  * @sa: audit event (NOT NULL)
 | |
|  * @cb: optional callback fn for type specific fields (MAYBE NULL)
 | |
|  *
 | |
|  * Handle default message switching based off of audit mode flags
 | |
|  *
 | |
|  * Returns: error on failure
 | |
|  */
 | |
| int aa_audit(int type, struct aa_profile *profile, gfp_t gfp,
 | |
| 	     struct common_audit_data *sa,
 | |
| 	     void (*cb) (struct audit_buffer *, void *))
 | |
| {
 | |
| 	BUG_ON(!profile);
 | |
| 
 | |
| 	if (type == AUDIT_APPARMOR_AUTO) {
 | |
| 		if (likely(!sa->aad->error)) {
 | |
| 			if (AUDIT_MODE(profile) != AUDIT_ALL)
 | |
| 				return 0;
 | |
| 			type = AUDIT_APPARMOR_AUDIT;
 | |
| 		} else if (COMPLAIN_MODE(profile))
 | |
| 			type = AUDIT_APPARMOR_ALLOWED;
 | |
| 		else
 | |
| 			type = AUDIT_APPARMOR_DENIED;
 | |
| 	}
 | |
| 	if (AUDIT_MODE(profile) == AUDIT_QUIET ||
 | |
| 	    (type == AUDIT_APPARMOR_DENIED &&
 | |
| 	     AUDIT_MODE(profile) == AUDIT_QUIET))
 | |
| 		return sa->aad->error;
 | |
| 
 | |
| 	if (KILL_MODE(profile) && type == AUDIT_APPARMOR_DENIED)
 | |
| 		type = AUDIT_APPARMOR_KILL;
 | |
| 
 | |
| 	if (!unconfined(profile))
 | |
| 		sa->aad->profile = profile;
 | |
| 
 | |
| 	aa_audit_msg(type, sa, cb);
 | |
| 
 | |
| 	if (sa->aad->type == AUDIT_APPARMOR_KILL)
 | |
| 		(void)send_sig_info(SIGKILL, NULL,
 | |
| 				    sa->u.tsk ?  sa->u.tsk : current);
 | |
| 
 | |
| 	if (sa->aad->type == AUDIT_APPARMOR_ALLOWED)
 | |
| 		return complain_error(sa->aad->error);
 | |
| 
 | |
| 	return sa->aad->error;
 | |
| }
 |