Spectre bug

21 views
Skip to first unread message

abej...@gmail.com

unread,
Feb 2, 2018, 4:44:07 PM2/2/18
to BeagleBoard
Hi all,
The BeagleBone Green Wireless uses an ARM Cortex-A8. So  it has the variance 1 and 2 

There are three main variants of the exploits, as detailed by Google in their blogpost, that explain in detail the mechanisms:

Variant 1: bounds check bypass (CVE-2017-5753)
Variant 2: branch target injection (CVE-2017-5715)
Variant 3: rogue data cache load (CVE-2017-5754)
In addition, Arm has included information on a related variant to 3, noted as 3a, in the table below.

Follow the steps below to determine if there is any vulnerability for your devices and, if vulnerable, then the mitigation mechanisms.

Step 1

Check the table below to determine if you have an affected processor.

Only affected cores are listed, all other Arm cores are NOT affected.
No indicates not affected by the particular variant.
Yes indicates affected by the particular variant but has a mitigation (unless otherwise stated).

ProcessorVariant 1variant 2variant 3variant 3a
Cortex-A8Yes (under review)YesNoNo



They update with more information recently with this link
For Cortex-A8, Cortex-A9, and Cortex-A15, please apply the patches available at https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git/log/?h=kpti

The problem is that this patch can apply only for the kernel 4.9 and after kernels, however, the BBGW only can use the kernel 4.4, because if you use a different kernel you are going to have this error message

[  310.837199] wlcore: ERROR error getting static data
[  310.888675] wlcore: ERROR firmware boot failed despite 3 retries
[  317.196091] wlcore: ERROR Your WiFi FW version (8.9.0.0.17) is invalid.
[  317.196091] Please use at least FW 8.9.*.*.58.
[  317.196091] You can get the latest firmwares at:


I tried to solve it with this patch for the kernel:



diff
--git a/arch/arm/include/asm/cp15.h b/arch/arm/include/asm/cp15.h
index c3f1152
..8142add 100644
--- a/arch/arm/include/asm/cp15.h
+++ b/arch/arm/include/asm/cp15.h
@@ -49,6 +49,23 @@
 
 
#ifdef CONFIG_CPU_CP15
 
+#define __ACCESS_CP15(CRn, Op1, CRm, Op2) \
+ "mrc", "mcr", __stringify(p15, Op1, %0, CRn, CRm, Op2), u32
+#define __ACCESS_CP15_64(Op1, CRm) \
+ "mrrc", "mcrr", __stringify(p15, Op1, %Q0, %R0, CRm), u64
+
+#define __read_sysreg(r, w, c, t) ({ \
+ t __val; \
+ asm volatile(r " " c : "=r" (__val)); \
+ __val; \
+})
+#define read_sysreg(...) __read_sysreg(__VA_ARGS__)
+
+#define __write_sysreg(v, r, w, c, t) asm volatile(w " " c : : "r" ((t)(v)))
+#define write_sysreg(v, ...) __write_sysreg(v, __VA_ARGS__)
+
+#define BPIALL              __ACCESS_CP15(c7, 0, c5, 6)
+
 
extern unsigned long cr_alignment; /* defined in entry-armv.S */
 
 
static inline unsigned long get_cr(void)
diff
--git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
index a11dc6d
..4a98ca7 100644
--- a/arch/arm/mm/fault.c
+++ b/arch/arm/mm/fault.c
@@ -20,6 +20,7 @@
 
#include <linux/highmem.h>
 
#include <linux/perf_event.h>
 
+#include <asm/cp15.h>
 
#include <asm/exception.h>
 
#include <asm/pgtable.h>
 
#include <asm/system_misc.h>
@@ -180,6 +181,7 @@ __do_user_fault(struct task_struct *tsk, unsigned long addr,
  si
.si_errno = 0;
  si
.si_code = code;
  si
.si_addr = (void __user *)addr;
+
  force_sig_info
(sig, &si, tsk);
 
}
 
@@ -395,12 +397,35 @@ no_context:
  __do_kernel_fault
(mm, addr, fsr, regs);
 
