mirror of
				https://github.com/linuxkit/linuxkit.git
				synced 2025-10-31 03:22:11 +00:00 
			
		
		
		
	This is a project with a v1 of the IMA namespacing patches. See the readme for details on use. Signed-off-by: Tycho Andersen <tycho@docker.com>
		
			
				
	
	
		
			211 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From e96e10b725a11c2d563caa3907212b149355b70f Mon Sep 17 00:00:00 2001
 | |
| From: Guilherme Magalhaes <guilherme.magalhaes@hpe.com>
 | |
| Date: Tue, 9 May 2017 11:09:04 -0300
 | |
| Subject: [PATCH 03/11] ima: qualify pathname in measurement file
 | |
| 
 | |
| Adding new fields (mount namespace id, file inode and device name) to
 | |
| uniquely identify a pathname in the measurement file considering
 | |
| multiple mount namespaces. The file inode on a given device is unique
 | |
| and these fields are required to identify a namespace id since this
 | |
| id can be released and later reused by a different namespace.
 | |
| These new fields are added to all measurement templates if
 | |
| CONFIG_IMA_PER_NAMESPACE is defined.
 | |
| There will still be one single measurement file even with multiple
 | |
| namespaces, since for the remote attestion a single and complete list
 | |
| is required.
 | |
| 
 | |
| Signed-off-by: Guilherme Magalhaes <guilherme.magalhaes@hpe.com>
 | |
| ---
 | |
|  security/integrity/ima/Kconfig            |  8 ++++
 | |
|  security/integrity/ima/ima.h              | 12 ++++++
 | |
|  security/integrity/ima/ima_template.c     | 10 ++++-
 | |
|  security/integrity/ima/ima_template_lib.c | 70 +++++++++++++++++++++++++++++++
 | |
|  security/integrity/ima/ima_template_lib.h | 13 ++++++
 | |
|  5 files changed, 111 insertions(+), 2 deletions(-)
 | |
| 
 | |
| diff --git a/security/integrity/ima/Kconfig b/security/integrity/ima/Kconfig
 | |
| index 370eb2f..7331ff6 100644
 | |
| --- a/security/integrity/ima/Kconfig
 | |
| +++ b/security/integrity/ima/Kconfig
 | |
| @@ -219,3 +219,11 @@ config IMA_APPRAISE_SIGNED_INIT
 | |
|  	default n
 | |
|  	help
 | |
|  	   This option requires user-space init to be signed.
 | |
| +
 | |
| +config IMA_PER_NAMESPACE
 | |
| +	bool "Enable per mount-namespace handling of IMA policy."
 | |
| +	depends on IMA
 | |
| +	default n
 | |
| +	help
 | |
| +	    This option enables another API in securityfs allowing IMA policies to
 | |
| +	    be defined per mount namespace.
 | |
| diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h
 | |
| index b563fbd..42fb91ba 100644
 | |
| --- a/security/integrity/ima/ima.h
 | |
| +++ b/security/integrity/ima/ima.h
 | |
| @@ -47,7 +47,19 @@ enum tpm_pcrs { TPM_PCR0 = 0, TPM_PCR8 = 8 };
 | |
|  #define IMA_TEMPLATE_NUM_FIELDS_MAX	15
 | |
|  
 | |
|  #define IMA_TEMPLATE_IMA_NAME "ima"
 | |
| +#define IMA_TEMPLATE_IMA_NG_NAME "ima-ng"
 | |
| +#define IMA_TEMPLATE_IMA_SIG_NAME "ima-sig"
 | |
| +
 | |
| +#ifndef CONFIG_IMA_PER_NAMESPACE
 | |
|  #define IMA_TEMPLATE_IMA_FMT "d|n"
 | |
| +#define IMA_TEMPLATE_IMA_NG_FMT "d-ng|n-ng"
 | |
| +#define IMA_TEMPLATE_IMA_SIG_FMT "d-ng|n-ng|sig"
 | |
| +#else
 | |
| +#define IMA_TEMPLATE_IMA_FMT "nid|fi|dev|d|n"
 | |
| +#define IMA_TEMPLATE_IMA_NG_FMT "nid|fi|dev|d-ng|n-ng"
 | |
| +#define IMA_TEMPLATE_IMA_SIG_FMT "nid|fi|dev|d-ng|n-ng|sig"
 | |
| +#endif
 | |
