]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/kaslr: Reduce KASLR entropy on most x86 systems
authorBalbir Singh <balbirs@nvidia.com>
Thu, 6 Feb 2025 23:42:34 +0000 (10:42 +1100)
committerIngo Molnar <mingo@kernel.org>
Sat, 22 Feb 2025 11:25:57 +0000 (12:25 +0100)
When CONFIG_PCI_P2PDMA=y (which is basically enabled on all
large x86 distros), it maps the PFN's via a ZONE_DEVICE
mapping using devm_memremap_pages(). The mapped virtual
address range corresponds to the pci_resource_start()
of the BAR address and size corresponding to the BAR length.

When KASLR is enabled, the direct map range of the kernel is
reduced to the size of physical memory plus additional padding.
If the BAR address is beyond this limit, PCI peer to peer DMA
mappings fail.

Fix this by not shrinking the size of the direct map when
CONFIG_PCI_P2PDMA=y.

This reduces the total available entropy, but it's better than
the current work around of having to disable KASLR completely.

[ mingo: Clarified the changelog to point out the broad impact ... ]

Signed-off-by: Balbir Singh <balbirs@nvidia.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Kees Cook <kees@kernel.org>
Acked-by: Bjorn Helgaas <bhelgaas@google.com> # drivers/pci/Kconfig
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Andy Lutomirski <luto@kernel.org>
Link: https://lore.kernel.org/lkml/20250206023201.1481957-1-balbirs@nvidia.com/
Link: https://lore.kernel.org/r/20250206234234.1912585-1-balbirs@nvidia.com
--
 arch/x86/mm/kaslr.c | 10 ++++++++--
 drivers/pci/Kconfig |  6 ++++++
 2 files changed, 14 insertions(+), 2 deletions(-)

arch/x86/mm/kaslr.c
drivers/pci/Kconfig

index 11a93542d1983ad41e3864c525ac51daf3a8c069..3c306de52fd4da5ba945a0a882d043616986e816 100644 (file)
@@ -113,8 +113,14 @@ void __init kernel_randomize_memory(void)
        memory_tb = DIV_ROUND_UP(max_pfn << PAGE_SHIFT, 1UL << TB_SHIFT) +
                CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING;
 
-       /* Adapt physical memory region size based on available memory */
-       if (memory_tb < kaslr_regions[0].size_tb)
+       /*
+        * Adapt physical memory region size based on available memory,
+        * except when CONFIG_PCI_P2PDMA is enabled. P2PDMA exposes the
+        * device BAR space assuming the direct map space is large enough
+        * for creating a ZONE_DEVICE mapping in the direct map corresponding
+        * to the physical BAR address.
+        */
+       if (!IS_ENABLED(CONFIG_PCI_P2PDMA) && (memory_tb < kaslr_regions[0].size_tb))
                kaslr_regions[0].size_tb = memory_tb;
 
        /*
index 2fbd379923fd1edbf32a4b0e449fbd22d5a2ab55..5c3054aaec8c12cb447dd59321c0e68a9cbdf163 100644 (file)
@@ -203,6 +203,12 @@ config PCI_P2PDMA
          P2P DMA transactions must be between devices behind the same root
          port.
 
+         Enabling this option will reduce the entropy of x86 KASLR memory
+         regions. For example - on a 46 bit system, the entropy goes down
+         from 16 bits to 15 bits. The actual reduction in entropy depends
+         on the physical address bits, on processor features, kernel config
+         (5 level page table) and physical memory present on the system.
+
          If unsure, say N.
 
 config PCI_LABEL