| From 8816de950d38ada681f3d2f9a220219941c1955e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 7 Mar 2025 12:25:23 +0000 |
| Subject: tpm: End any active auth session before shutdown |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Jonathan McDowell <noodles@meta.com> |
| |
| [ Upstream commit 1dbf74e00a5f882b04b398399b6def65cd51ef21 ] |
| |
| Lazy flushing of TPM auth sessions can interact badly with IMA + kexec, |
| resulting in loaded session handles being leaked across the kexec and |
| not cleaned up. Fix by ensuring any active auth session is ended before |
| the TPM is told about the shutdown, matching what is done when |
| suspending. |
| |
| Before: |
| |
| root@debian-qemu-efi:~# tpm2_getcap handles-loaded-session |
| root@debian-qemu-efi:~# tpm2_getcap handles-saved-session |
| root@debian-qemu-efi:~# kexec --load --kexec-file-syscall … |
| root@debian-qemu-efi:~# systemctl kexec |
| … |
| root@debian-qemu-efi:~# tpm2_getcap handles-loaded-session |
| - 0x2000000 |
| root@debian-qemu-efi:~# tpm2_getcap handles-saved-session |
| root@debian-qemu-efi:~# |
| (repeat kexec steps) |
| root@debian-qemu-efi:~# tpm2_getcap handles-loaded-session |
| - 0x2000000 |
| - 0x2000001 |
| root@debian-qemu-efi:~# tpm2_getcap handles-saved-session |
| root@debian-qemu-efi:~# |
| |
| After: |
| |
| root@debian-qemu-efi:~# tpm2_getcap handles-loaded-session |
| root@debian-qemu-efi:~# tpm2_getcap handles-saved-session |
| root@debian-qemu-efi:~# kexec --load --kexec-file-syscall … |
| root@debian-qemu-efi:~# systemctl kexec |
| … |
| root@debian-qemu-efi:~# tpm2_getcap handles-loaded-session |
| root@debian-qemu-efi:~# tpm2_getcap handles-saved-session |
| root@debian-qemu-efi:~# |
| |
| Signed-off-by: Jonathan McDowell <noodles@meta.com> |
| Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/char/tpm/tpm-chip.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c |
| index 7df7abaf3e526..87f01269b9b53 100644 |
| --- a/drivers/char/tpm/tpm-chip.c |
| +++ b/drivers/char/tpm/tpm-chip.c |
| @@ -300,6 +300,7 @@ int tpm_class_shutdown(struct device *dev) |
| down_write(&chip->ops_sem); |
| if (chip->flags & TPM_CHIP_FLAG_TPM2) { |
| if (!tpm_chip_start(chip)) { |
| + tpm2_end_auth_session(chip); |
| tpm2_shutdown(chip, TPM2_SU_CLEAR); |
| tpm_chip_stop(chip); |
| } |
| -- |
| 2.39.5 |
| |