0149-x86-entry-Move-SYSENTER_stack-to-the-beginning-of-st.patch 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. From fd5a4c6a4fbf0025ebf77092af09530d708a1264 Mon Sep 17 00:00:00 2001
  2. From: Andy Lutomirski <[email protected]>
  3. Date: Mon, 4 Dec 2017 15:07:19 +0100
  4. Subject: [PATCH 149/242] x86/entry: Move SYSENTER_stack to the beginning of
  5. struct tss_struct
  6. MIME-Version: 1.0
  7. Content-Type: text/plain; charset=UTF-8
  8. Content-Transfer-Encoding: 8bit
  9. CVE-2017-5754
  10. SYSENTER_stack should have reliable overflow detection, which
  11. means that it needs to be at the bottom of a page, not the top.
  12. Move it to the beginning of struct tss_struct and page-align it.
  13. Also add an assertion to make sure that the fixed hardware TSS
  14. doesn't cross a page boundary.
  15. Signed-off-by: Andy Lutomirski <[email protected]>
  16. Signed-off-by: Thomas Gleixner <[email protected]>
  17. Reviewed-by: Thomas Gleixner <[email protected]>
  18. Reviewed-by: Borislav Petkov <[email protected]>
  19. Cc: Boris Ostrovsky <[email protected]>
  20. Cc: Borislav Petkov <[email protected]>
  21. Cc: Borislav Petkov <[email protected]>
  22. Cc: Brian Gerst <[email protected]>
  23. Cc: Dave Hansen <[email protected]>
  24. Cc: Dave Hansen <[email protected]>
  25. Cc: David Laight <[email protected]>
  26. Cc: Denys Vlasenko <[email protected]>
  27. Cc: Eduardo Valentin <[email protected]>
  28. Cc: Greg KH <[email protected]>
  29. Cc: H. Peter Anvin <[email protected]>
  30. Cc: Josh Poimboeuf <[email protected]>
  31. Cc: Juergen Gross <[email protected]>
  32. Cc: Linus Torvalds <[email protected]>
  33. Cc: Peter Zijlstra <[email protected]>
  34. Cc: Rik van Riel <[email protected]>
  35. Cc: Will Deacon <[email protected]>
  36. Cc: [email protected]
  37. Cc: [email protected]
  38. Cc: [email protected]
  39. Cc: [email protected]
  40. Link: https://lkml.kernel.org/r/[email protected]
  41. Signed-off-by: Ingo Molnar <[email protected]>
  42. (cherry picked from commit 1a935bc3d4ea61556461a9e92a68ca3556232efd)
  43. Signed-off-by: Andy Whitcroft <[email protected]>
  44. Signed-off-by: Kleber Sacilotto de Souza <[email protected]>
  45. (cherry picked from commit 57d6cfd9e7d015aabbed6d0b50e7d2525b3c86c2)
  46. Signed-off-by: Fabian Grünbichler <[email protected]>
  47. ---
  48. arch/x86/include/asm/processor.h | 21 ++++++++++++---------
  49. arch/x86/kernel/cpu/common.c | 21 +++++++++++++++++++++
  50. 2 files changed, 33 insertions(+), 9 deletions(-)
  51. diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
  52. index 78123abdb046..55885465c3a7 100644
  53. --- a/arch/x86/include/asm/processor.h
  54. +++ b/arch/x86/include/asm/processor.h
  55. @@ -326,7 +326,16 @@ struct x86_hw_tss {
  56. struct tss_struct {
  57. /*
  58. - * The hardware state:
  59. + * Space for the temporary SYSENTER stack, used for SYSENTER
  60. + * and the entry trampoline as well.
  61. + */
  62. + unsigned long SYSENTER_stack_canary;
  63. + unsigned long SYSENTER_stack[64];
  64. +
  65. + /*
  66. + * The fixed hardware portion. This must not cross a page boundary
  67. + * at risk of violating the SDM's advice and potentially triggering
  68. + * errata.
  69. */
  70. struct x86_hw_tss x86_tss;
  71. @@ -337,15 +346,9 @@ struct tss_struct {
  72. * be within the limit.
  73. */
  74. unsigned long io_bitmap[IO_BITMAP_LONGS + 1];
  75. +} __aligned(PAGE_SIZE);
  76. - /*
  77. - * Space for the temporary SYSENTER stack.
  78. - */
  79. - unsigned long SYSENTER_stack_canary;
  80. - unsigned long SYSENTER_stack[64];
  81. -} ____cacheline_aligned;
  82. -
  83. -DECLARE_PER_CPU_SHARED_ALIGNED(struct tss_struct, cpu_tss);
  84. +DECLARE_PER_CPU_PAGE_ALIGNED(struct tss_struct, cpu_tss);
  85. /*
  86. * sizeof(unsigned long) coming from an extra "long" at the end
  87. diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
  88. index e526d82b546c..e61eff11f562 100644
  89. --- a/arch/x86/kernel/cpu/common.c
  90. +++ b/arch/x86/kernel/cpu/common.c
  91. @@ -487,6 +487,27 @@ static inline void setup_cpu_entry_area(int cpu)
  92. #endif
  93. __set_fixmap(get_cpu_entry_area_index(cpu, gdt), get_cpu_gdt_paddr(cpu), gdt_prot);
  94. +
  95. + /*
  96. + * The Intel SDM says (Volume 3, 7.2.1):
  97. + *
  98. + * Avoid placing a page boundary in the part of the TSS that the
  99. + * processor reads during a task switch (the first 104 bytes). The
  100. + * processor may not correctly perform address translations if a
  101. + * boundary occurs in this area. During a task switch, the processor
  102. + * reads and writes into the first 104 bytes of each TSS (using
  103. + * contiguous physical addresses beginning with the physical address
  104. + * of the first byte of the TSS). So, after TSS access begins, if
  105. + * part of the 104 bytes is not physically contiguous, the processor
  106. + * will access incorrect information without generating a page-fault
  107. + * exception.
  108. + *
  109. + * There are also a lot of errata involving the TSS spanning a page
  110. + * boundary. Assert that we're not doing that.
  111. + */
  112. + BUILD_BUG_ON((offsetof(struct tss_struct, x86_tss) ^
  113. + offsetofend(struct tss_struct, x86_tss)) & PAGE_MASK);
  114. +
  115. }
  116. /* Load the original GDT from the per-cpu structure */
  117. --
  118. 2.14.2