linux-doc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 00/16] Enable Linear Address Space Separation support
@ 2024-10-28 16:07 Alexander Shishkin
  2024-10-28 16:07 ` [PATCH v5 01/16] x86/cpu: Enumerate the LASS feature bits Alexander Shishkin
                   ` (16 more replies)
  0 siblings, 17 replies; 42+ messages in thread
From: Alexander Shishkin @ 2024-10-28 16:07 UTC (permalink / raw)
  To: Andy Lutomirski, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
	Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra, Ard Biesheuvel,
	Paul E. McKenney, Josh Poimboeuf, Xiongwei Song, Xin Li,
	Mike Rapoport (IBM), Brijesh Singh, Michael Roth, Tony Luck,
	Kirill A. Shutemov, Alexey Kardashevskiy
  Cc: Jonathan Corbet, Alexander Shishkin, Sohil Mehta, Ingo Molnar,
	Pawan Gupta, Daniel Sneddon, Kai Huang, Sandipan Das,
	Breno Leitao, Rick Edgecombe, Alexei Starovoitov, Hou Tao,
	Juergen Gross, Vegard Nossum, Kees Cook, Eric Biggers,
	Jason Gunthorpe, Masami Hiramatsu (Google), Andrew Morton,
	Luis Chamberlain, Yuntao Wang, Rasmus Villemoes, Christophe Leroy,
	Tejun Heo, Changbin Du, Huang Shijie, Geert Uytterhoeven,
	Namhyung Kim, Arnaldo Carvalho de Melo, linux-doc, linux-kernel,
	linux-efi

Changes from v4[8]:
- Added PeterZ's Originally-by and SoB to 2/16
- Added lass_clac()/lass_stac() to differentiate from SMAP necessitated
  clac()/stac() and to be NOPs on CPUs that don't support LASS
- Moved LASS enabling patch to the end to avoid rendering machines
  unbootable between until the patch that disables LASS around EFI
  initialization
- Reverted Pawan's LAM disabling commit

Changes from v3[6]:
- Made LAM dependent on LASS
- Moved EFI runtime initialization to x86 side of things
- Suspended LASS validation around EFI set_virtual_address_map call
- Added a message for the case of kernel side LASS violation
- Moved inline memset/memcpy versions to the common string.h

Changes from v2[5]:
- Added myself to the SoB chain

Changes from v1[1]:
- Emulate vsyscall violations in execute mode in the #GP fault handler
- Use inline memcpy and memset while patching alternatives
- Remove CONFIG_X86_LASS
- Make LASS depend on SMAP
- Dropped the minimal KVM enabling patch

Linear Address Space Separation (LASS) is a security feature that intends to
prevent malicious virtual address space accesses across user/kernel mode.

Such mode based access protection already exists today with paging and features
such as SMEP and SMAP. However, to enforce these protections, the processor
must traverse the paging structures in memory.  Malicious software can use
timing information resulting from this traversal to determine details about the
paging structures, and these details may also be used to determine the layout
of the kernel memory.

The LASS mechanism provides the same mode-based protections as paging but
without traversing the paging structures. Because the protections enforced by
LASS are applied before paging, software will not be able to derive
paging-based timing information from the various caching structures such as the
TLBs, mid-level caches, page walker, data caches, etc. LASS can avoid probing
using double page faults, TLB flush and reload, and SW prefetch instructions.
See [2], [3] and [4] for some research on the related attack vectors.

In addition, LASS prevents an attack vector described in a Spectre LAM (SLAM)
whitepaper [7].

LASS enforcement relies on the typical kernel implemetation to divide the
64-bit virtual address space into two halves:
  Addr[63]=0 -> User address space
  Addr[63]=1 -> Kernel address space
Any data access or code execution across address spaces typically results in a
#GP fault.

Kernel accesses usually only happen to the kernel address space. However, there
are valid reasons for kernel to access memory in the user half. For these cases
(such as text poking and EFI runtime accesses), the kernel can temporarily
suspend the enforcement of LASS by toggling SMAP (Supervisor Mode Access
Prevention) using the stac()/clac() instructions and in one instance a downright
disabling LASS for an EFI runtime call.