| +
 | |
|  
 | |
|  /* current content of the policy */
 | |
|  extern int ima_policy_flag;
 | |
| diff --git a/security/integrity/ima/ima_template.c b/security/integrity/ima/ima_template.c
 | |
| index cebb37c..db65c09 100644
 | |
| --- a/security/integrity/ima/ima_template.c
 | |
| +++ b/security/integrity/ima/ima_template.c
 | |
| @@ -21,8 +21,8 @@
 | |
|  
 | |
|  static struct ima_template_desc builtin_templates[] = {
 | |
|  	{.name = IMA_TEMPLATE_IMA_NAME, .fmt = IMA_TEMPLATE_IMA_FMT},
 | |
| -	{.name = "ima-ng", .fmt = "d-ng|n-ng"},
 | |
| -	{.name = "ima-sig", .fmt = "d-ng|n-ng|sig"},
 | |
| +	{.name = IMA_TEMPLATE_IMA_NG_NAME, .fmt = IMA_TEMPLATE_IMA_NG_FMT},
 | |
| +	{.name = IMA_TEMPLATE_IMA_SIG_NAME, .fmt = IMA_TEMPLATE_IMA_SIG_FMT},
 | |
|  	{.name = "", .fmt = ""},	/* placeholder for a custom format */
 | |
|  };
 | |
|  
 | |
| @@ -40,6 +40,12 @@ static struct ima_template_field supported_fields[] = {
 | |
|  	 .field_show = ima_show_template_string},
 | |
|  	{.field_id = "sig", .field_init = ima_eventsig_init,
 | |
|  	 .field_show = ima_show_template_sig},
 | |
| +	{.field_id = "nid", .field_init = ima_namespaceid_init,
 | |
| +	 .field_show = ima_show_namespaceid},
 | |
| +	{.field_id = "fi", .field_init = ima_filei_init,
 | |
| +	 .field_show = ima_show_filei},
 | |
| +	{.field_id = "dev", .field_init = ima_dev_init,
 | |
| +	 .field_show = ima_show_dev},
 | |
|  };
 | |
|  #define MAX_TEMPLATE_NAME_LEN 15
 | |
|  
 | |
| diff --git a/security/integrity/ima/ima_template_lib.c b/security/integrity/ima/ima_template_lib.c
 | |
| index f9ba37b..50cde10 100644
 | |
| --- a/security/integrity/ima/ima_template_lib.c
 | |
| +++ b/security/integrity/ima/ima_template_lib.c
 | |
| @@ -14,6 +14,8 @@
 | |
|   */
 | |
|  
 | |
|  #include "ima_template_lib.h"
 | |
| +#include <linux/proc_ns.h>
 | |
| +#include <linux/types.h>
 | |
|  
 | |
|  static bool ima_template_hash_algo_allowed(u8 algo)
 | |
