aboutsummaryrefslogtreecommitdiffstats
path: root/main/xen/xsa227-4.6.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/xen/xsa227-4.6.patch')
-rw-r--r--main/xen/xsa227-4.6.patch66
1 files changed, 66 insertions, 0 deletions
diff --git a/main/xen/xsa227-4.6.patch b/main/xen/xsa227-4.6.patch
new file mode 100644
index 0000000000..3238cd9009
--- /dev/null
+++ b/main/xen/xsa227-4.6.patch
@@ -0,0 +1,66 @@
+From 697edc414352e89f29ca3de744a76c1625c0466c Mon Sep 17 00:00:00 2001
+From: Andrew Cooper <andrew.cooper3@citrix.com>
+Date: Tue, 20 Jun 2017 19:18:54 +0100
+Subject: [PATCH] x86/grant: Disallow misaligned PTEs
+
+Pagetable entries must be aligned to function correctly. Disallow attempts
+from the guest to have a grant PTE created at a misaligned address, which
+would result in corruption of the L1 table with largely-guest-controlled
+values.
+
+This is XSA-227
+
+Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
+Reviewed-by: Jan Beulich <jbeulich@suse.com>
+---
+ xen/arch/x86/mm.c | 13 +++++++++++++
+ xen/include/xen/config.h | 2 ++
+ 2 files changed, 15 insertions(+)
+
+diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
+index 213b52a..3bf728b 100644
+--- a/xen/arch/x86/mm.c
++++ b/xen/arch/x86/mm.c
+@@ -3878,6 +3878,9 @@ static int create_grant_pte_mapping(
+ l1_pgentry_t ol1e;
+ struct domain *d = v->domain;
+
++ if ( !IS_ALIGNED(pte_addr, sizeof(nl1e)) )
++ return GNTST_general_error;
++
+ adjust_guest_l1e(nl1e, d);
+
+ gmfn = pte_addr >> PAGE_SHIFT;
+@@ -3935,6 +3938,16 @@ static int destroy_grant_pte_mapping(
+ struct page_info *page;
+ l1_pgentry_t ol1e;
+
++ /*
++ * addr comes from Xen's active_entry tracking so isn't guest controlled,
++ * but it had still better be PTE-aligned.
++ */
++ if ( !IS_ALIGNED(addr, sizeof(ol1e)) )
++ {
++ ASSERT_UNREACHABLE();
++ return GNTST_general_error;
++ }
++
+ gmfn = addr >> PAGE_SHIFT;
+ page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
+
+diff --git a/xen/include/xen/config.h b/xen/include/xen/config.h
+index f7258c7..ded8156 100644
+--- a/xen/include/xen/config.h
++++ b/xen/include/xen/config.h
+@@ -72,6 +72,8 @@
+ #define MB(_mb) (_AC(_mb, ULL) << 20)
+ #define GB(_gb) (_AC(_gb, ULL) << 30)
+
++#define IS_ALIGNED(val, align) (((val) & ((align) - 1)) == 0)
++
+ #define __STR(...) #__VA_ARGS__
+ #define STR(...) __STR(__VA_ARGS__)
+
+--
+2.1.4
+