return 0;
 
}
+
+static int
+do_pabt_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
+{
+   if (addr > TASK_SIZE) {
+       switch(read_cpuid_part()) {
+       case ARM_CPU_PART_CORTEX_A8:
+       case ARM_CPU_PART_CORTEX_A9:
+       case ARM_CPU_PART_CORTEX_A12:
+       case ARM_CPU_PART_CORTEX_A17:
+           write_sysreg(0, BPIALL);
+           break;
+       }
+   }
+
+   return do_page_fault(addr, fsr, regs);
+}
 
#else /* CONFIG_MMU */
 
static int
 do_page_fault
(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 
{
 
return 0;
 
}
+
+static int
+do_pabt_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
+{
+   return 0;
+}
 
#endif /* CONFIG_MMU */
 
 
/*
diff --git a/arch/arm/mm/fsr-2level.c b/arch/arm/mm/fsr-2level.c
index 18ca74c..4cede9b 100644
--- a/arch/arm/mm/fsr-2level.c
+++ b/arch/arm/mm/fsr-2level.c
@@ -50,7 +50,7 @@ static struct fsr_info ifsr_info[] = {
  { do_bad, SIGBUS,  0, "unknown 4"   },
  { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault"   },
  { do_bad, SIGSEGV, SEGV_ACCERR, "page access flag fault"   },
- { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault"   },
+ { do_pabt_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault"   },
  { do_bad, SIGBUS, 0, "external abort on non-linefetch"  },
  { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault"   },
  { do_bad, SIGBUS,  0, "unknown 10"   },
@@ -58,7 +58,7 @@ static struct fsr_info ifsr_info[] = {
  { do_bad, SIGBUS, 0, "external abort on translation"   },
  { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault"   },
  { do_bad, SIGBUS, 0, "external abort on translation"   },
- { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault"   },
+ { do_pabt_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault"   },
  { do_bad, SIGBUS,  0, "unknown 16"   },
  { do_bad, SIGBUS,  0, "unknown 17"   },
  { do_bad, SIGBUS,  0, "unknown 18"   },
diff --git a/arch/arm/mm/fsr-3level.c b/arch/arm/mm/fsr-3level.c
index ab4409a..f3931ed 100644
--- a/arch/arm/mm/fsr-3level.c
+++ b/arch/arm/mm/fsr-3level.c
@@ -64,5 +64,69 @@ static struct fsr_info fsr_info[] = {
  { do_bad, SIGBUS,  0, "unknown 62" },
  { do_bad, SIGBUS,  0, "unknown 63" },
 };
-
-#define ifsr_info fsr_info
+static struct fsr_info ifsr_info[] = {
+   { do_bad,       SIGBUS,  0,     "unknown 0"         },
+   { do_bad,       SIGBUS,  0,     "unknown 1"         },
+   { do_bad,       SIGBUS,  0,     "unknown 2"         },
+   { do_bad,       SIGBUS,  0,     "unknown 3"         },
+   { do_bad,       SIGBUS,  0,     "reserved translation fault"    },
+   { do_translation_fault, SIGSEGV, SEGV_MAPERR,   "level 1 translation fault" },
+   { do_translation_fault, SIGSEGV, SEGV_MAPERR,   "level 2 translation fault" },
+   { do_pabt_page_fault,   SIGSEGV, SEGV_MAPERR,   "level 3 translation fault" },
+   { do_bad,       SIGBUS,  0,     "reserved access flag fault"    },
+   { do_bad,       SIGSEGV, SEGV_ACCERR,   "level 1 access flag fault" },
+   { do_pabt_page_fault,   SIGSEGV, SEGV_ACCERR,   "level 2 access flag fault" },
+   { do_pabt_page_fault,   SIGSEGV, SEGV_ACCERR,   "level 3 access flag fault" },
+   { do_bad,       SIGBUS,  0,     "reserved permission fault" },
+   { do_bad,       SIGSEGV, SEGV_ACCERR,   "level 1 permission fault"  },
+   { do_pabt_page_fault,   SIGSEGV, SEGV_ACCERR,   "level 2 permission fault"  },
+   { do_pabt_page_fault,   SIGSEGV, SEGV_ACCERR,   "level 3 permission fault"  },
+   { do_bad,       SIGBUS,  0,     "synchronous external abort"    },
+   { do_bad,       SIGBUS,  0,     "asynchronous external abort"   },
+   { do_bad,       SIGBUS,  0,     "unknown 18"            },
+   { do_bad,       SIGBUS,  0,     "unknown 19"            },
+   { do_bad,       SIGBUS,  0,     "synchronous abort (translation table walk)" },
+   { do_bad,       SIGBUS,  0,     "synchronous abort (translation table walk)" },
+   { do_bad,       SIGBUS,  0,     "synchronous abort (translation table walk)" },
+   { do_bad,       SIGBUS,  0,     "synchronous abort (translation table walk)" },
+   { do_bad,       SIGBUS,  0,     "synchronous parity error"  },
+   { do_bad,       SIGBUS,  0,     "asynchronous parity error" },
+   { do_bad,       SIGBUS,  0,     "unknown 26"            },
+   { do_bad,       SIGBUS,  0,     "unknown 27"            },
+   { do_bad,       SIGBUS,  0,     "synchronous parity error (translation table walk" },
+   { do_bad,       SIGBUS,  0,     "synchronous parity error (translation table walk" },
+   { do_bad,       SIGBUS,  0,     "synchronous parity error (translation table walk" },
+   { do_bad,       SIGBUS,  0,     "synchronous parity error (translation table walk" },
+   { do_bad,       SIGBUS,  0,     "unknown 32"            },
+   { do_bad,       SIGBUS,  BUS_ADRALN,    "alignment fault"       },
+   { do_bad,       SIGBUS,  0,     "debug event"           },
+   { do_bad,       SIGBUS,  0,     "unknown 35"            },
+   { do_bad,       SIGBUS,  0,     "unknown 36"            },
+   { do_bad,       SIGBUS,  0,     "unknown 37"            },
+   { do_bad,       SIGBUS,  0,     "unknown 38"            },
+   { do_bad,       SIGBUS,  0,     "unknown 39"            },
+   { do_bad,       SIGBUS,  0,     "unknown 40"            },
+   { do_bad,       SIGBUS,  0,     "unknown 41"            },
+   { do_bad,       SIGBUS,  0,     "unknown 42"            },
+   { do_bad,       SIGBUS,  0,     "unknown 43"            },
+   { do_bad,       SIGBUS,  0,     "unknown 44"            },
+   { do_bad,       SIGBUS,  0,     "unknown 45"            },
+   { do_bad,       SIGBUS,  0,     "unknown 46"            },
+   { do_bad,       SIGBUS,  0,     "unknown 47"            },
+   { do_bad,       SIGBUS,  0,     "unknown 48"            },
+   { do_bad,       SIGBUS,  0,     "unknown 49"            },
+   { do_bad,       SIGBUS,  0,     "unknown 50"            },
+   { do_bad,       SIGBUS,  0,     "unknown 51"            },
+   { do_bad,       SIGBUS,  0,     "implementation fault (lockdown abort)" },
+   { do_bad,       SIGBUS,  0,     "unknown 53"            },
+   { do_bad,       SIGBUS,  0,     "unknown 54"            },
+   { do_bad,       SIGBUS,  0,     "unknown 55"            },
+   { do_bad,       SIGBUS,  0,     "unknown 56"            },
+   { do_bad,       SIGBUS,  0,     "unknown 57"            },
+   { do_bad,       SIGBUS,  0,     "implementation fault (coprocessor abort)" },
+   { do_bad,       SIGBUS,  0,     "unknown 59"            },
+   { do_bad,       SIGBUS,  0,     "unknown 60"            },
+   { do_bad,       SIGBUS,  0,     "unknown 61"            },
+   { do_bad,       SIGBUS,  0,     "unknown 62"            },
+   { do_bad,       SIGBUS,  0,     "unknown 63"            },
+};


Can you check that this solution is fine?

Robert Nelson

unread,
Feb 2, 2018, 4:55:38 PM2/2/18
to Beagle Board
Reply all
Reply to author
Forward
0 new messages