All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hans-Gert Dahmen <hans-gert.dahmen@immu.ne>
To: gregkh@linuxfoundation.org
Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org,
	philipp.deppenwiese@immu.ne, mauro.lima@eclypsium.com,
	hughsient@gmail.com, platform-driver-x86@vger.kernel.org,
	Hans-Gert Dahmen <hans-gert.dahmen@immu.ne>
Subject: [PATCH] firmware: export x86_64 platform flash bios region via sysfs
Date: Tue,  9 Nov 2021 01:01:30 +0100	[thread overview]
Message-ID: <20211109000130.42361-1-hans-gert.dahmen@immu.ne> (raw)

Make the 16MiB long memory-mapped BIOS region of the platform SPI flash
on X86_64 system available via /sys/kernel/firmware/flash_mmap/bios_region
for pen-testing, security analysis and malware detection on kernels
which restrict module loading and/or access to /dev/mem.

It will be used by the open source Converged Security Suite.
https://github.com/9elements/converged-security-suite

Signed-off-by: Hans-Gert Dahmen <hans-gert.dahmen@immu.ne>
---
 drivers/firmware/Kconfig             |  9 +++
 drivers/firmware/Makefile            |  1 +
 drivers/firmware/x86_64_flash_mmap.c | 86 ++++++++++++++++++++++++++++
 3 files changed, 96 insertions(+)
 create mode 100644 drivers/firmware/x86_64_flash_mmap.c

diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig
index 75cb91055c17..27c2d0b074e0 100644
--- a/drivers/firmware/Kconfig
+++ b/drivers/firmware/Kconfig
@@ -293,6 +293,15 @@ config TURRIS_MOX_RWTM
 	  other manufacturing data and also utilize the Entropy Bit Generator
 	  for hardware random number generation.
 
+config X86_64_FLASH_MMAP
+	tristate "Export platform flash memory-mapped BIOS region"
+	depends on X86_64
+	help
+	  Export the memory-mapped BIOS region of the platform SPI flash as
+	  a read-only sysfs binary attribute on X86_64 systems. The first 16MiB
+	  will be accessible via /sys/devices/platform/flash_mmap/bios_region
+	  for security and malware analysis for example.
+
 source "drivers/firmware/arm_ffa/Kconfig"
 source "drivers/firmware/broadcom/Kconfig"
 source "drivers/firmware/cirrus/Kconfig"
diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile
index 4e58cb474a68..60dc4ea08705 100644
--- a/drivers/firmware/Makefile
+++ b/drivers/firmware/Makefile
@@ -24,6 +24,7 @@ obj-$(CONFIG_SYSFB_SIMPLEFB)	+= sysfb_simplefb.o
 obj-$(CONFIG_TI_SCI_PROTOCOL)	+= ti_sci.o
 obj-$(CONFIG_TRUSTED_FOUNDATIONS) += trusted_foundations.o
 obj-$(CONFIG_TURRIS_MOX_RWTM)	+= turris-mox-rwtm.o
+obj-$(CONFIG_X86_64_FLASH_MMAP)	+= x86_64_flash_mmap.o
 
 obj-y				+= arm_ffa/
 obj-y				+= arm_scmi/
