]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg/ArmSvcLib: prevent speculative execution beyond svc
authorVijayenthiran Subramaniam <vijayenthiran.subramaniam@arm.com>
Thu, 4 Jun 2020 13:12:09 +0000 (18:42 +0530)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 5 Jun 2020 08:05:03 +0000 (08:05 +0000)
Supervisor Call instruction (SVC) is used by the Arm Standalone MM
environment to request services from the privileged software (such as
ARM Trusted Firmware running in EL3) and also return back to the
non-secure caller via EL3. Some Arm CPUs speculatively executes the
instructions after the SVC instruction without crossing the privilege
level (S-EL0). Although the results of this execution are
architecturally discarded, adversary running on the non-secure side can
manipulate the contents of the general purpose registers to leak the
secure work memory through spectre like micro-architectural side channel
attacks. This behavior is demonstrated by the SafeSide project [1] and
[2]. Add barrier instructions after SVC to prevent speculative execution
to mitigate such attacks.

[1]: https://github.com/google/safeside/blob/master/demos/eret_hvc_smc_wrapper.cc
[2]: https://github.com/google/safeside/blob/master/kernel_modules/kmod_eret_hvc_smc/eret_hvc_smc_module.c

Signed-off-by: Vijayenthiran Subramaniam <vijayenthiran.subramaniam@arm.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S
ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S
ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm

index 7c94db3451f014e743481dbe79f5deacf9a5f001..ee265f94b9608a0f7a29e17c16ffa1185deec3c8 100644 (file)
@@ -1,5 +1,5 @@
 //\r
-//  Copyright (c) 2012 - 2017, ARM Limited. All rights reserved.\r
+//  Copyright (c) 2012 - 2020, ARM Limited. All rights reserved.\r
 //\r
 //  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 //\r
@@ -25,6 +25,9 @@ ASM_PFX(ArmCallSvc):
   ldp   x0, x1, [x0, #0]\r
 \r
   svc   #0\r
+  // Prevent speculative execution beyond svc instruction\r
+  dsb   nsh\r
+  isb\r
 \r
   // Pop the ARM_SVC_ARGS structure address from the stack into x9\r
   ldr   x9, [sp, #16]\r
index fc2886b6b53e0dd75b1ecec44d66e53f746a1613..e81eb88f2e871f68f9c23126891a7c6dbe408859 100644 (file)
@@ -1,5 +1,5 @@
 //\r
-//  Copyright (c) 2016 - 2017, ARM Limited. All rights reserved.\r
+//  Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.\r
 //\r
 //  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 //\r
@@ -18,6 +18,9 @@ ASM_PFX(ArmCallSvc):
     ldm     r0, {r0-r7}\r
 \r
     svc     #0\r
+    // Prevent speculative execution beyond svc instruction\r
+    dsb     nsh\r
+    isb\r
 \r
     // Load the ARM_SVC_ARGS structure address from the stack into r8\r
     ldr     r8, [sp]\r
index 82d10c023ae302fff5fc4d33c55e2c599acd93ff..d1751488b2b19151c4f4bccfcafd8d8d40a0f7e5 100644 (file)
@@ -1,5 +1,5 @@
 //\r
-//  Copyright (c) 2016 - 2017, ARM Limited. All rights reserved.\r
+//  Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.\r
 //\r
 //  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 //\r
@@ -16,6 +16,9 @@
     ldm     r0, {r0-r7}\r
 \r
     svc     #0\r
+    // Prevent speculative execution beyond svc instruction\r
+    dsb     nsh\r
+    isb\r
 \r
     // Load the ARM_SVC_ARGS structure address from the stack into r8\r
     ldr     r8, [sp]\r