]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
x86/vmscape: Enumerate VMSCAPE bug
authorPawan Gupta <pawan.kumar.gupta@linux.intel.com>
Thu, 14 Aug 2025 17:20:42 +0000 (10:20 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 Sep 2025 15:21:46 +0000 (17:21 +0200)
Commit a508cec6e5215a3fbc7e73ae86a5c5602187934d upstream.

The VMSCAPE vulnerability may allow a guest to cause Branch Target
Injection (BTI) in userspace hypervisors.

Kernels (both host and guest) have existing defenses against direct BTI
attacks from guests. There are also inter-process BTI mitigations which
prevent processes from attacking each other. However, the threat in this
case is to a userspace hypervisor within the same process as the attacker.

Userspace hypervisors have access to their own sensitive data like disk
encryption keys and also typically have access to all guest data. This
means guest userspace may use the hypervisor as a confused deputy to attack
sensitive guest kernel data. There are no existing mitigations for these
attacks.

Introduce X86_BUG_VMSCAPE for this vulnerability and set it on affected
Intel and AMD CPUs.

Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Borislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/include/asm/cpufeatures.h
arch/x86/kernel/cpu/common.c

index 98e72c1391f24054246b657b05364c7b0bc2e812..b5401798a79a8319280a0c4e2e8833e6abfd7f11 100644 (file)
 #define X86_BUG_ITS                    X86_BUG(1*32 + 5) /* "its" CPU is affected by Indirect Target Selection */
 #define X86_BUG_ITS_NATIVE_ONLY                X86_BUG(1*32 + 6) /* "its_native_only" CPU is affected by ITS, VMX is not affected */
 #define X86_BUG_TSA                    X86_BUG( 1*32+ 9) /* "tsa" CPU is affected by Transient Scheduler Attacks */
+#define X86_BUG_VMSCAPE                        X86_BUG( 1*32+10) /* "vmscape" CPU is affected by VMSCAPE attacks from guests */
 #endif /* _ASM_X86_CPUFEATURES_H */
index 976545ec8fdcb3d876e4e1f8edbdc26a69c3c8e1..28823a8e777116c37f5332483c9abbb8a06119f9 100644 (file)
@@ -1235,6 +1235,8 @@ static const __initconst struct x86_cpu_id cpu_vuln_whitelist[] = {
 #define ITS_NATIVE_ONLY        BIT(9)
 /* CPU is affected by Transient Scheduler Attacks */
 #define TSA            BIT(10)
+/* CPU is affected by VMSCAPE */
+#define VMSCAPE                BIT(11)
 
 static const struct x86_cpu_id cpu_vuln_blacklist[] __initconst = {
        VULNBL_INTEL_STEPPINGS(INTEL_IVYBRIDGE,         X86_STEPPING_ANY,               SRBDS),
@@ -1246,43 +1248,54 @@ static const struct x86_cpu_id cpu_vuln_blacklist[] __initconst = {
        VULNBL_INTEL_STEPPINGS(INTEL_BROADWELL_G,       X86_STEPPING_ANY,               SRBDS),
        VULNBL_INTEL_STEPPINGS(INTEL_BROADWELL_X,       X86_STEPPING_ANY,               MMIO),
        VULNBL_INTEL_STEPPINGS(INTEL_BROADWELL,         X86_STEPPING_ANY,               SRBDS),
-       VULNBL_INTEL_STEPPINGS(INTEL_SKYLAKE_X,         X86_STEPPINGS(0x0, 0x5),        MMIO | RETBLEED | GDS),
-       VULNBL_INTEL_STEPPINGS(INTEL_SKYLAKE_X,         X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | ITS),
-       VULNBL_INTEL_STEPPINGS(INTEL_SKYLAKE_L,         X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | SRBDS),
-       VULNBL_INTEL_STEPPINGS(INTEL_SKYLAKE,           X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | SRBDS),
-       VULNBL_INTEL_STEPPINGS(INTEL_KABYLAKE_L,        X86_STEPPINGS(0x0, 0xb),        MMIO | RETBLEED | GDS | SRBDS),
-       VULNBL_INTEL_STEPPINGS(INTEL_KABYLAKE_L,        X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | SRBDS | ITS),
-       VULNBL_INTEL_STEPPINGS(INTEL_KABYLAKE,          X86_STEPPINGS(0x0, 0xc),        MMIO | RETBLEED | GDS | SRBDS),
-       VULNBL_INTEL_STEPPINGS(INTEL_KABYLAKE,          X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | SRBDS | ITS),
-       VULNBL_INTEL_STEPPINGS(INTEL_CANNONLAKE_L,      X86_STEPPING_ANY,               RETBLEED),
+       VULNBL_INTEL_STEPPINGS(INTEL_SKYLAKE_X,         X86_STEPPINGS(0x0, 0x5),        MMIO | RETBLEED | GDS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_SKYLAKE_X,         X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | ITS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_SKYLAKE_L,         X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | SRBDS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_SKYLAKE,           X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | SRBDS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_KABYLAKE_L,        X86_STEPPINGS(0x0, 0xb),        MMIO | RETBLEED | GDS | SRBDS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_KABYLAKE_L,        X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | SRBDS | ITS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_KABYLAKE,          X86_STEPPINGS(0x0, 0xc),        MMIO | RETBLEED | GDS | SRBDS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_KABYLAKE,          X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | SRBDS | ITS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_CANNONLAKE_L,      X86_STEPPING_ANY,               RETBLEED | VMSCAPE),
        VULNBL_INTEL_STEPPINGS(INTEL_ICELAKE_L,         X86_STEPPING_ANY,               MMIO | MMIO_SBDS | RETBLEED | GDS | ITS | ITS_NATIVE_ONLY),
        VULNBL_INTEL_STEPPINGS(INTEL_ICELAKE_D,         X86_STEPPING_ANY,               MMIO | GDS | ITS | ITS_NATIVE_ONLY),
        VULNBL_INTEL_STEPPINGS(INTEL_ICELAKE_X,         X86_STEPPING_ANY,               MMIO | GDS | ITS | ITS_NATIVE_ONLY),
-       VULNBL_INTEL_STEPPINGS(INTEL_COMETLAKE,         X86_STEPPING_ANY,               MMIO | MMIO_SBDS | RETBLEED | GDS | ITS),
-       VULNBL_INTEL_STEPPINGS(INTEL_COMETLAKE_L,       X86_STEPPINGS(0x0, 0x0),        MMIO | RETBLEED | ITS),
-       VULNBL_INTEL_STEPPINGS(INTEL_COMETLAKE_L,       X86_STEPPING_ANY,               MMIO | MMIO_SBDS | RETBLEED | GDS | ITS),
+       VULNBL_INTEL_STEPPINGS(INTEL_COMETLAKE,         X86_STEPPING_ANY,               MMIO | MMIO_SBDS | RETBLEED | GDS | ITS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_COMETLAKE_L,       X86_STEPPINGS(0x0, 0x0),        MMIO | RETBLEED | ITS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_COMETLAKE_L,       X86_STEPPING_ANY,               MMIO | MMIO_SBDS | RETBLEED | GDS | ITS | VMSCAPE),
        VULNBL_INTEL_STEPPINGS(INTEL_TIGERLAKE_L,       X86_STEPPING_ANY,               GDS | ITS | ITS_NATIVE_ONLY),
        VULNBL_INTEL_STEPPINGS(INTEL_TIGERLAKE,         X86_STEPPING_ANY,               GDS | ITS | ITS_NATIVE_ONLY),
        VULNBL_INTEL_STEPPINGS(INTEL_LAKEFIELD,         X86_STEPPING_ANY,               MMIO | MMIO_SBDS | RETBLEED),
        VULNBL_INTEL_STEPPINGS(INTEL_ROCKETLAKE,        X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | ITS | ITS_NATIVE_ONLY),
-       VULNBL_INTEL_STEPPINGS(INTEL_ALDERLAKE,         X86_STEPPING_ANY,               RFDS),
-       VULNBL_INTEL_STEPPINGS(INTEL_ALDERLAKE_L,       X86_STEPPING_ANY,               RFDS),
-       VULNBL_INTEL_STEPPINGS(INTEL_RAPTORLAKE,        X86_STEPPING_ANY,               RFDS),
-       VULNBL_INTEL_STEPPINGS(INTEL_RAPTORLAKE_P,      X86_STEPPING_ANY,               RFDS),
-       VULNBL_INTEL_STEPPINGS(INTEL_RAPTORLAKE_S,      X86_STEPPING_ANY,               RFDS),
-       VULNBL_INTEL_STEPPINGS(INTEL_ATOM_GRACEMONT,    X86_STEPPING_ANY,               RFDS),
+       VULNBL_INTEL_STEPPINGS(INTEL_ALDERLAKE,         X86_STEPPING_ANY,               RFDS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_ALDERLAKE_L,       X86_STEPPING_ANY,               RFDS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_RAPTORLAKE,        X86_STEPPING_ANY,               RFDS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_RAPTORLAKE_P,      X86_STEPPING_ANY,               RFDS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_RAPTORLAKE_S,      X86_STEPPING_ANY,               RFDS | VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_METEORLAKE_L,      X86_STEPPING_ANY,               VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_ARROWLAKE_H,       X86_STEPPING_ANY,               VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_ARROWLAKE,         X86_STEPPING_ANY,               VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_ARROWLAKE_U,       X86_STEPPING_ANY,               VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_LUNARLAKE_M,       X86_STEPPING_ANY,               VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_SAPPHIRERAPIDS_X,  X86_STEPPING_ANY,               VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_GRANITERAPIDS_X,   X86_STEPPING_ANY,               VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_EMERALDRAPIDS_X,   X86_STEPPING_ANY,               VMSCAPE),
+       VULNBL_INTEL_STEPPINGS(INTEL_ATOM_GRACEMONT,    X86_STEPPING_ANY,               RFDS | VMSCAPE),
        VULNBL_INTEL_STEPPINGS(INTEL_ATOM_TREMONT,      X86_STEPPING_ANY,               MMIO | MMIO_SBDS | RFDS),
        VULNBL_INTEL_STEPPINGS(INTEL_ATOM_TREMONT_D,    X86_STEPPING_ANY,               MMIO | RFDS),
        VULNBL_INTEL_STEPPINGS(INTEL_ATOM_TREMONT_L,    X86_STEPPING_ANY,               MMIO | MMIO_SBDS | RFDS),
        VULNBL_INTEL_STEPPINGS(INTEL_ATOM_GOLDMONT,     X86_STEPPING_ANY,               RFDS),
        VULNBL_INTEL_STEPPINGS(INTEL_ATOM_GOLDMONT_D,   X86_STEPPING_ANY,               RFDS),
        VULNBL_INTEL_STEPPINGS(INTEL_ATOM_GOLDMONT_PLUS, X86_STEPPING_ANY,              RFDS),
+       VULNBL_INTEL_STEPPINGS(INTEL_ATOM_CRESTMONT_X,  X86_STEPPING_ANY,               VMSCAPE),
 
        VULNBL_AMD(0x15, RETBLEED),
        VULNBL_AMD(0x16, RETBLEED),
-       VULNBL_AMD(0x17, RETBLEED | SMT_RSB | SRSO),
-       VULNBL_HYGON(0x18, RETBLEED | SMT_RSB | SRSO),
-       VULNBL_AMD(0x19, SRSO | TSA),
+       VULNBL_AMD(0x17, RETBLEED | SMT_RSB | SRSO | VMSCAPE),
+       VULNBL_HYGON(0x18, RETBLEED | SMT_RSB | SRSO | VMSCAPE),
+       VULNBL_AMD(0x19, SRSO | TSA | VMSCAPE),
+       VULNBL_AMD(0x1a, SRSO | VMSCAPE),
+
        {}
 };
 
@@ -1502,6 +1515,14 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c)
                }
        }
 
+       /*
+        * Set the bug only on bare-metal. A nested hypervisor should already be
+        * deploying IBPB to isolate itself from nested guests.
+        */
+       if (cpu_matches(cpu_vuln_blacklist, VMSCAPE) &&
+           !boot_cpu_has(X86_FEATURE_HYPERVISOR))
+               setup_force_cpu_bug(X86_BUG_VMSCAPE);
+
        if (cpu_matches(cpu_vuln_whitelist, NO_MELTDOWN))
                return;