User space cannot access any kernel address while LASS is enabled.
Unfortunately, legacy vsyscall functions are located in the address range
0xffffffffff600000 - 0xffffffffff601000 and emulated in kernel.  To avoid
breaking user applications when LASS is enabled, extend the vsyscall emulation
in execute (XONLY) mode to the #GP fault handler.

In contrast, the vsyscall EMULATE mode is deprecated and not expected to be
used by anyone.  Supporting EMULATE mode with LASS would need complex
intruction decoding in the #GP fault handler and is probably not worth the
hassle. Disable LASS in this rare case when someone absolutely needs and
enables vsyscall=emulate via the command line.

[1] https://lore.kernel.org/lkml/20230110055204.3227669-1-yian.chen@intel.com/
[2] “Practical Timing Side Channel Attacks against Kernel Space ASLR”,
https://www.ieee-security.org/TC/SP2013/papers/4977a191.pdf
[3] “Prefetch Side-Channel Attacks: Bypassing SMAP and Kernel ASLR”, http://doi.acm.org/10.1145/2976749.2978356
[4] “Harmful prefetch on Intel”, https://ioactive.com/harmful-prefetch-on-intel/ (H/T Anders)
[5] https://lore.kernel.org/all/20230530114247.21821-1-alexander.shishkin@linux.intel.com/
[6] https://lore.kernel.org/all/20230609183632.48706-1-alexander.shishkin@linux.intel.com/
[7] https://download.vusec.net/papers/slam_sp24.pdf
[8] https://lore.kernel.org/all/20240710160655.3402786-1-alexander.shishkin@linux.intel.com/

Alexander Shishkin (7):
  init/main.c: Move EFI runtime service initialization to x86/cpu
  x86/cpu: Defer CR pinning setup until after EFI initialization
  efi: Disable LASS around set_virtual_address_map call
  x86/vsyscall: Document the fact that vsyscall=emulate disables LASS
  x86/traps: Communicate a LASS violation in #GP message
  x86/cpu: Make LAM depend on LASS
  Revert "x86/lam: Disable ADDRESS_MASKING in most cases"

Peter Zijlstra (1):
  x86/asm: Introduce inline memcpy and memset

Sohil Mehta (7):
  x86/cpu: Enumerate the LASS feature bits
  x86/alternatives: Disable LASS when patching kernel alternatives
  x86/vsyscall: Reorganize the #PF emulation code
  x86/traps: Consolidate user fixups in exc_general_protection()
  x86/vsyscall: Add vsyscall emulation for #GP
  x86/vsyscall: Disable LASS if vsyscall mode is set to EMULATE
  x86/cpu: Enable LASS during CPU initialization

Yian Chen (1):
  x86/cpu: Set LASS CR4 bit as pinning sensitive

 .../admin-guide/kernel-parameters.txt         |  4 +-
 arch/x86/Kconfig                              |  1 -
 arch/x86/entry/vsyscall/vsyscall_64.c         | 61 +++++++++++++------
 arch/x86/include/asm/cpufeatures.h            |  1 +
 arch/x86/include/asm/disabled-features.h      |  4 +-
 arch/x86/include/asm/smap.h                   | 18 ++++++
 arch/x86/include/asm/string.h                 | 26 ++++++++
 arch/x86/include/asm/vsyscall.h               | 14 +++--
 arch/x86/include/uapi/asm/processor-flags.h   |  2 +
 arch/x86/kernel/alternative.c                 | 12 +++-
 arch/x86/kernel/cpu/common.c                  | 25 +++++++-
 arch/x86/kernel/cpu/cpuid-deps.c              |  2 +
 arch/x86/kernel/traps.c                       | 26 +++++---
 arch/x86/mm/fault.c                           |  2 +-
 arch/x86/platform/efi/efi.c                   | 13 ++++
 init/main.c                                   |  5 --
 tools/arch/x86/include/asm/cpufeatures.h      |  1 +
 17 files changed, 171 insertions(+), 46 deletions(-)

-- 
2.45.2


^ permalink raw reply	[flat|nested] 42+ messages in thread