diff --git a/drivers/firmware/x86_64_flash_mmap.c b/drivers/firmware/x86_64_flash_mmap.c
new file mode 100644
index 000000000000..23d8655d17bb
--- /dev/null
+++ b/drivers/firmware/x86_64_flash_mmap.c
@@ -0,0 +1,86 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Export the memory-mapped BIOS region of the platform SPI flash as
+ * a read-only sysfs binary attribute on X86_64 systems.
+ *
+ * Copyright © 2021 immune GmbH
+ */
+
+#include <linux/version.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/io.h>
+#include <linux/sysfs.h>
+#include <linux/platform_device.h>
+
+#define FLASH_REGION_START 0xFF000000ULL
+#define FLASH_REGION_SIZE 0x1000000ULL
+#define FLASH_REGION_MASK (FLASH_REGION_SIZE - 1)
+
+struct platform_device *pdev;
+
+static ssize_t bios_region_read(struct file *file, struct kobject *kobj,
+				struct bin_attribute *bin_attr, char *buffer,
+				loff_t offset, size_t count)
+{
+	resource_size_t pa;
+	size_t copysize, remapsize;
+	void __iomem *va;
+
+	offset = offset & FLASH_REGION_MASK;
+	pa = (FLASH_REGION_START + offset) & PAGE_MASK;
+
+	if ((offset + count) > FLASH_REGION_SIZE)
+		copysize = FLASH_REGION_SIZE - offset;
+	else
+		copysize = min(count, PAGE_SIZE);
+
+	if (((offset & ~PAGE_MASK) + copysize) > PAGE_SIZE)
+		remapsize = 2 * PAGE_SIZE;
+	else
+		remapsize = PAGE_SIZE;
+
+	va = ioremap(pa, remapsize);
+	memcpy_fromio(buffer, va, copysize);
+	iounmap(va);
+
+	return copysize;
+}
+
+static BIN_ATTR_RO(bios_region, FLASH_REGION_SIZE);
+
+static struct bin_attribute *flash_mmap_attrs[] = { &bin_attr_bios_region,
+						    NULL };
+
+static const struct attribute_group flash_mmap_group = {
+	.bin_attrs = flash_mmap_attrs,
+};
+
+static int __init flash_mmap_init(void)
+{
+	int ret;
+
+	pdev = platform_device_register_simple("flash_mmap", -1, NULL, 0);
+	if (IS_ERR(pdev))
+		return PTR_ERR(pdev);
+
+	ret = sysfs_create_group(&pdev->dev.kobj, &flash_mmap_group);
+	if (ret) {
+		dev_err(&pdev->dev, "sysfs creation failed\n");
+		platform_device_unregister(pdev);
+	}
+
+	return ret;
+}
+
+static void __exit flash_mmap_exit(void)
+{
+	sysfs_remove_group(&pdev->dev.kobj, &flash_mmap_group);
+	platform_device_unregister(pdev);
+}
+
+module_init(flash_mmap_init);
+module_exit(flash_mmap_exit);
+MODULE_DESCRIPTION("Export SPI platform flash memory mapped region via sysfs");
+MODULE_AUTHOR("Hans-Gert Dahmen <hans-gert.dahmen@immu.ne>");
+MODULE_LICENSE("GPL");
-- 
2.32.0


             reply	other threads:[~2021-11-09  0:02 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-09  0:01 Hans-Gert Dahmen [this message]
2021-11-09  6:16 ` [PATCH] firmware: export x86_64 platform flash bios region via sysfs Greg KH
2021-11-09  8:52   ` Hans-Gert Dahmen
2021-11-09  8:56     ` Hans-Gert Dahmen
2021-11-09 10:28     ` Greg KH
2021-11-09 12:32       ` Hans-Gert Dahmen
2021-11-09 12:42         ` Greg KH
2021-11-09 14:09           ` Mauro Lima
2021-11-09 14:11             ` Mauro Lima
2021-11-09 14:10           ` Hans-Gert Dahmen
     [not found]             ` <CAHp75VfbYsyC=7Ncnex1f_jiwrZhExDF7iy4oSGZgS1cHmsN0Q@mail.gmail.com>
2021-11-10  8:37               ` Hans-Gert Dahmen
2021-11-10  9:04                 ` Andy Shevchenko
2021-11-10  9:17                   ` Hans-Gert Dahmen
2021-11-10  9:25                     ` Andy Shevchenko
2021-11-10 10:00                       ` Hans-Gert Dahmen
2021-11-10 13:13                         ` Mauro Lima
2021-11-10 16:31                           ` Andy Shevchenko
2021-11-10 17:37                             ` Mauro Lima
2021-11-11  6:42                               ` Mika Westerberg
2021-11-11  8:59                                 ` Hans-Gert Dahmen
2021-11-11 10:32                                   ` Mika Westerberg
2021-11-11 10:55                                     ` Hans-Gert Dahmen
2021-11-11 11:43                                       ` Greg KH
2021-11-11 11:46                                     ` Richard Hughes
2021-11-11 12:46                                       ` Andy Shevchenko
2021-11-11 12:56                                         ` Hans-Gert Dahmen
2021-11-11 13:54                                           ` Andy Shevchenko
2021-11-11 14:33                                             ` Hans-Gert Dahmen
2021-11-11 15:30                                               ` Andy Shevchenko
2021-11-11 15:43                                                 ` Ard Biesheuvel
2021-11-11 15:49                                                   ` Andy Shevchenko
2021-11-11 16:05                                                     ` Hans-Gert Dahmen
2021-11-11 21:07                                                     ` Richard Hughes
2021-11-12  6:52                                                       ` Greg KH
2021-11-12 10:09                                                         ` Richard Hughes
2021-11-12 10:43                                                           ` Greg KH
2021-11-12 12:25                                                             ` Hans-Gert Dahmen
2021-11-11 16:07                                                 ` Hans-Gert Dahmen
2021-11-11 16:44                                                   ` Andy Shevchenko
2021-11-11 16:55                                                     ` Hans-Gert Dahmen
2021-11-11 17:48                                                       ` Andy Shevchenko
2021-11-11 18:14                                                         ` Hans-Gert Dahmen
2021-11-11 19:14                                                           ` Ard Biesheuvel
2021-11-11 20:50                                                             ` Hans-Gert Dahmen
2021-11-11 13:00                                       ` Mika Westerberg
2021-11-11 13:22                                         ` Richard Hughes
2021-11-11 13:34                                           ` Mika Westerberg
2021-11-11 13:36                                             ` Hans-Gert Dahmen
2021-11-11 14:42                                             ` Mauro Lima
2021-11-11 15:06                                               ` Mika Westerberg
2021-11-11 15:16                                                 ` Hans-Gert Dahmen
2021-11-12  6:59                                                   ` Mika Westerberg
2021-11-11 15:31                                                 ` Mauro Lima
2021-11-11 11:50                                 ` Mauro Lima
2021-11-10 17:41                             ` Hans-Gert Dahmen
     [not found]   ` <E1CBFD23-AC3B-43BF-BF0A-158844486BA9@getmailspring.com>
2021-11-09 10:24     ` Greg KH
2021-11-09 10:30       ` Philipp Deppenwiese
2021-11-09 11:25         ` Greg KH
2021-11-09 13:55   ` Mauro Lima
2021-11-09 16:12     ` Greg KH
2021-11-09 17:23       ` Mauro Lima
  -- strict thread matches above, loose matches on Subject: below --
2021-06-22 14:23 Hans-Gert Dahmen
2021-06-22 20:02 ` Greg KH
2021-06-25 13:54   ` Hans-Gert Dahmen
2021-06-22 22:18 ` David Laight
2021-06-23 12:17   ` Hans-Gert Dahmen
2021-06-23 12:40     ` gregkh
2021-06-24 11:20       ` Hans-Gert Dahmen
2021-06-24 11:42         ` gregkh
2021-06-23 13:22     ` David Laight
2021-06-18 16:47 Hans-Gert Dahmen

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=20211109000130.42361-1-hans-gert.dahmen@immu.ne \
    --to=hans-gert.dahmen@immu.ne \
    --cc=akpm@linux-foundation.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=hughsient@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mauro.lima@eclypsium.com \
    --cc=philipp.deppenwiese@immu.ne \
    --cc=platform-driver-x86@vger.kernel.org \
    /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.