From nobody Sat Jul 11 14:54:37 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4561486AFA for ; Thu, 25 Apr 2024 10:04:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039487; cv=none; b=NZiK3hXZTdtfMrFwlOySUKO/UMZEZzNf78qClOZMo1axEkwRImY0j95mHKTi74dM3TywI2AzEggxdtr+Dm0scfczlqZ2U/mbc2xVp89y4ZI3FgveNvzEpcUvPQvXBN/NkFNxpxQ46FXDpFHPotsiQYC/O6O/+bToCDNAIffpoew= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039487; c=relaxed/simple; bh=WCihwivYZH8W0XeKOEd64Cs3hnChnBiPIvusi34oOuY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bOa7VFwAH/fqIz/FJO54sbz2hUWZK2WyNTKwV4qMJn+nPrYbRq6Idgv968OmLoZjfeUphvc4yzYaoDNrcrbjCTrO3G0VqnnaDMLBvuz9f1gfefm8kUASrP9rqVvrJLPhq7Oqar4oumFMmdz4VMu9kvJjH3G3bAhDdOnSFRVhu60= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=a3mL236y; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="a3mL236y" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1714039484; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=t7YJePHmU0xnd5mm75PGlWk6ufheCOsZkTtpzDbbBcI=; b=a3mL236yPkps8aoaWEfF5UUOLGEGYVTLVo3eWD51lX+57T4qJLj1FGrhdm/mOHrsjGQBTe 4iyglNcpOAxmChPsz0/B39tBLkc7R6H+KrAOb82JIa515+DdzclewpTPvYWT6gIS505qz6 REqFqlOQnC2RsI1CkWNnKjIu7ZzxXko= Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-503-3-O0xwkSOSC8QGsRUFmQ-g-1; Thu, 25 Apr 2024 06:04:42 -0400 X-MC-Unique: 3-O0xwkSOSC8QGsRUFmQ-g-1 Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-5c6245bc7caso843574a12.3 for ; Thu, 25 Apr 2024 03:04:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714039482; x=1714644282; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=t7YJePHmU0xnd5mm75PGlWk6ufheCOsZkTtpzDbbBcI=; b=KtTdlZnaOYD2gMB014Kz9UoiPIEkG15QDLjI0DRnYkDT//aT/3l9V/L9RkkCsljdln KOz6GaPCITSS7kx8mCLmx8K5HCFu207H17IN50mxjwacaM1UGR5NeUvEBa0X4evvWk9f CzUszrdoMUujlfImrBDmlyDvyq77cKjOWqC233i3jhplEhOUl7Nkm7dLJTZ7jFxp9D8j VbGsxH/coAcKcqsiW8ZWgHrW+InpmQfXb1uvAH78zZfIY9ZEwJTblQlEdtYAxGwp5K5B U92L/L7sWrGwD04TvfMdogWnkUvQ1JskZPY/wMocdxl1oeK4EpXw5GfLY+ONjxFO4GVg 8m2Q== X-Forwarded-Encrypted: i=1; AJvYcCXSQVPrY230CBReE+fVRASTwrAVGRUuwN4ug3su3CUUprcrP6bz2Wu2u6fOl1zGnO2evCg9LghG8mMFiPobmciSwLuAijbji8l6hZkP X-Gm-Message-State: AOJu0Yzw+2m1gfOqfn/F87beuexKaw38ngot3QZEn36WSrUpFpttJZX7 9cnV0Soia711ZmI/ms2nRzwrdwgTOBeLQukebTZ8v1J0bXv6tmFmW57VocduNPoS5Th1FY7o2b4 6QlLbDsqHLYpvsyCuJoKJ61ZHNdty2mhVf7ZE5wCJUrRISBsCsXWTjgOnbeUOyw== X-Received: by 2002:a17:902:ce8b:b0:1ea:d979:d778 with SMTP id f11-20020a170902ce8b00b001ead979d778mr224430plg.5.1714039481204; Thu, 25 Apr 2024 03:04:41 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHN0TZp8wDqekae9LssrRvMGxaiGtqZMmDqIbLmVRxKgwD9CaWsKIbQrIIuSnXcFnS4B8UqqA== X-Received: by 2002:a17:902:ce8b:b0:1ea:d979:d778 with SMTP id f11-20020a170902ce8b00b001ead979d778mr224381plg.5.1714039480577; Thu, 25 Apr 2024 03:04:40 -0700 (PDT) Received: from localhost ([43.228.180.230]) by smtp.gmail.com with ESMTPSA id e13-20020a17090ab38d00b0029c49ed3974sm12575962pjr.37.2024.04.25.03.04.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Apr 2024 03:04:40 -0700 (PDT) From: Coiby Xu To: kexec@lists.infradead.org Cc: Ondrej Kozina , Milan Broz , Thomas Staudt , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Kairui Song , dm-devel@redhat.com, Jan Pazdziora , Pingfan Liu , Baoquan He , Dave Young , linux-kernel@vger.kernel.org, x86@kernel.org, Dave Hansen , Vitaly Kuznetsov , Eric Biederman Subject: [PATCH v3 1/7] kexec_file: allow to place kexec_buf randomly Date: Thu, 25 Apr 2024 18:04:25 +0800 Message-ID: <20240425100434.198925-2-coxu@redhat.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240425100434.198925-1-coxu@redhat.com> References: <20240425100434.198925-1-coxu@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Currently, kexec_buf is placed in order which means for the same machine, the info in the kexec_buf is always located at the same position each time the machine is booted. This may cause a risk for sensitive information like LUKS volume key. Now struct kexec_buf has a new field random which indicates it's supposed to be placed in a random position. Suggested-by: Jan Pazdziora Signed-off-by: Coiby Xu --- include/linux/kexec.h | 2 ++ kernel/kexec_file.c | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/include/linux/kexec.h b/include/linux/kexec.h index 060835bb82d5..fc1e20d565d5 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -171,6 +171,7 @@ int kexec_image_post_load_cleanup_default(struct kimage= *image); * @buf_min: The buffer can't be placed below this address. * @buf_max: The buffer can't be placed above this address. * @top_down: Allocate from top of memory. + * @random: Place the buffer at a random position. */ struct kexec_buf { struct kimage *image; @@ -182,6 +183,7 @@ struct kexec_buf { unsigned long buf_min; unsigned long buf_max; bool top_down; + bool random; }; =20 int kexec_load_purgatory(struct kimage *image, struct kexec_buf *kbuf); diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index 2d1db05fbf04..e0630fe30d43 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include "kexec_internal.h" @@ -432,6 +433,16 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, = initrd_fd, return ret; } =20 +static unsigned long kexec_random_start(unsigned long start, unsigned long= end) +{ + unsigned long temp_start; + unsigned short i; + + get_random_bytes(&i, sizeof(unsigned short)); + temp_start =3D start + (end - start) / USHRT_MAX * i; + return temp_start; +} + static int locate_mem_hole_top_down(unsigned long start, unsigned long end, struct kexec_buf *kbuf) { @@ -440,6 +451,8 @@ static int locate_mem_hole_top_down(unsigned long start= , unsigned long end, =20 temp_end =3D min(end, kbuf->buf_max); temp_start =3D temp_end - kbuf->memsz + 1; + if (kbuf->random) + temp_start =3D kexec_random_start(temp_start, temp_end); =20 do { /* align down start */ @@ -477,6 +490,8 @@ static int locate_mem_hole_bottom_up(unsigned long star= t, unsigned long end, unsigned long temp_start, temp_end; =20 temp_start =3D max(start, kbuf->buf_min); + if (kbuf->random) + temp_start =3D kexec_random_start(temp_start, end); =20 do { temp_start =3D ALIGN(temp_start, kbuf->buf_align); --=20 2.44.0 From nobody Sat Jul 11 14:54:37 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C20AC1272AE for ; Thu, 25 Apr 2024 10:04:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039490; cv=none; b=pKnXOcLixAHvGYEPjeNmd/UGuULRprxFcAkAVjXZEkJ1NYbbCh2OqbCKJfrE/AYoTa4LKPFI51ImJPu+J52CYVlgUNlBHkp5oEfe9CjAb18mJAJUgUDy5qr/q5tvbeADhrmXK0jmRtFnLhMNqaWYCe0RphYoGOdwhKyTYWWL0rU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039490; c=relaxed/simple; bh=mIDQVZmFbIOBvbRSr2aBeVxgZJBoH7unnRDUUvfDlxA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BeM2CulJ7IjbBZokYZi1x1FJ+/6GVcJXHW1caWLuMCX6aDrTm/SMJLPxOrNvQ6H6Rr7hbegCoedhor9nYtPglS/7NmBA9/eBLYVXKgnKJ6q4baefs/3+iwWOaQA5h6izliYkKmhMxGBBXXJWjPzQXH7E8UAq5OS9yH2uXoage4w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=h27tuwEA; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="h27tuwEA" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1714039487; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=a1WvQVElEBbzuyapN0iJk9xUP1lV1tjo8L1zhcJQztk=; b=h27tuwEArr6AE6j3nhOXWvsk+Q0DD/m/Sm5+eyo1r3LODi2iCOpCHf5bSSvcXLiz3FiHPh w0f9l3Ga6ZoQS+04+SBlXCAYC8mNO36F/TQDgB9AgGpN5Xo15K0rj8GvE15Bl0UumoGOd8 AXH8ZNOym1Q9WNCy5Eqpm3Svp5nnZtY= Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-197-L9Q3fzJuODCO6ytypwpqog-1; Thu, 25 Apr 2024 06:04:46 -0400 X-MC-Unique: L9Q3fzJuODCO6ytypwpqog-1 Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-1e2c1ce5d14so10401525ad.3 for ; Thu, 25 Apr 2024 03:04:46 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714039485; x=1714644285; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=a1WvQVElEBbzuyapN0iJk9xUP1lV1tjo8L1zhcJQztk=; b=u1vKAumkWEEqXLFFH0m7L63DtClg49uNBDjfMx67bEblrmfHfk0l7TghQYRJq8xkoa 7AywdYCMxKzvnEnXHDLouvqPrswAof5/wE1PpSwuyw1eaTWrnW/R0u5fMXVJglm+MMUv ENfG1qqQvxBoBqmk86nvWLUtEmNuCCtEUU19PRnXtcHd0kOKB8dqF98r2P9QjJW7BdNw KnDEO2aOjApsFJqdvLn7RyFC/8OfuDODu6q2FehHTRcEmIhj7FlzQeQBd0UzEfUj/EzW IRUoerqiB2jNRL4L1RMiZTpP/cElH/LXoXRA2cxUjKiRECdOgeVSXMlk8gaMQ20gD0Ip rasQ== X-Forwarded-Encrypted: i=1; AJvYcCUPF0MapawEtkRD2K0N+BmuM1HnGiUcsD7kBjhp8mD3MNfEFYUHcK6cWgl+8x252kh3UpIEOEJ1yurhKk2wUr78qMavEVTHphQEXUoe X-Gm-Message-State: AOJu0YwuGQnlqXLzrwSGX56J9jORPeulBUeiHSwAmtxyYaABqICYF7jR mjr4qOM7g1t7DtE1mZKvJafmv1+fTKRCozU+4nIBaQIeTi7mZBVcsGi/dIes3zA+MSbRY2QU8KX BzxJt+ltmxsahn2fMSLazkBlWHRGYWz5qIEdrLGMJwcGZK2Dr1vY3QdezR2uALg== X-Received: by 2002:a17:903:32c6:b0:1e4:dcfe:848f with SMTP id i6-20020a17090332c600b001e4dcfe848fmr6586828plr.16.1714039484810; Thu, 25 Apr 2024 03:04:44 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE6pO2drBoU+AkObmupaAop6L5yQaI22V7bV87rZpQugB2zH3HfS0+Y89xAPgCuV9dfoJZNjw== X-Received: by 2002:a17:903:32c6:b0:1e4:dcfe:848f with SMTP id i6-20020a17090332c600b001e4dcfe848fmr6586754plr.16.1714039483991; Thu, 25 Apr 2024 03:04:43 -0700 (PDT) Received: from localhost ([43.228.180.230]) by smtp.gmail.com with ESMTPSA id h3-20020a170902680300b001e107222eb5sm13626951plk.191.2024.04.25.03.04.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Apr 2024 03:04:43 -0700 (PDT) From: Coiby Xu To: kexec@lists.infradead.org Cc: Ondrej Kozina , Milan Broz , Thomas Staudt , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Kairui Song , dm-devel@redhat.com, Jan Pazdziora , Pingfan Liu , Baoquan He , Dave Young , linux-kernel@vger.kernel.org, x86@kernel.org, Dave Hansen , Vitaly Kuznetsov , Vivek Goyal , Kees Cook , "Gustavo A. R. Silva" , linux-hardening@vger.kernel.org (open list:KERNEL HARDENING (not covered by other areas):Keyword:\b__counted_by\b) Subject: [PATCH v3 2/7] crash_dump: make dm crypt keys persist for the kdump kernel Date: Thu, 25 Apr 2024 18:04:26 +0800 Message-ID: <20240425100434.198925-3-coxu@redhat.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240425100434.198925-1-coxu@redhat.com> References: <20240425100434.198925-1-coxu@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" A sysfs /sys/kernel/crash_dm_crypt_keys is provided for user space to make the dm crypt keys persist for the kdump kernel. User space can send the following commands, - "init KEY_NUM" Initialize needed structures - "record KEY_DESC" Record a key description. The key must be a logon key. User space can also read this API to learn about current state. Signed-off-by: Coiby Xu --- include/linux/crash_core.h | 5 +- kernel/Kconfig.kexec | 8 +++ kernel/Makefile | 1 + kernel/crash_dump_dm_crypt.c | 113 +++++++++++++++++++++++++++++++++++ kernel/ksysfs.c | 22 +++++++ 5 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 kernel/crash_dump_dm_crypt.c diff --git a/include/linux/crash_core.h b/include/linux/crash_core.h index d33352c2e386..98825b7e0ea6 100644 --- a/include/linux/crash_core.h +++ b/include/linux/crash_core.h @@ -34,7 +34,10 @@ static inline void arch_kexec_protect_crashkres(void) { } static inline void arch_kexec_unprotect_crashkres(void) { } #endif =20 - +#ifdef CONFIG_CRASH_DM_CRYPT +int crash_sysfs_dm_crypt_keys_read(char *buf); +int crash_sysfs_dm_crypt_keys_write(const char *buf, size_t count); +#endif =20 #ifndef arch_crash_handle_hotplug_event static inline void arch_crash_handle_hotplug_event(struct kimage *image) {= } diff --git a/kernel/Kconfig.kexec b/kernel/Kconfig.kexec index 6c34e63c88ff..88525ad1c80a 100644 --- a/kernel/Kconfig.kexec +++ b/kernel/Kconfig.kexec @@ -116,6 +116,14 @@ config CRASH_DUMP For s390, this option also enables zfcpdump. See also =20 +config CRASH_DM_CRYPT + bool "Support saving crash dump to dm-crypt encrypted volume" + depends on CRASH_DUMP + help + With this option enabled, user space can intereact with + /sys/kernel/crash_dm_crypt_keys to make the dm crypt keys + persistent for the crash dump kernel. + config CRASH_HOTPLUG bool "Update the crash elfcorehdr on system configuration changes" default y diff --git a/kernel/Makefile b/kernel/Makefile index 3c13240dfc9f..f2e5b3e86d12 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -72,6 +72,7 @@ obj-$(CONFIG_VMCORE_INFO) +=3D vmcore_info.o elfcorehdr.o obj-$(CONFIG_CRASH_RESERVE) +=3D crash_reserve.o obj-$(CONFIG_KEXEC_CORE) +=3D kexec_core.o obj-$(CONFIG_CRASH_DUMP) +=3D crash_core.o +obj-$(CONFIG_CRASH_DM_CRYPT) +=3D crash_dump_dm_crypt.o obj-$(CONFIG_KEXEC) +=3D kexec.o obj-$(CONFIG_KEXEC_FILE) +=3D kexec_file.o obj-$(CONFIG_KEXEC_ELF) +=3D kexec_elf.o diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c new file mode 100644 index 000000000000..847499cdcd42 --- /dev/null +++ b/kernel/crash_dump_dm_crypt.c @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: GPL-2.0-only +#include +#include + +#define KEY_NUM_MAX 128 +#define KEY_SIZE_MAX 256 + +// The key scription has the format: cryptsetup:UUID 11+36+1(NULL)=3D48 +#define KEY_DESC_LEN 48 + +static char *STATE_STR[] =3D {"fresh", "initialized", "recorded", "loaded"= }; +enum STATE_ENUM { + FRESH =3D 0, + INITIALIZED, + RECORDED, + LOADED, +} state; + +static unsigned int key_count; +static size_t keys_header_size; + +struct dm_crypt_key { + unsigned int key_size; + char key_desc[KEY_DESC_LEN]; + u8 data[KEY_SIZE_MAX]; +}; + +struct keys_header { + unsigned int key_count; + struct dm_crypt_key keys[] __counted_by(key_count); +} *keys_header; + +static size_t get_keys_header_size(struct keys_header *keys_header, + size_t key_count) +{ + return struct_size(keys_header, keys, key_count); +} + +static int init(const char *buf) +{ + unsigned int total_keys; + char dummy[5]; + + if (sscanf(buf, "%4s %u", dummy, &total_keys) !=3D 2) + return -EINVAL; + + if (key_count > KEY_NUM_MAX) { + pr_err("Exceed the maximum number of keys (KEY_NUM_MAX=3D%u)\n", + KEY_NUM_MAX); + return -EINVAL; + } + + keys_header_size =3D get_keys_header_size(keys_header, total_keys); + key_count =3D 0; + + keys_header =3D kzalloc(keys_header_size, GFP_KERNEL); + if (!keys_header) + return -ENOMEM; + + keys_header->key_count =3D total_keys; + state =3D INITIALIZED; + return 0; +} + +static int record_key_desc(const char *buf, struct dm_crypt_key *dm_key) +{ + char key_desc[KEY_DESC_LEN]; + char dummy[7]; + + if (state !=3D INITIALIZED) + pr_err("Please send the cmd 'init ' first\n"); + + if (sscanf(buf, "%6s %s", dummy, key_desc) !=3D 2) + return -EINVAL; + + if (key_count >=3D keys_header->key_count) { + pr_warn("Already have %u keys", key_count); + return -EINVAL; + } + + strscpy(dm_key->key_desc, key_desc, KEY_DESC_LEN); + pr_debug("Key%d (%s) recorded\n", key_count, dm_key->key_desc); + key_count++; + + if (key_count =3D=3D keys_header->key_count) + state =3D RECORDED; + + return 0; +} + +static int process_cmd(const char *buf, size_t count) +{ + if (strncmp(buf, "init ", 5) =3D=3D 0) + return init(buf); + else if (strncmp(buf, "record ", 7) =3D=3D 0) + return record_key_desc(buf, &keys_header->keys[key_count]); + + return -EINVAL; +} + +int crash_sysfs_dm_crypt_keys_write(const char *buf, size_t count) +{ + if (!is_kdump_kernel()) + return process_cmd(buf, count); + return -EINVAL; +} +EXPORT_SYMBOL(crash_sysfs_dm_crypt_keys_write); + +int crash_sysfs_dm_crypt_keys_read(char *buf) +{ + return sprintf(buf, "%s\n", STATE_STR[state]); +} +EXPORT_SYMBOL(crash_sysfs_dm_crypt_keys_read); diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c index 495b69a71a5d..98cc84d5510c 100644 --- a/kernel/ksysfs.c +++ b/kernel/ksysfs.c @@ -167,6 +167,25 @@ static ssize_t vmcoreinfo_show(struct kobject *kobj, } KERNEL_ATTR_RO(vmcoreinfo); =20 +#ifdef CONFIG_CRASH_DM_CRYPT +static ssize_t crash_dm_crypt_keys_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return crash_sysfs_dm_crypt_keys_read(buf); +} + +static ssize_t crash_dm_crypt_keys_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + int ret; + + ret =3D crash_sysfs_dm_crypt_keys_write(buf, count); + return ret < 0 ? ret : count; +} +KERNEL_ATTR_RW(crash_dm_crypt_keys); +#endif /* CONFIG_CRASH_DM_CRYPT */ + #ifdef CONFIG_CRASH_HOTPLUG static ssize_t crash_elfcorehdr_size_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) @@ -271,6 +290,9 @@ static struct attribute * kernel_attrs[] =3D { #endif #ifdef CONFIG_VMCORE_INFO &vmcoreinfo_attr.attr, +#ifdef CONFIG_CRASH_DM_CRYPT + &crash_dm_crypt_keys_attr.attr, +#endif #ifdef CONFIG_CRASH_HOTPLUG &crash_elfcorehdr_size_attr.attr, #endif --=20 2.44.0 From nobody Sat Jul 11 14:54:37 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0E91D127B60 for ; Thu, 25 Apr 2024 10:04:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039494; cv=none; b=PiJZLeSkFiITL6sNDj39qMwK92zIj5Z05dmAFubVXWS6Nvz78UG/CCHGDyyQDksyDmBEUP5gJjHA1iVC1zbJAUh1dUurt63F377NU625oMp6OP1AXRi+tZNhus8g4PemeATAhl0nq1yk/2b9oiOff/CpCjDN7tAZLb6+BZIHCEw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039494; c=relaxed/simple; bh=E3vPo8rJPlRUqYbxvgoITxG9JVj+FDFh4EQqeMNQYVQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=REqjBVH+DwIhcK5VYtvL7BjBAbG2uL52QrWWkfSOIxZJsJuxHY4XM/7q0xYye4qcGpUcGb7wu3AHeuhPhc9i/i9PXg/FLkvwoOXsridXUe6tK6BHKIbS36RJAlhVtov73fsmESaQ+kV4vc38deNie7HjWMLZcswSSnAyy66pvU8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=WSJ9utcd; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="WSJ9utcd" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1714039492; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mSAzgqiOHIuKA09Cs5shkE69JGVMkIODKj0EL1ZNyW4=; b=WSJ9utcdzL4FnlkZyKkutNhN3HEBS6z+nlt1Ppqo4l/sUJvGiX/UNChnVVvUJwTQvPN/xN xHvQmq5pcRNMEzOlIZ1CdiS/YFTFF4aMnq4umyayLNZ43iLfYo3ei1z4Pox6+hsWyg/T9P 5YVX9s8pPkKNPccFNtRNpTV93cH7CNk= Received: from mail-il1-f198.google.com (mail-il1-f198.google.com [209.85.166.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-219-Kjp_WYYiP3ivxSm2rmT7ew-1; Thu, 25 Apr 2024 06:04:49 -0400 X-MC-Unique: Kjp_WYYiP3ivxSm2rmT7ew-1 Received: by mail-il1-f198.google.com with SMTP id e9e14a558f8ab-36c2ff79144so2494905ab.2 for ; Thu, 25 Apr 2024 03:04:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714039489; x=1714644289; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mSAzgqiOHIuKA09Cs5shkE69JGVMkIODKj0EL1ZNyW4=; b=JwBUVKqf7bXRx+DYdMF02lag2rn1l9DHBaHKt8zoeeY8YmHvgUJGOnxBr2hM6dN7JT +8kSMnwSPoVeJz/eoyXNAxgYrxrTS0v6USJGeRUUi7iJ5H3I5V6INVaDjKCK4eePK2j6 uhhIQtB8zfkqErg4tzkktSh1/JhWicDeOUSFYJZ4+Js4YHPmyRAK2hsPVHT6YqTqWBsA sRw0lVoPQmE6dVjuTBno7pJsYfK5WRc71h5mieQIQJzfkfgj2pxKRRQIfCl0w5LSGCop Z+RjEmWikPM2YlQNnze0gHAiUED3ytdI/yZtCFkWFQhOZsaYTceb1Dt28nyKf/+PkUm5 Engg== X-Forwarded-Encrypted: i=1; AJvYcCVH6Q9de5/itr3pD84DbquDJKsk3Da78C1ZMaeXqqWWYBWrqj5a7jqNHQyYWPRQP7Lb2hwg3tnjG0UP4BNVv3wRx+QXvZ0doLOu+qid X-Gm-Message-State: AOJu0Yzi/E/52IG6Q+BzSShWY+zIzUDZIUroZoQOpqSxwSHSg6hdgTVo vg9TQGOo0bHSlvFupfimSs7ub0JIlvS/1jx681hToPqS3GQCxWtBxBhjqcWfouo+TPsrGy78Kvm eBkBIS7Hph22PLJVrLspycIgnyLklvrGFw3WAUarIQt9/mJOq1bJ+drCw17i0ig== X-Received: by 2002:a05:6e02:1745:b0:36a:2934:a8e5 with SMTP id y5-20020a056e02174500b0036a2934a8e5mr5635760ill.9.1714039488429; Thu, 25 Apr 2024 03:04:48 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGoMQilVk8BI7H+0dXhYwX2dauRoxQgUM6e36ENJnKqLls92oinsXqpyWO930vlNvqn3rst5Q== X-Received: by 2002:a05:6e02:1745:b0:36a:2934:a8e5 with SMTP id y5-20020a056e02174500b0036a2934a8e5mr5635712ill.9.1714039487818; Thu, 25 Apr 2024 03:04:47 -0700 (PDT) Received: from localhost ([43.228.180.230]) by smtp.gmail.com with ESMTPSA id v28-20020a63481c000000b005f7536fbebfsm12282033pga.11.2024.04.25.03.04.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Apr 2024 03:04:47 -0700 (PDT) From: Coiby Xu To: kexec@lists.infradead.org Cc: Ondrej Kozina , Milan Broz , Thomas Staudt , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Kairui Song , dm-devel@redhat.com, Jan Pazdziora , Pingfan Liu , Baoquan He , Dave Young , linux-kernel@vger.kernel.org, x86@kernel.org, Dave Hansen , Vitaly Kuznetsov , Vivek Goyal , Eric Biederman Subject: [PATCH v3 3/7] crash_dump: store dm keys in kdump reserved memory Date: Thu, 25 Apr 2024 18:04:27 +0800 Message-ID: <20240425100434.198925-4-coxu@redhat.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240425100434.198925-1-coxu@redhat.com> References: <20240425100434.198925-1-coxu@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When the kdump kernel image and initrd are loaded, the dm crypts keys will be read from keyring and then stored in kdump reserved memory. Signed-off-by: Coiby Xu --- include/linux/crash_core.h | 3 ++ include/linux/crash_dump.h | 2 + include/linux/kexec.h | 4 ++ kernel/crash_dump_dm_crypt.c | 87 ++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+) diff --git a/include/linux/crash_core.h b/include/linux/crash_core.h index 98825b7e0ea6..1f3d5a4fa6c1 100644 --- a/include/linux/crash_core.h +++ b/include/linux/crash_core.h @@ -37,6 +37,9 @@ static inline void arch_kexec_unprotect_crashkres(void) {= } #ifdef CONFIG_CRASH_DM_CRYPT int crash_sysfs_dm_crypt_keys_read(char *buf); int crash_sysfs_dm_crypt_keys_write(const char *buf, size_t count); +int crash_load_dm_crypt_keys(struct kimage *image); +#else +static inline int crash_load_dm_crypt_keys(struct kimage *image) {return 0= ; } #endif =20 #ifndef arch_crash_handle_hotplug_event diff --git a/include/linux/crash_dump.h b/include/linux/crash_dump.h index acc55626afdc..dfd8e4fe6129 100644 --- a/include/linux/crash_dump.h +++ b/include/linux/crash_dump.h @@ -15,6 +15,8 @@ extern unsigned long long elfcorehdr_addr; extern unsigned long long elfcorehdr_size; =20 +extern unsigned long long dm_crypt_keys_addr; + #ifdef CONFIG_CRASH_DUMP extern int elfcorehdr_alloc(unsigned long long *addr, unsigned long long *= size); extern void elfcorehdr_free(unsigned long long addr); diff --git a/include/linux/kexec.h b/include/linux/kexec.h index fc1e20d565d5..b6cedce66828 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -368,6 +368,10 @@ struct kimage { void *elf_headers; unsigned long elf_headers_sz; unsigned long elf_load_addr; + + /* dm crypt keys buffer */ + unsigned long dm_crypt_keys_addr; + unsigned long dm_crypt_keys_sz; }; =20 /* kexec interface functions */ diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c index 847499cdcd42..b9997fb53351 100644 --- a/kernel/crash_dump_dm_crypt.c +++ b/kernel/crash_dump_dm_crypt.c @@ -1,4 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only +#include +#include #include #include =20 @@ -111,3 +113,88 @@ int crash_sysfs_dm_crypt_keys_read(char *buf) return sprintf(buf, "%s\n", STATE_STR[state]); } EXPORT_SYMBOL(crash_sysfs_dm_crypt_keys_read); + +static int read_key_from_user_keying(struct dm_crypt_key *dm_key) +{ + const struct user_key_payload *ukp; + struct key *key; + + pr_debug("Requesting key %s", dm_key->key_desc); + key =3D request_key(&key_type_logon, dm_key->key_desc, NULL); + + if (IS_ERR(key)) { + pr_warn("No such key %s\n", dm_key->key_desc); + return PTR_ERR(key); + } + + ukp =3D user_key_payload_locked(key); + if (!ukp) + return -EKEYREVOKED; + + memcpy(dm_key->data, ukp->data, ukp->datalen); + dm_key->key_size =3D ukp->datalen; + pr_debug("Get dm crypt key (size=3D%u) %s: %8ph\n", dm_key->key_size, + dm_key->key_desc, dm_key->data); + return 0; +} + +static int build_keys_header(void) +{ + int i, r; + + for (i =3D 0; i < key_count; i++) { + r =3D read_key_from_user_keying(&keys_header->keys[i]); + if (r !=3D 0) { + pr_err("Failed to read key %s\n", keys_header->keys[i].key_desc); + return r; + } + } + + return 0; +} + +int crash_load_dm_crypt_keys(struct kimage *image) +{ + struct kexec_buf kbuf =3D { + .image =3D image, + .buf_min =3D 0, + .buf_max =3D ULONG_MAX, + .top_down =3D false, + .random =3D true, + }; + + int r; + + if (state =3D=3D FRESH) + return 0; + + if (key_count !=3D keys_header->key_count) { + pr_err("Only record %u keys (%u in total)\n", key_count, + keys_header->key_count); + return -EINVAL; + } + + image->dm_crypt_keys_addr =3D 0; + r =3D build_keys_header(); + if (r) + return r; + + kbuf.buffer =3D keys_header; + kbuf.bufsz =3D keys_header_size; + + kbuf.memsz =3D kbuf.bufsz; + kbuf.buf_align =3D ELF_CORE_HEADER_ALIGN; + kbuf.mem =3D KEXEC_BUF_MEM_UNKNOWN; + r =3D kexec_add_buffer(&kbuf); + if (r) { + vfree((void *)kbuf.buffer); + return r; + } + state =3D LOADED; + image->dm_crypt_keys_addr =3D kbuf.mem; + image->dm_crypt_keys_sz =3D kbuf.bufsz; + pr_debug("Loaded dm crypt keys at 0x%lx bufsz=3D0x%lx memsz=3D0x%lx\n", + image->dm_crypt_keys_addr, kbuf.bufsz, kbuf.bufsz); + + return r; +} --=20 2.44.0 From nobody Sat Jul 11 14:54:37 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7B20E8627A for ; Thu, 25 Apr 2024 10:04:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039497; cv=none; b=n0vyDE72rzuGSzZKlKA5fzaqFUq9SzqEEpPQR1dcAn+s4yFCPr2oliCbeRQxlYP+VwZc5y8al+5ZZ4qDHtgTksc9J/2McC8QwNeSzVXPYSUTJ+hhMRDnjCdb4aPe7OrYK1fwP49UDG1E3u2zPoLGBcQHAObnQ6Fm+V0sRzKNTOk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039497; c=relaxed/simple; bh=jiH4fu8/d34YSy0cFMMAzSQZSVdjtoDG5y3BIOP84IE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oOu1II0WcJsP+B4gKc0xISvEwt4lqGA8WTkg7/BAEquPJhzFPOlLQ3Uc+gG8OrdYhHuvI6TchaQIyyusR3r7Dhzi1hLIw1jS2MeZImQmDKYKAe5Xh34/RtFwKwijro7+FhM3uzQAdsgjijfCtBU1/XDPohKswEvO6hbz09moBYA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=MlVXKWZ0; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="MlVXKWZ0" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1714039495; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pLflBXNszRtBuRpxO//dVzBazjZLk2Gj5DkRzwtS+Dk=; b=MlVXKWZ0A5uttu+oUk1nhmo6aTn7SCs3uU9EF+t12BaeLqrlRteqlTku6GiL1iSjauoMnK jPnATQvLtt10mjqfPIUawfM5eKIj7em0ezi7SJT6P3Yr0D4W7BzM1HlZEBL3hw5jT8OEmS 2+FW2uCMultokFXuBgTxxiH6rKnHJsg= Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-528-a74Ll2uBOLmqtkbugER6xA-1; Thu, 25 Apr 2024 06:04:54 -0400 X-MC-Unique: a74Ll2uBOLmqtkbugER6xA-1 Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-1e8fc91661fso9157835ad.1 for ; Thu, 25 Apr 2024 03:04:54 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714039492; x=1714644292; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=pLflBXNszRtBuRpxO//dVzBazjZLk2Gj5DkRzwtS+Dk=; b=MFWtJkRvQ2Qou1WUy9Xkq0X3x+dwAjVqjp7i6XmBl7s1e7ir5OrQ9F6TPG7gyquaH2 jGJEXGba5nS86nG0MwYTf0F9D9U6UiJkxNaTD40WE0+GbUPoxdq8G06ewsqLj6of2lbM QYTgmsWSRtkEg8rLqgYujE7HRenh5np3w+jZyI/ks1UAsZ2nX6ttTNzBtPNkMcxZZpDC E7RxXSxhrlbu8jND+YHE909hTyfpQDlTjMnwzplTdysulyo1VbaWc790OP2SdxhpWxb8 /TmcaSP0bx7pXgpgyhKjlaosf2MYVyVX7jpMek+ygv/S8Z6ePtXvIBLko7+ZhZ/K/yDa nPFQ== X-Forwarded-Encrypted: i=1; AJvYcCX4wzb/G3Qux5aFjKYjf/7lq042NkFafhX9x3JY/6C/GgilPcpB2u+sb1olLWEJPBUokKVMZ0gwnKOfnl8xU2Ba2mqDqvb2dzxpu1RB X-Gm-Message-State: AOJu0YyCKC14/GSGhtg3ln92zRZgBYW4LsR/az4Rr43m1XUNgRSdBdkj kGsVa46glY/tfd5aPqVWWPNRuc6m7LO1vKs52WpTyJW/OM0wfLQREpPzK1KfD8gpR0vzpw2LZoT QVifJi4ZYKJqi3GWd8X0Md4/e4yfczZrSIdvVBg3YU+8ur6CNWJIvHUK3Ejb58g== X-Received: by 2002:a17:903:2288:b0:1e4:49:de46 with SMTP id b8-20020a170903228800b001e40049de46mr6875486plh.47.1714039491569; Thu, 25 Apr 2024 03:04:51 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFZFjoqzqm/eHvCHGiqfc9ChhdN+leiDzn4HzL+638L4OQVPvBwwbFi4eWPAqIrNcCbrUhKgA== X-Received: by 2002:a17:903:2288:b0:1e4:49:de46 with SMTP id b8-20020a170903228800b001e40049de46mr6875447plh.47.1714039490967; Thu, 25 Apr 2024 03:04:50 -0700 (PDT) Received: from localhost ([43.228.180.230]) by smtp.gmail.com with ESMTPSA id kp7-20020a170903280700b001e99fdbc515sm7461086plb.3.2024.04.25.03.04.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Apr 2024 03:04:50 -0700 (PDT) From: Coiby Xu To: kexec@lists.infradead.org Cc: Ondrej Kozina , Milan Broz , Thomas Staudt , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Kairui Song , dm-devel@redhat.com, Jan Pazdziora , Pingfan Liu , Baoquan He , Dave Young , linux-kernel@vger.kernel.org, x86@kernel.org, Dave Hansen , Vitaly Kuznetsov , Vivek Goyal Subject: [PATCH v3 4/7] crash_dump: reuse saved dm crypt keys for CPU/memory hot-plugging Date: Thu, 25 Apr 2024 18:04:28 +0800 Message-ID: <20240425100434.198925-5-coxu@redhat.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240425100434.198925-1-coxu@redhat.com> References: <20240425100434.198925-1-coxu@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When there is CPU/memory hot-plugging, the kdump kernel image and initrd will be reloaded. The user space can write the "reuse" command to /sys/kernel/crash_dm_crypt_key so the stored keys can be re-saved again. Note currently only x86 (commit ea53ad9cf73b ("x86/crash: add x86 crash hotplug support")) and ppc (WIP) supports the new infrastructure (commit 247262756121 ("crash: add generic infrastructure for crash hotplug support")). If the new infrastructure get extended to all arches, this patch can be dropped. Signed-off-by: Coiby Xu --- kernel/crash_dump_dm_crypt.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c index b9997fb53351..6ac1fabdb6cb 100644 --- a/kernel/crash_dump_dm_crypt.c +++ b/kernel/crash_dump_dm_crypt.c @@ -10,12 +10,13 @@ // The key scription has the format: cryptsetup:UUID 11+36+1(NULL)=3D48 #define KEY_DESC_LEN 48 =20 -static char *STATE_STR[] =3D {"fresh", "initialized", "recorded", "loaded"= }; +static char *STATE_STR[] =3D {"fresh", "initialized", "recorded", "loaded"= , "reuse"}; enum STATE_ENUM { FRESH =3D 0, INITIALIZED, RECORDED, LOADED, + REUSE, } state; =20 static unsigned int key_count; @@ -90,12 +91,31 @@ static int record_key_desc(const char *buf, struct dm_c= rypt_key *dm_key) return 0; } =20 +static void get_keys_from_kdump_reserved_memory(void) +{ + struct keys_header *keys_header_loaded; + + arch_kexec_unprotect_crashkres(); + + keys_header_loaded =3D kmap_local_page(pfn_to_page( + kexec_crash_image->dm_crypt_keys_addr >> PAGE_SHIFT)); + + memcpy(keys_header, keys_header_loaded, keys_header_size); + kunmap_local(keys_header_loaded); + state =3D RECORDED; +} + static int process_cmd(const char *buf, size_t count) { if (strncmp(buf, "init ", 5) =3D=3D 0) return init(buf); else if (strncmp(buf, "record ", 7) =3D=3D 0) return record_key_desc(buf, &keys_header->keys[key_count]); + else if (!strcmp(buf, "reuse")) { + state =3D REUSE; + get_keys_from_kdump_reserved_memory(); + return 0; + } =20 return -EINVAL; } @@ -175,9 +195,11 @@ int crash_load_dm_crypt_keys(struct kimage *image) } =20 image->dm_crypt_keys_addr =3D 0; - r =3D build_keys_header(); - if (r) - return r; + if (state !=3D REUSE) { + r =3D build_keys_header(); + if (r) + return r; + } =20 kbuf.buffer =3D keys_header; kbuf.bufsz =3D keys_header_size; --=20 2.44.0 From nobody Sat Jul 11 14:54:37 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 40D49127E24 for ; Thu, 25 Apr 2024 10:04:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039499; cv=none; b=lzKXRlJMK8ytblrE5F4uo3YZqIFr64luWYKPpxvgl/mRU/yc5mD/nmeYjYiMMpDpLe/coavoDHwOMIJqqhX/eNVLpOfwfcoVAfGCW6F4GtILXAzBO/QvsMETtJdYQdxAgyjMw22BQY+FDQ4HNWmFxTbqBf+6d5Kk6QIge/J8sDs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039499; c=relaxed/simple; bh=3Zp9ieU/+pUZuIcCJheRv35aOHQNsKellXzxSbAo2yk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ofh1tlen/Q3SToyZxfDhJhcN7T6QZIUU7Vly8BfymJ5EJt9KRuTh2y5BcHvaLcMMnpJu/7vt++DMtoYHs9w+bYx7jW2nMp85XGYqM0e0m/X8z/jWTRdIxrnabXlObeFgE+3pNj2cJUPU5tipIqbDAy76lYVzImW6iepDJgxFRzI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=aKuY58KF; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="aKuY58KF" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1714039497; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PtIYIJYKyy/5qzi0n/PqpS95u6O7t7oyOgbotIXFy7M=; b=aKuY58KFvCTYQislQUKkrssfVfIrY8dGIDx8tlcx2y6PdU3inFcm5XMdW4Qf1fLt7/Ykta 5alzQLlB0X1KQsnrypBC0bX21nKuQ1pa7UKOE4nst2JnvrXtEl5AGwKU6UR8YmDf9rl0Q6 2NxIG3Toa1FV3sJlRghyOAeN1BOeJek= Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-593-utERWzpXMNuAcWIXDpr8Lg-1; Thu, 25 Apr 2024 06:04:56 -0400 X-MC-Unique: utERWzpXMNuAcWIXDpr8Lg-1 Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-1e851c0204aso9554145ad.3 for ; Thu, 25 Apr 2024 03:04:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714039495; x=1714644295; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PtIYIJYKyy/5qzi0n/PqpS95u6O7t7oyOgbotIXFy7M=; b=Z7M3ge0BChHJ2ScniKrtJ8LBOvXaSWiJahHljGim5HcsI/rVrSpWmPG3Nx596IeqmD /9DyZ/FIeT13hxTGek+qBYo1y7NIDLlT/AQR9TjZqkE5nfZ/F0BEbAbgV/xztGu+aFDr SshgLNwMcYLqrz/9zVlQ1hJ40w6hYdDw736msYbab6UEJL3Vigmm4D65FCa0el+mZBVl ecSh17g7yahhClG+DJZ0qYcPbEcQZM842OyB78KYOm2u3jx8NXr7lvb5fkbP4evFk7Eb LAwe0zB+pJXxqiAQdco3LUsKUOQ+nShztnWYWhVGv6ShEzJu6StEEaK9JoGTXi/Tdc3N SUHg== X-Forwarded-Encrypted: i=1; AJvYcCW5+4GtvMVKWO23YPMUdegvG7/4FTobBSfgRUmZmy8kgMR42q/KcmhgRyRTevSeBMqIFy2wAKd1ikVZdYRu+zIwF4V4gyuftYRrBvPW X-Gm-Message-State: AOJu0Yyw2VC3z/LUJGX3tpWlY13BI7AMc6MGBWrCkLD/fCMSkTOaB18x N+Y8HquM+WlxseO7lWDFwsePqltKvx6LVNrhXGOyek6WBP/YqK/+WjjcLio+5PpB/+VQI8E0+82 EiAd/oebPFi8F+3iZff1oa/AingA6M6lMPEJ4wfChnMCv5XqFzE9ixtOAGvVdxQ== X-Received: by 2002:a17:902:f60c:b0:1e4:514a:55af with SMTP id n12-20020a170902f60c00b001e4514a55afmr6469093plg.68.1714039494623; Thu, 25 Apr 2024 03:04:54 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF4PhFmtr7NGtfSylsFrnAzg2TwlhAltH+JWa9HYv31v9hDfa9bCYeS47K2qWKVTo0k9n+0Ng== X-Received: by 2002:a17:902:f60c:b0:1e4:514a:55af with SMTP id n12-20020a170902f60c00b001e4514a55afmr6469053plg.68.1714039494088; Thu, 25 Apr 2024 03:04:54 -0700 (PDT) Received: from localhost ([43.228.180.230]) by smtp.gmail.com with ESMTPSA id u7-20020a17090341c700b001dcfaf4db22sm13411417ple.2.2024.04.25.03.04.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Apr 2024 03:04:53 -0700 (PDT) From: Coiby Xu To: kexec@lists.infradead.org Cc: Ondrej Kozina , Milan Broz , Thomas Staudt , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Kairui Song , dm-devel@redhat.com, Jan Pazdziora , Pingfan Liu , Baoquan He , Dave Young , linux-kernel@vger.kernel.org, x86@kernel.org, Dave Hansen , Vitaly Kuznetsov , Vivek Goyal Subject: [PATCH v3 5/7] crash_dump: retrieve dm crypt keys in kdump kernel Date: Thu, 25 Apr 2024 18:04:29 +0800 Message-ID: <20240425100434.198925-6-coxu@redhat.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240425100434.198925-1-coxu@redhat.com> References: <20240425100434.198925-1-coxu@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Crash kernel will retrieve the dm crypt keys based on the dmcryptkeys command line parameter. When user space writes the key description to /sys/kernel/crash_dm_crypt_key, the crash kernel will save the encryption keys to the user keyring. Then user space e.g. cryptsetup's --volume-key-keyring API can use it to unlock the encrypted device. Signed-off-by: Coiby Xu --- include/linux/crash_core.h | 1 + kernel/crash_dump_dm_crypt.c | 99 +++++++++++++++++++++++++++++++++++- 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/include/linux/crash_core.h b/include/linux/crash_core.h index 1f3d5a4fa6c1..1996e0739b6d 100644 --- a/include/linux/crash_core.h +++ b/include/linux/crash_core.h @@ -38,6 +38,7 @@ static inline void arch_kexec_unprotect_crashkres(void) {= } int crash_sysfs_dm_crypt_keys_read(char *buf); int crash_sysfs_dm_crypt_keys_write(const char *buf, size_t count); int crash_load_dm_crypt_keys(struct kimage *image); +ssize_t dm_crypt_keys_read(char *buf, size_t count, u64 *ppos); #else static inline int crash_load_dm_crypt_keys(struct kimage *image) {return 0= ; } #endif diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c index 6ac1fabdb6cb..9ddfe4c4d755 100644 --- a/kernel/crash_dump_dm_crypt.c +++ b/kernel/crash_dump_dm_crypt.c @@ -33,12 +33,67 @@ struct keys_header { struct dm_crypt_key keys[] __counted_by(key_count); } *keys_header; =20 +unsigned long long dm_crypt_keys_addr; +EXPORT_SYMBOL_GPL(dm_crypt_keys_addr); + +static int __init setup_dmcryptkeys(char *arg) +{ + char *end; + + if (!arg) + return -EINVAL; + dm_crypt_keys_addr =3D memparse(arg, &end); + if (end > arg) + return 0; + + dm_crypt_keys_addr =3D 0; + return -EINVAL; +} + +early_param("dmcryptkeys", setup_dmcryptkeys); + static size_t get_keys_header_size(struct keys_header *keys_header, size_t key_count) { return struct_size(keys_header, keys, key_count); } =20 +/* + * Architectures may override this function to read dm crypt key + */ +ssize_t __weak dm_crypt_keys_read(char *buf, size_t count, u64 *ppos) +{ + struct kvec kvec =3D { .iov_base =3D buf, .iov_len =3D count }; + struct iov_iter iter; + + iov_iter_kvec(&iter, READ, &kvec, 1, count); + return read_from_oldmem(&iter, count, ppos, false); +} + +static int add_key_to_keyring(struct dm_crypt_key *dm_key, + key_ref_t keyring_ref) +{ + key_ref_t key_ref; + int r; + + /* create or update the requested key and add it to the target keyring */ + key_ref =3D key_create_or_update(keyring_ref, "user", dm_key->key_desc, + dm_key->data, dm_key->key_size, + KEY_USR_ALL, KEY_ALLOC_IN_QUOTA); + + if (!IS_ERR(key_ref)) { + r =3D key_ref_to_ptr(key_ref)->serial; + key_ref_put(key_ref); + pr_alert("Success adding key %s", dm_key->key_desc); + } else { + r =3D PTR_ERR(key_ref); + pr_alert("Error when adding key"); + } + + key_ref_put(keyring_ref); + return r; +} + static int init(const char *buf) { unsigned int total_keys; @@ -120,11 +175,53 @@ static int process_cmd(const char *buf, size_t count) return -EINVAL; } =20 +static int restore_dm_crypt_keys_to_thread_keyring(const char *key_desc) +{ + struct dm_crypt_key *key; + key_ref_t keyring_ref; + u64 addr; + + /* find the target keyring (which must be writable) */ + keyring_ref =3D + lookup_user_key(KEY_SPEC_USER_KEYRING, 0x01, KEY_NEED_WRITE); + if (IS_ERR(keyring_ref)) { + pr_alert("Failed to get keyring"); + return PTR_ERR(keyring_ref); + } + + addr =3D dm_crypt_keys_addr; + dm_crypt_keys_read((char *)&key_count, sizeof(key_count), &addr); + if (key_count < 0 || key_count > KEY_NUM_MAX) { + pr_info("Failed to the number of dm_crypt keys\n"); + return -1; + } + + pr_debug("There are %u keys\n", key_count); + addr =3D dm_crypt_keys_addr; + + keys_header_size =3D get_keys_header_size(keys_header, key_count); + + keys_header =3D kzalloc(keys_header_size, GFP_KERNEL); + if (!keys_header) + return -ENOMEM; + + dm_crypt_keys_read((char *)keys_header, keys_header_size, &addr); + + for (int i =3D 0; i < keys_header->key_count; i++) { + key =3D &keys_header->keys[i]; + pr_alert("Get key (size=3D%u): %8ph...\n", key->key_size, key->data); + add_key_to_keyring(key, keyring_ref); + } + + return 0; +} + int crash_sysfs_dm_crypt_keys_write(const char *buf, size_t count) { if (!is_kdump_kernel()) return process_cmd(buf, count); - return -EINVAL; + else + return restore_dm_crypt_keys_to_thread_keyring(buf); } EXPORT_SYMBOL(crash_sysfs_dm_crypt_keys_write); =20 --=20 2.44.0 From nobody Sat Jul 11 14:54:37 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B570F128804 for ; Thu, 25 Apr 2024 10:05:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039504; cv=none; b=qv/1LUvvxxTgEzJ9NE9Hc9Flr4dubf7XXxCV0nWz5nyylVnox5V7vDxMF2nyRKqgA83etMro2dDPbwCKQH9OVgfI0SI7Waes6cFmV8XrDJZKyrGnDHnx8x6IAG/M0H0wN5Uf3Eji3wRxIaLHf0EPVCYfFklG2wM536+H7ZGTqNk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039504; c=relaxed/simple; bh=WwCFGkuEUhfYpOXGOtlQ0bc+aePAZJhfQPq/y/fFe+Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r3c25SdbyC+ueYNZcgPLB6zqSWNFVfBy8RwqR8LOZA5o8iJG7yx+TVG8DFoVooIKf4HhmJnmjGPHFL5hki90TPRKHfJ49KPLI4g7b+J3H4ZTfCZUCwr6Hm9CdQyvFi19K8XO3CmthXDTyC9U115L6IR7xjBBYSQj6mdCrZSFXP4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=JNtEPkRP; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="JNtEPkRP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1714039501; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uqT75ILAb+wFvlIguVkiSmYBoQIWQKOiZ3Xjg0k4Etc=; b=JNtEPkRPNEw5irNYq+Ch112LoJd7dwmCiaNf5ptsF+FpQUR8MEzrhmbrmOm2zK1R5ukFye BCIcyzwdOmfuqAWvd46Mbxb7IqW+yoyRxx6TzUMqTElRIi6f8ls1L+SuMC6NV8kNIqCBPY HIqWDd3Rxnsou/DeKUwqfSXRnHh0pv8= Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-626-yxb7iLx5MuG_zMVM2rlU4g-1; Thu, 25 Apr 2024 06:05:00 -0400 X-MC-Unique: yxb7iLx5MuG_zMVM2rlU4g-1 Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-2a537ab9d7eso940995a91.1 for ; Thu, 25 Apr 2024 03:05:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714039498; x=1714644298; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uqT75ILAb+wFvlIguVkiSmYBoQIWQKOiZ3Xjg0k4Etc=; b=RFcKm8v7dTqg+8SXfOX8XcKzIvhN4UV3+alo3+scRrG06B1seJdposaa5GpY+VC9ZN GZwUnXQSSaErv7MCZMQgwICDHrgIRI2G2nIW7qjh49ehZfQ9XcW1kBdhAHsEjka6sxV/ F/hZmSofl6wU3vn4X+QalGO8lzmUhuwVU8+0iT9ORzyqm7C+8q0FM2Cw6YFpVEN3yYlJ OS/cjwRxqATNveO/jKByKaIxuMcewK6tFLXO9cWucVxQRj/wH1IX3M0qrzimSmZwYtrM nGcVYPhsRjQowHZZuGIXC4Fd5tRX2Vm6FsgDEtnFF2Enew3v/lODATVtcP+7dwLkEuv6 WLkg== X-Forwarded-Encrypted: i=1; AJvYcCVALvQp3O8MzSem54grB3kFg/p99nDFhXNO1wDsF3LLE+5m96MnHerWBdcW+E84kSZ9tg8/ETXffSG2eRwUXwrDltliQs30tkz8I09h X-Gm-Message-State: AOJu0YzF1lJwcODAhnpp+BofkbVX2dim5anlgI4nwFoMyIB+xUo6kiVJ 6xn0ScB5xEHXSwlELbODQOoz53KzB+LOs1i80mRNBLBNHNguh8+HAcAKbNLiGUj4x6EmpEKU82b 73b0W0YdNK2wO/NG/kHXSRYVq+k87JceJ4+5Xepj8CNV2IApiJc3JRHr+L/iZFbeQApQzc7dAqx gb4Q== X-Received: by 2002:a17:90b:33ce:b0:2a0:215f:dc9c with SMTP id lk14-20020a17090b33ce00b002a0215fdc9cmr5203413pjb.35.1714039498204; Thu, 25 Apr 2024 03:04:58 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHkerGAZtBVpYNpabl6fa4ODw4MLi/9vUZ8BidoUeAUkdpOcdSRlbDJ6GDMr9WbPTTtyP66jA== X-Received: by 2002:a17:90b:33ce:b0:2a0:215f:dc9c with SMTP id lk14-20020a17090b33ce00b002a0215fdc9cmr5203372pjb.35.1714039497570; Thu, 25 Apr 2024 03:04:57 -0700 (PDT) Received: from localhost ([43.228.180.230]) by smtp.gmail.com with ESMTPSA id cn19-20020a17090af09300b002a2b06ce909sm14227786pjb.17.2024.04.25.03.04.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Apr 2024 03:04:56 -0700 (PDT) From: Coiby Xu To: kexec@lists.infradead.org Cc: Ondrej Kozina , Milan Broz , Thomas Staudt , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Kairui Song , dm-devel@redhat.com, Jan Pazdziora , Pingfan Liu , Baoquan He , Dave Young , linux-kernel@vger.kernel.org, x86@kernel.org, Dave Hansen , Vitaly Kuznetsov , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" Subject: [PATCH v3 6/7] x86/crash: pass dm crypt keys to kdump kernel Date: Thu, 25 Apr 2024 18:04:30 +0800 Message-ID: <20240425100434.198925-7-coxu@redhat.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240425100434.198925-1-coxu@redhat.com> References: <20240425100434.198925-1-coxu@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 1st kernel will build up the kernel command parameter dmcryptkeys as similar to elfcorehdr to pass the memory address of the stored info of dm crypt key to kdump kernel. Signed-off-by: Coiby Xu --- arch/x86/kernel/crash.c | 15 ++++++++++++++- arch/x86/kernel/kexec-bzimage64.c | 7 +++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c index e74d0c4286c1..d852f9c99f0e 100644 --- a/arch/x86/kernel/crash.c +++ b/arch/x86/kernel/crash.c @@ -266,6 +266,7 @@ static int memmap_exclude_ranges(struct kimage *image, = struct crash_mem *cmem, unsigned long long mend) { unsigned long start, end; + int r; =20 cmem->ranges[0].start =3D mstart; cmem->ranges[0].end =3D mend; @@ -274,7 +275,19 @@ static int memmap_exclude_ranges(struct kimage *image,= struct crash_mem *cmem, /* Exclude elf header region */ start =3D image->elf_load_addr; end =3D start + image->elf_headers_sz - 1; - return crash_exclude_mem_range(cmem, start, end); + r =3D crash_exclude_mem_range(cmem, start, end); + + if (r) + return r; + + /* Exclude dm crypt keys region */ + if (image->dm_crypt_keys_addr) { + start =3D image->dm_crypt_keys_addr; + end =3D start + image->dm_crypt_keys_sz - 1; + return crash_exclude_mem_range(cmem, start, end); + } + + return r; } =20 /* Prepare memory map for crash dump kernel */ diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzim= age64.c index 68530fad05f7..9c94428927bd 100644 --- a/arch/x86/kernel/kexec-bzimage64.c +++ b/arch/x86/kernel/kexec-bzimage64.c @@ -76,6 +76,10 @@ static int setup_cmdline(struct kimage *image, struct bo= ot_params *params, if (image->type =3D=3D KEXEC_TYPE_CRASH) { len =3D sprintf(cmdline_ptr, "elfcorehdr=3D0x%lx ", image->elf_load_addr); + + if (image->dm_crypt_keys_addr !=3D 0) + len +=3D sprintf(cmdline_ptr + len, + "dmcryptkeys=3D0x%lx ", image->dm_crypt_keys_addr); } memcpy(cmdline_ptr + len, cmdline, cmdline_len); cmdline_len +=3D len; @@ -441,6 +445,9 @@ static void *bzImage64_load(struct kimage *image, char = *kernel, ret =3D crash_load_segments(image); if (ret) return ERR_PTR(ret); + ret =3D crash_load_dm_crypt_keys(image); + if (ret) + pr_debug("Either no dm crypt key or error to retrieve the dm crypt key\= n"); } #endif =20 --=20 2.44.0 From nobody Sat Jul 11 14:54:37 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B8AFF128835 for ; Thu, 25 Apr 2024 10:05:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039507; cv=none; b=bSC1wVUx1sohtm549L9idbiYm4tR0NtNdQRFg9anz0reQkUdIEK3WD2OpcU0j4GGPoicGzCTVnrk9JGbOHut9p79JSTM3Ih08bvh3QLE7x9GQwJAPk0aVexdONtDeSHZNI/5JJQcriirTZfDAgkDtxceny2tmbEG/oCuZ51Ksu0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714039507; c=relaxed/simple; bh=Hkn63e39De+KrbUDiC4Z4XQ0/IcYP+DaMu0hP96eE7I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bGv3ssTWhJ6J8+JfYDPHZOxxZekam/RCaWALPk1KkkT0KA61Y/bPavnUh4OzbVa+8ht0wZPb9R7Gbd4P2c3DJ0GGbdfKS+jwrA8MPlO73mUTvGQul4HDQW8k6ftdauNXp04gtc1n5lUddXfDLMB7txv0ATTHhUa8gzPFc2Yg+GY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=eA4n1fT9; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="eA4n1fT9" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1714039504; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0Xe1JC3zOdrEKx3bfWos3eNZ27bBtqkJg+ds4Xh05xA=; b=eA4n1fT9TH8+QrFJ9KTrjxLRuTk05Qm5hHHnQ6Ra4TySsdqTNjImLmV0TJWaIu6MkLZVC2 44L3HxURVnpH2M05xXZxNEfkAR8/UGTGbr/BD5FZQspt6mqK/nQylWkZRVxJvkMbt0Q6oT +0bjiB3MNClfAT/KKQ2iSIjWxiENuvo= Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-589--CFCuM0bNQCZSUNuHWQseg-1; Thu, 25 Apr 2024 06:05:03 -0400 X-MC-Unique: -CFCuM0bNQCZSUNuHWQseg-1 Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-6ed25eb8e01so687446b3a.1 for ; Thu, 25 Apr 2024 03:05:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714039502; x=1714644302; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0Xe1JC3zOdrEKx3bfWos3eNZ27bBtqkJg+ds4Xh05xA=; b=sqYa3I5mHeygbUXDlQQsYtB+FVHVpWGVNz5zNk2b8ipcGVOTWg/mMnv9mY71m86Xga DLq8173PS/hZXvcYxBG7qjPuU6wc94i955mxYH5Dldqbjn/P4Y/eLlY2MnU+eTaPCCnn GurN9tt1Y3E93VdYg7tkUAwuPMN2nu5gqSOXl870DuCbRrC9lwZ9TBgd4Li7k1doO5P8 mnnN4HfUbnnl64nAxxzRGeS2cchSfA2nAA+x3Z+FCAjy430RqPkZS92od2xOAPlrNyjB w89CYUjVObP0nwXjeQm9vQIDzuNwy5+SolnZmTfb1vlyR3Lnm5PudpW6nm4J4gHKcj4/ Amqg== X-Forwarded-Encrypted: i=1; AJvYcCXee5XpnxI5Vc3Yy/gLPuWb6Yu2ZVR6muVfgjvmJ4dtjH8KopXzp0BE/72Q0y29P3i6B4UV5/RZIdLQUAEI7YqYQZ+gt7cjhqg5yLO6 X-Gm-Message-State: AOJu0YwL+knqmXGNBtCqlLHEpZOENxgPWoohrChVjjz714uDECm8YOcf UzxK1J7iHLX2/GOZcM0XvVcGFJ3odngYVOF2lyLjbyHz8MczSE+Bh4UMvePyi/kW8IHJMbrMdIa /z3RtiHSYHXOAgUtj2oq8jx/zSQusTtlaPYQrPwI9slZ52iW0JjFGdKV5O7Xvlw== X-Received: by 2002:a05:6a00:2d87:b0:6ed:60a4:6d9c with SMTP id fb7-20020a056a002d8700b006ed60a46d9cmr6295351pfb.4.1714039501844; Thu, 25 Apr 2024 03:05:01 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHlZH/ckE52CwcRJf2H+llCxl7yd6By1lfHpxqvpexbrw9hs0sai3i4uDCf98L8TPTdXJ+Vcw== X-Received: by 2002:a05:6a00:2d87:b0:6ed:60a4:6d9c with SMTP id fb7-20020a056a002d8700b006ed60a46d9cmr6295321pfb.4.1714039501295; Thu, 25 Apr 2024 03:05:01 -0700 (PDT) Received: from localhost ([43.228.180.230]) by smtp.gmail.com with ESMTPSA id go20-20020a056a003b1400b006e6233563cesm12775607pfb.218.2024.04.25.03.05.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Apr 2024 03:05:00 -0700 (PDT) From: Coiby Xu To: kexec@lists.infradead.org Cc: Ondrej Kozina , Milan Broz , Thomas Staudt , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Kairui Song , dm-devel@redhat.com, Jan Pazdziora , Pingfan Liu , Baoquan He , Dave Young , linux-kernel@vger.kernel.org, x86@kernel.org, Dave Hansen , Vitaly Kuznetsov , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" Subject: [PATCH v3 7/7] x86/crash: make the page that stores the dm crypt keys inaccessible Date: Thu, 25 Apr 2024 18:04:31 +0800 Message-ID: <20240425100434.198925-8-coxu@redhat.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240425100434.198925-1-coxu@redhat.com> References: <20240425100434.198925-1-coxu@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This adds an addition layer of protection for the saved copy of dm crypt key. Trying to access the saved copy will cause page fault. Suggested-by: Pingfan Liu Signed-off-by: Coiby Xu --- arch/x86/kernel/machine_kexec_64.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_k= exec_64.c index b180d8e497c3..fc0a80f4254e 100644 --- a/arch/x86/kernel/machine_kexec_64.c +++ b/arch/x86/kernel/machine_kexec_64.c @@ -545,13 +545,34 @@ static void kexec_mark_crashkres(bool protect) kexec_mark_range(control, crashk_res.end, protect); } =20 +static void kexec_mark_dm_crypt_keys(bool protect) +{ + unsigned long start_paddr, end_paddr; + unsigned int nr_pages; + + if (kexec_crash_image->dm_crypt_keys_addr) { + start_paddr =3D kexec_crash_image->dm_crypt_keys_addr; + end_paddr =3D start_paddr + kexec_crash_image->dm_crypt_keys_sz - 1; + nr_pages =3D (PAGE_ALIGN(end_paddr) - PAGE_ALIGN_DOWN(start_paddr))/PAGE= _SIZE; + if (protect) + set_memory_np((unsigned long)phys_to_virt(start_paddr), nr_pages); + else + __set_memory_prot( + (unsigned long)phys_to_virt(start_paddr), + nr_pages, + __pgprot(_PAGE_PRESENT | _PAGE_NX | _PAGE_RW)); + } +} + void arch_kexec_protect_crashkres(void) { kexec_mark_crashkres(true); + kexec_mark_dm_crypt_keys(true); } =20 void arch_kexec_unprotect_crashkres(void) { + kexec_mark_dm_crypt_keys(false); kexec_mark_crashkres(false); } #endif --=20 2.44.0