|  {
 | |
| @@ -330,3 +332,71 @@ int ima_eventsig_init(struct ima_event_data *event_data,
 | |
|  out:
 | |
|  	return rc;
 | |
|  }
 | |
| +
 | |
| +int ima_namespaceid_init(struct ima_event_data *event_data,
 | |
| +			 struct ima_field_data *field_data)
 | |
| +{
 | |
| +	u8 tmpbuf[64];
 | |
| +	struct ns_common *ns;
 | |
| +
 | |
| +	ns = mntns_operations.get(current);
 | |
| +	snprintf(tmpbuf, sizeof(tmpbuf), "mnt-ns=%u", ns->inum);
 | |
| +	mntns_operations.put(ns);
 | |
| +
 | |
| +	return ima_write_template_field_data(tmpbuf, strlen(tmpbuf), DATA_FMT_STRING, field_data);
 | |
| +}
 | |
| +
 | |
| +void ima_show_namespaceid(struct seq_file *m, enum ima_show_type show,
 | |
| +							struct ima_field_data *field_data)
 | |
| +{
 | |
| +	ima_show_template_field_data(m, show, DATA_FMT_STRING, field_data);
 | |
| +}
 | |
| +
 | |
| +int ima_filei_init(struct ima_event_data *event_data,
 | |
| +			 struct ima_field_data *field_data)
 | |
| +{
 | |
| +	u8 tmpbuf[64];
 | |
| +	struct inode *inode;
 | |
| +	int rc = 0;
 | |
| +
 | |
| +	if (event_data->file) {
 | |
| +		inode = file_inode(event_data->file);
 | |
| +		snprintf(tmpbuf, sizeof(tmpbuf), "inode=%lu", inode->i_ino);
 | |
| +		rc = ima_write_template_field_data(tmpbuf, strlen(tmpbuf), DATA_FMT_STRING, field_data);
 | |
| +	} else {
 | |
| +		pr_info("IMA: event file is NULL\n");
 | |
| +	}
 | |
| +
 | |
| +	return rc;
 | |
| +}
 | |
| +
 | |
| +void ima_show_filei(struct seq_file *m, enum ima_show_type show,
 | |
| +						struct ima_field_data *field_data)
 | |
| +{
 | |
| +	ima_show_template_field_data(m, show, DATA_FMT_STRING, field_data);
 | |
| +}
 | |
| +
 | |
| +int ima_dev_init(struct ima_event_data *event_data,
 | |
| +			 struct ima_field_data *field_data)
 | |
| +{
 | |
| +	u8 tmpbuf[64];
 | |
| +	struct inode *inode;
 | |
| +	int rc = 0;
 | |
| +
 | |
| +	if (event_data->file) {
 | |
| +		inode = file_inode(event_data->file);
 | |
| +		snprintf(tmpbuf, sizeof(tmpbuf), "dev=%s", inode->i_sb->s_id); //TODO: check untrusted string? see audit_log_n_untrustedstring()
 | |
| +		tmpbuf[sizeof(tmpbuf) - 1] = 0;
 | |
| +		rc = ima_write_template_field_data(tmpbuf, strlen(tmpbuf), DATA_FMT_STRING, field_data);
 | |
| +	} else {
 | |
| +		pr_info("IMA: event file is NULL\n");
 | |
| +	}
 | |
| +
 | |
| +	return rc;
 | |
| +}
 | |
| +
 | |
| +void ima_show_dev(struct seq_file *m, enum ima_show_type show,
 | |
| +					struct ima_field_data *field_data)
 | |
| +{
 | |
| +	ima_show_template_field_data(m, show, DATA_FMT_STRING, field_data);
 | |
| +}
 | |
| diff --git a/security/integrity/ima/ima_template_lib.h b/security/integrity/ima/ima_template_lib.h
 | |
| index c344530..cf6a6c7 100644
 | |
| --- a/security/integrity/ima/ima_template_lib.h
 | |
| +++ b/security/integrity/ima/ima_template_lib.h
 | |
| @@ -26,6 +26,12 @@ void ima_show_template_string(struct seq_file *m, enum ima_show_type show,
 | |
|  			      struct ima_field_data *field_data);
 | |
|  void ima_show_template_sig(struct seq_file *m, enum ima_show_type show,
 | |
|  			   struct ima_field_data *field_data);
 | |
| +void ima_show_namespaceid(struct seq_file *m, enum ima_show_type show,
 | |
| +		       struct ima_field_data *field_data);
 | |
| +void ima_show_filei(struct seq_file *m, enum ima_show_type show,
 | |
| +		       struct ima_field_data *field_data);
 | |
| +void ima_show_dev(struct seq_file *m, enum ima_show_type show,
 | |
| +		       struct ima_field_data *field_data);
 | |
|  int ima_eventdigest_init(struct ima_event_data *event_data,
 | |
|  			 struct ima_field_data *field_data);
 | |
|  int ima_eventname_init(struct ima_event_data *event_data,
 | |
| @@ -36,4 +42,11 @@ int ima_eventname_ng_init(struct ima_event_data *event_data,
 | |
|  			  struct ima_field_data *field_data);
 | |
|  int ima_eventsig_init(struct ima_event_data *event_data,
 | |
|  		      struct ima_field_data *field_data);
 | |
| +int ima_namespaceid_init(struct ima_event_data *event_data,
 | |
| +		      struct ima_field_data *field_data);
 | |
| +int ima_filei_init(struct ima_event_data *event_data,
 | |
| +		      struct ima_field_data *field_data);
 | |
| +int ima_dev_init(struct ima_event_data *event_data,
 | |
| +		      struct ima_field_data *field_data);
 | |
| +
 | |
|  #endif /* __LINUX_IMA_TEMPLATE_LIB_H */
 | |
| -- 
 | |
| 2.9.3
 | |
| 
 |