All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mimi Zohar <zohar@linux.ibm.com>
To: Tushar Sugandhi <tusharsu@linux.microsoft.com>,
	roberto.sassu@huaweicloud.com, roberto.sassu@huawei.com,
	eric.snowberg@oracle.com, stefanb@linux.ibm.com,
	ebiederm@xmission.com, noodles@fb.com, bauermann@kolabnow.com,
	linux-integrity@vger.kernel.org, kexec@lists.infradead.org
Cc: code@tyhicks.com, nramas@linux.microsoft.com, paul@paul-moore.com
Subject: Re: [PATCH v5 6/8] ima: suspend measurements during buffer copy at kexec execute
Date: Thu, 22 Feb 2024 09:14:36 -0500	[thread overview]
Message-ID: <cba09611c2e069be49faca2f137d99c772635831.camel@linux.ibm.com> (raw)
In-Reply-To: <20240214153827.1087657-7-tusharsu@linux.microsoft.com>

Hi Tushar,

On Wed, 2024-02-14 at 07:38 -0800, Tushar Sugandhi wrote:
> New measurements added to the IMA log while the log is being copied
> during the kexec 'execute' may not get copied over.

As long as there is enough memory for the additional records, isn't the problem
"after" copying the mesaurement list records, not during?

> This can cause the
> measurement log to be out of sync with the TPM PCRs that IMA extends,
> which could result in breaking the integrity of the measurements after
> kexec soft reboot.
> 
> Implement and call the functions ima_measurements_suspend() and 
> ima_measurements_resume() from ima_update_kexec_buffer().

After copying the measurement list records, would not be the time to resume
taking additional measurements.