end of thread, other threads:[~2024-10-31  0:06 UTC | newest]

Thread overview: 42+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-28 16:07 [PATCH v5 00/16] Enable Linear Address Space Separation support Alexander Shishkin
2024-10-28 16:07 ` [PATCH v5 01/16] x86/cpu: Enumerate the LASS feature bits Alexander Shishkin
2024-10-29 14:55   ` Kirill A. Shutemov
2024-10-29 21:46     ` Sohil Mehta
2024-10-28 16:07 ` [PATCH v5 02/16] x86/asm: Introduce inline memcpy and memset Alexander Shishkin
2024-10-28 16:07 ` [PATCH v5 03/16] x86/alternatives: Disable LASS when patching kernel alternatives Alexander Shishkin
2024-10-28 17:49   ` Dave Hansen
2024-10-29 11:36     ` Peter Zijlstra
2024-10-29 18:48       ` Peter Zijlstra
2024-10-30  7:40         ` Alexander Shishkin
2024-10-28 16:07 ` [PATCH v5 04/16] init/main.c: Move EFI runtime service initialization to x86/cpu Alexander Shishkin
2024-10-29 22:35   ` Sohil Mehta
2024-10-30  7:36   ` Ard Biesheuvel
2024-10-28 16:07 ` [PATCH v5 05/16] x86/cpu: Defer CR pinning setup until after EFI initialization Alexander Shishkin
2024-10-29 22:10   ` Sohil Mehta
2024-10-29 22:26     ` Luck, Tony
2024-10-29 22:52       ` Dave Hansen
2024-10-29 22:59         ` Luck, Tony
2024-10-29 23:02           ` H. Peter Anvin
2024-10-29 23:03           ` Dave Hansen
2024-10-29 23:05             ` H. Peter Anvin
2024-10-29 23:18               ` Luck, Tony
2024-10-29 23:41                 ` H. Peter Anvin
2024-10-30 11:43                 ` Kirill A. Shutemov
2024-10-28 16:07 ` [PATCH v5 06/16] efi: Disable LASS around set_virtual_address_map call Alexander Shishkin
2024-10-29 15:00   ` Kirill A. Shutemov
2024-10-28 16:07 ` [PATCH v5 07/16] x86/vsyscall: Reorganize the #PF emulation code Alexander Shishkin
2024-10-28 16:07 ` [PATCH v5 08/16] x86/traps: Consolidate user fixups in exc_general_protection() Alexander Shishkin
2024-10-28 16:07 ` [PATCH v5 09/16] x86/vsyscall: Add vsyscall emulation for #GP Alexander Shishkin
2024-10-28 16:07 ` [PATCH v5 10/16] x86/vsyscall: Disable LASS if vsyscall mode is set to EMULATE Alexander Shishkin
2024-10-28 16:07 ` [PATCH v5 11/16] x86/vsyscall: Document the fact that vsyscall=emulate disables LASS Alexander Shishkin
2024-10-29 23:41   ` Sohil Mehta
2024-10-28 16:08 ` [PATCH v5 12/16] x86/cpu: Set LASS CR4 bit as pinning sensitive Alexander Shishkin
2024-10-28 16:08 ` [PATCH v5 13/16] x86/traps: Communicate a LASS violation in #GP message Alexander Shishkin
2024-10-28 16:08 ` [PATCH v5 14/16] x86/cpu: Make LAM depend on LASS Alexander Shishkin
2024-10-31  0:06   ` Sohil Mehta
2024-10-28 16:08 ` [PATCH v5 15/16] x86/cpu: Enable LASS during CPU initialization Alexander Shishkin
2024-10-28 16:08 ` [PATCH v5 16/16] Revert "x86/lam: Disable ADDRESS_MASKING in most cases" Alexander Shishkin
2024-10-28 20:41   ` Kirill A. Shutemov
2024-10-28 22:00     ` Alexander Shishkin
2024-10-29 17:14 ` [PATCH v5 00/16] Enable Linear Address Space Separation support Matthew Wilcox
2024-10-30  7:16   ` Alexander Shishkin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).