summarylogtreecommitdiffstats
path: root/0018-selftests-sgx-Add-test-for-TCS-page-permission-chang.patch
diff options
context:
space:
mode:
Diffstat (limited to '0018-selftests-sgx-Add-test-for-TCS-page-permission-chang.patch')
-rw-r--r--0018-selftests-sgx-Add-test-for-TCS-page-permission-chang.patch108
1 files changed, 108 insertions, 0 deletions
diff --git a/0018-selftests-sgx-Add-test-for-TCS-page-permission-chang.patch b/0018-selftests-sgx-Add-test-for-TCS-page-permission-chang.patch
new file mode 100644
index 000000000000..0c23834714fc
--- /dev/null
+++ b/0018-selftests-sgx-Add-test-for-TCS-page-permission-chang.patch
@@ -0,0 +1,108 @@
+From 0b54ab006b8b54ffbeb8abf57ba07221c2eae035 Mon Sep 17 00:00:00 2001
+From: Reinette Chatre <reinette.chatre@intel.com>
+Date: Mon, 7 Feb 2022 16:45:40 -0800
+Subject: [PATCH 18/34] selftests/sgx: Add test for TCS page permission changes
+
+Kernel should not allow permission changes on TCS pages. Add test to
+confirm this behavior.
+
+Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
+---
+ tools/testing/selftests/sgx/main.c | 74 ++++++++++++++++++++++++++++++
+ 1 file changed, 74 insertions(+)
+
+diff --git a/tools/testing/selftests/sgx/main.c b/tools/testing/selftests/sgx/main.c
+index 4f348ed1dc29..1398cd1b0983 100644
+--- a/tools/testing/selftests/sgx/main.c
++++ b/tools/testing/selftests/sgx/main.c
+@@ -121,6 +121,24 @@ static Elf64_Sym *vdso_symtab_get(struct vdso_symtab *symtab, const char *name)
+ return NULL;
+ }
+
++/*
++ * Return the offset in the enclave where the TCS segment can be found.
++ * The first RW segment loaded is the TCS.
++ */
++static off_t encl_get_tcs_offset(struct encl *encl)
++{
++ int i;
++
++ for (i = 0; i < encl->nr_segments; i++) {
++ struct encl_segment *seg = &encl->segment_tbl[i];
++
++ if (i == 0 && seg->prot == (PROT_READ | PROT_WRITE))
++ return seg->offset;
++ }
++
++ return -1;
++}
++
+ /*
+ * Return the offset in the enclave where the data segment can be found.
+ * The first RW segment loaded is the TCS, skip that to get info on the
+@@ -567,6 +585,62 @@ TEST_F(enclave, pte_permissions)
+ EXPECT_EQ(self->run.exception_addr, 0);
+ }
+
++/*
++ * Modifying permissions of TCS page should not be possible.
++ */
++TEST_F(enclave, tcs_permissions)
++{
++ struct sgx_enclave_restrict_perm ioc;
++ struct sgx_secinfo secinfo;
++ int ret, errno_save;
++
++ ASSERT_TRUE(setup_test_encl(ENCL_HEAP_SIZE_DEFAULT, &self->encl, _metadata));
++
++ memset(&self->run, 0, sizeof(self->run));
++ self->run.tcs = self->encl.encl_base;
++
++ memset(&ioc, 0, sizeof(ioc));
++ memset(&secinfo, 0, sizeof(secinfo));
++
++ /*
++ * Ensure kernel supports needed ioctl() and system supports needed
++ * commands.
++ */
++
++ ret = ioctl(self->encl.fd, SGX_IOC_ENCLAVE_RESTRICT_PERMISSIONS, &ioc);
++ errno_save = ret == -1 ? errno : 0;
++
++ /*
++ * Invalid parameters were provided during sanity check,
++ * expect command to fail.
++ */
++ ASSERT_EQ(ret, -1);
++
++ /* ret == -1 */
++ if (errno_save == ENOTTY)
++ SKIP(return,
++ "Kernel does not support SGX_IOC_ENCLAVE_RESTRICT_PERMISSIONS ioctl()");
++ else if (errno_save == ENODEV)
++ SKIP(return, "System does not support SGX2");
++
++ /*
++ * Attempt to make TCS page read-only. This is not allowed and
++ * should be prevented by the kernel.
++ */
++ secinfo.flags = PROT_READ;
++ ioc.offset = encl_get_tcs_offset(&self->encl);
++ ioc.length = PAGE_SIZE;
++ ioc.secinfo = (unsigned long)&secinfo;
++
++ ret = ioctl(self->encl.fd, SGX_IOC_ENCLAVE_RESTRICT_PERMISSIONS, &ioc);
++ errno_save = ret == -1 ? errno : 0;
++
++ EXPECT_EQ(ret, -1);
++ EXPECT_EQ(errno_save, EINVAL);
++ EXPECT_EQ(ioc.result, 0);
++ EXPECT_EQ(ioc.count, 0);
++}
++
+ /*
+ * Enclave page permission test.
+ *
+--
+2.35.1
+