> Add a check in the ima_add_template_entry() function not to measure
> events when 'suspend_ima_measurements' flag is set.
> 
> This ensures the integrity of the IMA log while it is being copied over
> to the new Kernel during kexec 'execute'.
> 
> Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
> Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
> ---
>  security/integrity/ima/ima.h       |  2 ++
>  security/integrity/ima/ima_kexec.c |  7 +++++++
>  security/integrity/ima/ima_queue.c | 32 ++++++++++++++++++++++++++++++
>  3 files changed, 41 insertions(+)
> 
> diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h
> index c29db699c996..49a6047dd8eb 100644
> --- a/security/integrity/ima/ima.h
> +++ b/security/integrity/ima/ima.h
> @@ -161,6 +161,8 @@ bool ima_template_has_modsig(const struct
> ima_template_desc *ima_template);
>  int ima_restore_measurement_entry(struct ima_template_entry *entry);
>  int ima_restore_measurement_list(loff_t bufsize, void *buf);
>  int ima_measurements_show(struct seq_file *m, void *v);
> +void ima_measurements_suspend(void);
> +void ima_measurements_resume(void);
>  unsigned long ima_get_binary_runtime_size(void);
>  int ima_init_template(void);
>  void ima_init_template_list(void);
> diff --git a/security/integrity/ima/ima_kexec.c
> b/security/integrity/ima/ima_kexec.c
> index 98fc9b9782a2..dbeeb7f1355e 100644
> --- a/security/integrity/ima/ima_kexec.c
> +++ b/security/integrity/ima/ima_kexec.c
> @@ -184,6 +184,7 @@ static int ima_update_kexec_buffer(struct notifier_block
> *self,
>  	void *buf = NULL;
>  	size_t buf_size;
>  	int ret = NOTIFY_OK;
> +	bool resume = false;
>  
>  	if (!kexec_in_progress) {
>  		pr_info("%s: No kexec in progress.\n", __func__);
> @@ -195,12 +196,15 @@ static int ima_update_kexec_buffer(struct notifier_block
> *self,
>  		return ret;
>  	}
>  
> +	ima_measurements_suspend();
> +
>  	ret = ima_dump_measurement_list(&buf_size, &buf,
>  					kexec_segment_size);
>  
>  	if (!buf) {
>  		pr_err("%s: Dump measurements failed. Error:%d\n",
>  		       __func__, ret);
> +		resume = true;

Only on failure to copy the measurement list records will measurements be
"resumed".  Measurements will be suspended from when the IMA reboot notifier is
called until reboot.

The patch suject line, description and comments don't match the code.  There is
no "during buffer copy" in "ima: suspend measurements during buffer copy at
kexec execute".  Measurements are suspended.

The question is whether you could suspend measurements a bit later, just after
copying the measurement records.

>  		goto out;
>  	}
>  	memcpy(ima_kexec_buffer, buf, buf_size);
> @@ -208,6 +212,9 @@ static int ima_update_kexec_buffer(struct notifier_block
> *self,
>  	kimage_unmap_segment(ima_kexec_buffer);
>  	ima_kexec_buffer = NULL;
>  
> +	if (resume)
> +		ima_measurements_resume();
> +

What is the point in resuming the measurement list on failure to copy them?

>  	return ret;
>  }
>  
> diff --git a/security/integrity/ima/ima_queue.c
> b/security/integrity/ima/ima_queue.c
> index 532da87ce519..5946a26a2849 100644
> --- a/security/integrity/ima/ima_queue.c
> +++ b/security/integrity/ima/ima_queue.c
> @@ -44,6 +44,11 @@ struct ima_h_table ima_htable = {
>   */
>  static DEFINE_MUTEX(ima_extend_list_mutex);
>  
> +/*
> + * Used internally by the kernel to suspend-resume ima measurements.
> + */
> +static atomic_t suspend_ima_measurements;
> +
>  /* lookup up the digest value in the hash table, and return the entry */
>  static struct ima_queue_entry *ima_lookup_digest_entry(u8 *digest_value,
>  						       int pcr)
> @@ -148,6 +153,20 @@ static int ima_pcr_extend(struct tpm_digest *digests_arg,
> int pcr)
>  	return result;
>  }
>  
> +void ima_measurements_suspend(void)
> +{
> +	mutex_lock(&ima_extend_list_mutex);
> +	atomic_set(&suspend_ima_measurements, 1);
> +	mutex_unlock(&ima_extend_list_mutex);
> +}
> +
> +void ima_measurements_resume(void)
> +{
> +	mutex_lock(&ima_extend_list_mutex);
> +	atomic_set(&suspend_ima_measurements, 0);
> +	mutex_unlock(&ima_extend_list_mutex);
> +}
> +
>  /*
>   * Add template entry to the measurement list and hash table, and
>   * extend the pcr.
> @@ -176,6 +195,19 @@ int ima_add_template_entry(struct ima_template_entry
> *entry, int violation,
>  		}
>  	}
>  
> +	/*
> +	 * suspend_ima_measurements will be set if the system is
> +	 * undergoing kexec soft boot to a new kernel.
> +	 * suspending measurements in this short window ensures the
> +	 * consistency of the IMA measurement list during copying
> +	 * of the kexec buffer.
> +	 */

Either remove the 2nd sentence "suspending measurements in this short window
..." or explain what is meant by "short window".

Mimi

> +	if (atomic_read(&suspend_ima_measurements)) {
> +		audit_cause = "measurements_suspended";
> +		audit_info = 0;
> +		goto out;
> +	}
> +
>  	result = ima_add_digest_entry(entry,
>  				      !IS_ENABLED(CONFIG_IMA_DISABLE_HTABLE));
>  	if (result < 0) {


WARNING: multiple messages have this Message-ID (diff)
From: Mimi Zohar <zohar@linux.ibm.com>
To: Tushar Sugandhi <tusharsu@linux.microsoft.com>,
	roberto.sassu@huaweicloud.com, roberto.sassu@huawei.com,
	eric.snowberg@oracle.com, stefanb@linux.ibm.com,
	ebiederm@xmission.com, noodles@fb.com, bauermann@kolabnow.com,
	linux-integrity@vger.kernel.org, kexec@lists.infradead.org
Cc: code@tyhicks.com, nramas@linux.microsoft.com, paul@paul-moore.com
Subject: Re: [PATCH v5 6/8] ima: suspend measurements during buffer copy at kexec execute
Date: Thu, 22 Feb 2024 09:14:36 -0500	[thread overview]
Message-ID: <cba09611c2e069be49faca2f137d99c772635831.camel@linux.ibm.com> (raw)
In-Reply-To: <20240214153827.1087657-7-tusharsu@linux.microsoft.com>

Hi Tushar,

On Wed, 2024-02-14 at 07:38 -0800, Tushar Sugandhi wrote:
> New measurements added to the IMA log while the log is being copied
> during the kexec 'execute' may not get copied over.

As long as there is enough memory for the additional records, isn't the problem
"after" copying the mesaurement list records, not during?

> This can cause the
> measurement log to be out of sync with the TPM PCRs that IMA extends,
> which could result in breaking the integrity of the measurements after
> kexec soft reboot.
> 
> Implement and call the functions ima_measurements_suspend() and 
> ima_measurements_resume() from ima_update_kexec_buffer().

After copying the measurement list records, would not be the time to resume
taking additional measurements.

> Add a check in the ima_add_template_entry() function not to measure
> events when 'suspend_ima_measurements' flag is set.
> 
> This ensures the integrity of the IMA log while it is being copied over
> to the new Kernel during kexec 'execute'.
> 
> Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
> Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
> ---
>  security/integrity/ima/ima.h       |  2 ++
>  security/integrity/ima/ima_kexec.c |  7 +++++++
>  security/integrity/ima/ima_queue.c | 32 ++++++++++++++++++++++++++++++
>  3 files changed, 41 insertions(+)
> 
> diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h
> index c29db699c996..49a6047dd8eb 100644
> --- a/security/integrity/ima/ima.h
> +++ b/security/integrity/ima/ima.h
> @@ -161,6 +161,8 @@ bool ima_template_has_modsig(const struct
> ima_template_desc *ima_template);
>  int ima_restore_measurement_entry(struct ima_template_entry *entry);
>  int ima_restore_measurement_list(loff_t bufsize, void *buf);
>  int ima_measurements_show(struct seq_file *m, void *v);
> +void ima_measurements_suspend(void);
> +void ima_measurements_resume(void);
>  unsigned long ima_get_binary_runtime_size(void);
>  int ima_init_template(void);
>  void ima_init_template_list(void);
> diff --git a/security/integrity/ima/ima_kexec.c
> b/security/integrity/ima/ima_kexec.c
> index 98fc9b9782a2..dbeeb7f1355e 100644
> --- a/security/integrity/ima/ima_kexec.c
> +++ b/security/integrity/ima/ima_kexec.c
> @@ -184,6 +184,7 @@ static int ima_update_kexec_buffer(struct notifier_block
> *self,
>  	void *buf = NULL;
>  	size_t buf_size;
>  	int ret = NOTIFY_OK;
> +	bool resume = false;
>  
>  	if (!kexec_in_progress) {
>  		pr_info("%s: No kexec in progress.\n", __func__);
> @@ -195,12 +196,15 @@ static int ima_update_kexec_buffer(struct notifier_block
> *self,
>  		return ret;
>  	}
>  
> +	ima_measurements_suspend();
> +
>  	ret = ima_dump_measurement_list(&buf_size, &buf,
>  					kexec_segment_size);
>  
>  	if (!buf) {
>  		pr_err("%s: Dump measurements failed. Error:%d\n",
>  		       __func__, ret);
> +		resume = true;

Only on failure to copy the measurement list records will measurements be
"resumed".  Measurements will be suspended from when the IMA reboot notifier is
called until reboot.

The patch suject line, description and comments don't match the code.  There is
no "during buffer copy" in "ima: suspend measurements during buffer copy at
kexec execute".  Measurements are suspended.

The question is whether you could suspend measurements a bit later, just after
copying the measurement records.

>  		goto out;
>  	}
>  	memcpy(ima_kexec_buffer, buf, buf_size);
> @@ -208,6 +212,9 @@ static int ima_update_kexec_buffer(struct notifier_block
> *self,
>  	kimage_unmap_segment(ima_kexec_buffer);
>  	ima_kexec_buffer = NULL;
>  
> +	if (resume)
> +		ima_measurements_resume();
> +

What is the point in resuming the measurement list on failure to copy them?

>  	return ret;
>  }
>  
> diff --git a/security/integrity/ima/ima_queue.c
> b/security/integrity/ima/ima_queue.c
> index 532da87ce519..5946a26a2849 100644
> --- a/security/integrity/ima/ima_queue.c
> +++ b/security/integrity/ima/ima_queue.c
> @@ -44,6 +44,11 @@ struct ima_h_table ima_htable = {
>   */
>  static DEFINE_MUTEX(ima_extend_list_mutex);
>  
> +/*
> + * Used internally by the kernel to suspend-resume ima measurements.
> + */
> +static atomic_t suspend_ima_measurements;
> +
>  /* lookup up the digest value in the hash table, and return the entry */
>  static struct ima_queue_entry *ima_lookup_digest_entry(u8 *digest_value,
>  						       int pcr)
> @@ -148,6 +153,20 @@ static int ima_pcr_extend(struct tpm_digest *digests_arg,
> int pcr)
>  	return result;
>  }
>  
> +void ima_measurements_suspend(void)
> +{
> +	mutex_lock(&ima_extend_list_mutex);
> +	atomic_set(&suspend_ima_measurements, 1);
> +	mutex_unlock(&ima_extend_list_mutex);
> +}
> +
> +void ima_measurements_resume(void)
> +{
> +	mutex_lock(&ima_extend_list_mutex);
> +	atomic_set(&suspend_ima_measurements, 0);
> +	mutex_unlock(&ima_extend_list_mutex);
> +}
> +
>  /*
>   * Add template entry to the measurement list and hash table, and
>   * extend the pcr.
> @@ -176,6 +195,19 @@ int ima_add_template_entry(struct ima_template_entry
> *entry, int violation,
>  		}
>  	}
>  
> +	/*
> +	 * suspend_ima_measurements will be set if the system is
> +	 * undergoing kexec soft boot to a new kernel.
> +	 * suspending measurements in this short window ensures the
> +	 * consistency of the IMA measurement list during copying
> +	 * of the kexec buffer.
> +	 */

Either remove the 2nd sentence "suspending measurements in this short window
..." or explain what is meant by "short window".

Mimi

> +	if (atomic_read(&suspend_ima_measurements)) {
> +		audit_cause = "measurements_suspended";
> +		audit_info = 0;
> +		goto out;
> +	}
> +
>  	result = ima_add_digest_entry(entry,
>  				      !IS_ENABLED(CONFIG_IMA_DISABLE_HTABLE));
>  	if (result < 0) {


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

  reply	other threads:[~2024-02-22 15:26 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-14 15:38 [PATCH v5 0/8] ima: kexec: measure events between kexec load and execute Tushar Sugandhi
2024-02-14 15:38 ` Tushar Sugandhi
2024-02-14 15:38 ` [PATCH v5 1/8] ima: define and call ima_alloc_kexec_file_buf Tushar Sugandhi
2024-02-14 15:38   ` Tushar Sugandhi
2024-02-19 22:16   ` Stefan Berger
2024-02-19 22:16     ` Stefan Berger
2024-02-21  0:12   ` Mimi Zohar
2024-02-21  0:12     ` Mimi Zohar
2024-02-14 15:38 ` [PATCH v5 2/8] kexec: define functions to map and unmap segments Tushar Sugandhi
2024-02-14 15:38   ` Tushar Sugandhi
2024-02-14 19:43   ` Stefan Berger
2024-02-14 19:43     ` Stefan Berger
2024-02-15  6:13     ` Tushar Sugandhi
2024-02-15  6:13       ` Tushar Sugandhi
2024-02-21 20:22   ` Mimi Zohar
2024-02-21 20:22     ` Mimi Zohar
2024-02-14 15:38 ` [PATCH v5 3/8] ima: kexec: skip IMA segment validation after kexec soft reboot Tushar Sugandhi
2024-02-14 15:38   ` Tushar Sugandhi
2024-02-14 15:38 ` [PATCH v5 4/8] ima: kexec: define functions to copy IMA log at soft boot Tushar Sugandhi
2024-02-14 15:38   ` Tushar Sugandhi
2024-02-14 20:47   ` Stefan Berger
2024-02-14 20:47     ` Stefan Berger
2024-02-15  6:55     ` Tushar Sugandhi
2024-02-15  6:55       ` Tushar Sugandhi
2024-02-21 21:52       ` Mimi Zohar
2024-02-21 21:52         ` Mimi Zohar
2024-02-21 22:39   ` Mimi Zohar
2024-02-21 22:39     ` Mimi Zohar
2024-03-01 11:12   ` Petr Tesařík
2024-03-01 11:12     ` Petr Tesařík
2024-02-14 15:38 ` [PATCH v5 5/8] ima: kexec: move IMA log copy from kexec load to execute Tushar Sugandhi
2024-02-14 15:38   ` Tushar Sugandhi
2024-02-14 20:58   ` Stefan Berger
2024-02-14 20:58     ` Stefan Berger
2024-02-22  1:47   ` Mimi Zohar
2024-02-22  1:47     ` Mimi Zohar
2024-05-09  6:32   ` Petr Tesařík
2024-05-09  6:32     ` Petr Tesařík
2024-02-14 15:38 ` [PATCH v5 6/8] ima: suspend measurements during buffer copy at kexec execute Tushar Sugandhi
2024-02-14 15:38   ` Tushar Sugandhi
2024-02-22 14:14   ` Mimi Zohar [this message]
2024-02-22 14:14     ` Mimi Zohar
2024-02-22 16:38     ` Mimi Zohar
2024-02-22 16:38       ` Mimi Zohar
2024-02-29 13:21       ` Petr Tesařík
2024-02-29 13:21         ` Petr Tesařík
2024-02-14 15:38 ` [PATCH v5 7/8] ima: make the kexec extra memory configurable Tushar Sugandhi
2024-02-14 15:38   ` Tushar Sugandhi
2024-02-22 14:13   ` Mimi Zohar
2024-02-22 14:13     ` Mimi Zohar
2024-02-14 15:38 ` [PATCH v5 8/8] ima: measure kexec load and exec events as critical data Tushar Sugandhi
2024-02-14 15:38   ` Tushar Sugandhi
2024-02-14 21:00   ` Stefan Berger
2024-02-14 21:00     ` Stefan Berger
2024-02-15  6:57     ` Tushar Sugandhi
2024-02-15  6:57       ` Tushar Sugandhi
2024-02-14 21:03   ` Stefan Berger
2024-02-14 21:03     ` Stefan Berger
2024-02-15  6:58     ` Tushar Sugandhi
2024-02-15  6:58       ` Tushar Sugandhi
2024-02-21  0:15 ` [PATCH v5 0/8] ima: kexec: measure events between kexec load and execute Mimi Zohar
2024-02-21  0:15   ` Mimi Zohar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cba09611c2e069be49faca2f137d99c772635831.camel@linux.ibm.com \
    --to=zohar@linux.ibm.com \
    --cc=bauermann@kolabnow.com \
    --cc=code@tyhicks.com \
    --cc=ebiederm@xmission.com \
    --cc=eric.snowberg@oracle.com \
    --cc=kexec@lists.infradead.org \
    --cc=linux-integrity@vger.kernel.org \
    --cc=noodles@fb.com \
    --cc=nramas@linux.microsoft.com \
    --cc=paul@paul-moore.com \
    --cc=roberto.sassu@huawei.com \
    --cc=roberto.sassu@huaweicloud.com \
    --cc=stefanb@linux.ibm.com \
    --cc=tusharsu@linux.microsoft.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.