* [LTP] [PATCH 0/2] Add mseal() testing suite
@ 2024-06-10 9:43 Andrea Cervesato
2024-06-10 9:44 ` [LTP] [PATCH 1/2] Add mseal() syscall declaration Andrea Cervesato
2024-06-10 9:44 ` [LTP] [PATCH 2/2] Add mseal01 test Andrea Cervesato
0 siblings, 2 replies; 4+ messages in thread
From: Andrea Cervesato @ 2024-06-10 9:43 UTC (permalink / raw)
To: ltp
Smoke test for mseal() syscall added in the kernel 6.10. All information
can be found at the following link:
https://docs.kernel.org/userspace-api/mseal.html
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
Andrea Cervesato (2):
Add mseal() syscall declaration
Add mseal01 test
include/lapi/syscalls/aarch64.in | 1 +
include/lapi/syscalls/arc.in | 1 +
include/lapi/syscalls/arm.in | 1 +
include/lapi/syscalls/hppa.in | 1 +
include/lapi/syscalls/i386.in | 1 +
include/lapi/syscalls/ia64.in | 1 +
include/lapi/syscalls/loongarch.in | 1 +
include/lapi/syscalls/mips_n32.in | 1 +
include/lapi/syscalls/mips_n64.in | 1 +
include/lapi/syscalls/mips_o32.in | 1 +
include/lapi/syscalls/powerpc.in | 1 +
include/lapi/syscalls/powerpc64.in | 1 +
include/lapi/syscalls/s390.in | 1 +
include/lapi/syscalls/s390x.in | 1 +
include/lapi/syscalls/sh.in | 1 +
include/lapi/syscalls/sparc.in | 1 +
include/lapi/syscalls/sparc64.in | 1 +
include/lapi/syscalls/x86_64.in | 1 +
testcases/kernel/syscalls/mseal/.gitignore | 1 +
testcases/kernel/syscalls/mseal/Makefile | 7 ++
testcases/kernel/syscalls/mseal/mseal01.c | 177 +++++++++++++++++++++++++++++
21 files changed, 203 insertions(+)
---
base-commit: 66517b89141fc455ed807f3b95e5260dcf9fb90f
change-id: 20240607-mseal-dfac12675096
Best regards,
--
Andrea Cervesato <andrea.cervesato@suse.com>
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 4+ messages in thread
* [LTP] [PATCH 1/2] Add mseal() syscall declaration
2024-06-10 9:43 [LTP] [PATCH 0/2] Add mseal() testing suite Andrea Cervesato
@ 2024-06-10 9:44 ` Andrea Cervesato
2024-06-10 9:44 ` [LTP] [PATCH 2/2] Add mseal01 test Andrea Cervesato
1 sibling, 0 replies; 4+ messages in thread
From: Andrea Cervesato @ 2024-06-10 9:44 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
---
include/lapi/syscalls/aarch64.in | 1 +
include/lapi/syscalls/arc.in | 1 +
include/lapi/syscalls/arm.in | 1 +
include/lapi/syscalls/hppa.in | 1 +
include/lapi/syscalls/i386.in | 1 +
include/lapi/syscalls/ia64.in | 1 +
include/lapi/syscalls/loongarch.in | 1 +
include/lapi/syscalls/mips_n32.in | 1 +
include/lapi/syscalls/mips_n64.in | 1 +
include/lapi/syscalls/mips_o32.in | 1 +
include/lapi/syscalls/powerpc.in | 1 +
include/lapi/syscalls/powerpc64.in | 1 +
include/lapi/syscalls/s390.in | 1 +
include/lapi/syscalls/s390x.in | 1 +
include/lapi/syscalls/sh.in | 1 +
include/lapi/syscalls/sparc.in | 1 +
include/lapi/syscalls/sparc64.in | 1 +
include/lapi/syscalls/x86_64.in | 1 +
18 files changed, 18 insertions(+)
diff --git a/include/lapi/syscalls/aarch64.in b/include/lapi/syscalls/aarch64.in
index 2cb6c2d87..18e637c99 100644
--- a/include/lapi/syscalls/aarch64.in
+++ b/include/lapi/syscalls/aarch64.in
@@ -297,4 +297,5 @@ faccessat2 439
epoll_pwait2 441
quotactl_fd 443
futex_waitv 449
+mseal 462
_sysctl 1078
diff --git a/include/lapi/syscalls/arc.in b/include/lapi/syscalls/arc.in
index 3e2ee9061..bdcc4be74 100644
--- a/include/lapi/syscalls/arc.in
+++ b/include/lapi/syscalls/arc.in
@@ -317,3 +317,4 @@ faccessat2 439
epoll_pwait2 441
quotactl_fd 443
futex_waitv 449
+mseal 462
diff --git a/include/lapi/syscalls/arm.in b/include/lapi/syscalls/arm.in
index 7bdbca533..b5486ced0 100644
--- a/include/lapi/syscalls/arm.in
+++ b/include/lapi/syscalls/arm.in
@@ -395,3 +395,4 @@ faccessat2 (__NR_SYSCALL_BASE+439)
epoll_pwait2 (__NR_SYSCALL_BASE+441)
quotactl_fd (__NR_SYSCALL_BASE+443)
futex_waitv (__NR_SYSCALL_BASE+449)
+mseal (__NR_SYSCALL_BASE+462)
diff --git a/include/lapi/syscalls/hppa.in b/include/lapi/syscalls/hppa.in
index 8ebdafafb..b1e2ef799 100644
--- a/include/lapi/syscalls/hppa.in
+++ b/include/lapi/syscalls/hppa.in
@@ -44,3 +44,4 @@ faccessat2 439
epoll_pwait2 441
quotactl_fd 443
futex_waitv 449
+mseal 462
diff --git a/include/lapi/syscalls/i386.in b/include/lapi/syscalls/i386.in
index 1472631c4..e528977de 100644
--- a/include/lapi/syscalls/i386.in
+++ b/include/lapi/syscalls/i386.in
@@ -431,3 +431,4 @@ faccessat2 439
epoll_pwait2 441
quotactl_fd 443
futex_waitv 449
+mseal 462
diff --git a/include/lapi/syscalls/ia64.in b/include/lapi/syscalls/ia64.in
index 0ea6e9722..05e7062e5 100644
--- a/include/lapi/syscalls/ia64.in
+++ b/include/lapi/syscalls/ia64.in
@@ -344,3 +344,4 @@ faccessat2 1463
epoll_pwait2 1465
quotactl_fd 1467
futex_waitv 1473
+mseal 1486
diff --git a/include/lapi/syscalls/loongarch.in b/include/lapi/syscalls/loongarch.in
index 301f611f6..0215e9cd5 100644
--- a/include/lapi/syscalls/loongarch.in
+++ b/include/lapi/syscalls/loongarch.in
@@ -305,3 +305,4 @@ memfd_secret 447
process_mrelease 448
futex_waitv 449
set_mempolicy_home_node 450
+mseal 462
diff --git a/include/lapi/syscalls/mips_n32.in b/include/lapi/syscalls/mips_n32.in
index e818c9d92..adee58fc8 100644
--- a/include/lapi/syscalls/mips_n32.in
+++ b/include/lapi/syscalls/mips_n32.in
@@ -371,3 +371,4 @@ epoll_pwait2 6441
mount_setattr 6442
quotactl_fd 6443
futex_waitv 6449
+mseal 6462
diff --git a/include/lapi/syscalls/mips_n64.in b/include/lapi/syscalls/mips_n64.in
index 6e15f43b3..6ab95ddf1 100644
--- a/include/lapi/syscalls/mips_n64.in
+++ b/include/lapi/syscalls/mips_n64.in
@@ -347,3 +347,4 @@ epoll_pwait2 5441
mount_setattr 5442
quotactl_fd 5443
futex_waitv 5449
+mseal 5462
diff --git a/include/lapi/syscalls/mips_o32.in b/include/lapi/syscalls/mips_o32.in
index 921d5d331..4757d9c94 100644
--- a/include/lapi/syscalls/mips_o32.in
+++ b/include/lapi/syscalls/mips_o32.in
@@ -417,3 +417,4 @@ epoll_pwait2 4441
mount_setattr 4442
quotactl_fd 4443
futex_waitv 4449
+mseal 4462
diff --git a/include/lapi/syscalls/powerpc.in b/include/lapi/syscalls/powerpc.in
index 545d9d3d6..7b5a94ba5 100644
--- a/include/lapi/syscalls/powerpc.in
+++ b/include/lapi/syscalls/powerpc.in
@@ -424,3 +424,4 @@ faccessat2 439
epoll_pwait2 441
quotactl_fd 443
futex_waitv 449
+mseal 462
diff --git a/include/lapi/syscalls/powerpc64.in b/include/lapi/syscalls/powerpc64.in
index 545d9d3d6..7b5a94ba5 100644
--- a/include/lapi/syscalls/powerpc64.in
+++ b/include/lapi/syscalls/powerpc64.in
@@ -424,3 +424,4 @@ faccessat2 439
epoll_pwait2 441
quotactl_fd 443
futex_waitv 449
+mseal 462
diff --git a/include/lapi/syscalls/s390.in b/include/lapi/syscalls/s390.in
index 7213ac5f8..4cf870697 100644
--- a/include/lapi/syscalls/s390.in
+++ b/include/lapi/syscalls/s390.in
@@ -411,3 +411,4 @@ faccessat2 439
epoll_pwait2 441
quotactl_fd 443
futex_waitv 449
+mseal 462
diff --git a/include/lapi/syscalls/s390x.in b/include/lapi/syscalls/s390x.in
index 879012e2b..9e70b9421 100644
--- a/include/lapi/syscalls/s390x.in
+++ b/include/lapi/syscalls/s390x.in
@@ -359,3 +359,4 @@ faccessat2 439
epoll_pwait2 441
quotactl_fd 443
futex_waitv 449
+mseal 462
diff --git a/include/lapi/syscalls/sh.in b/include/lapi/syscalls/sh.in
index 7d5192a27..d8cd978f5 100644
--- a/include/lapi/syscalls/sh.in
+++ b/include/lapi/syscalls/sh.in
@@ -405,3 +405,4 @@ faccessat2 439
epoll_pwait2 441
quotactl_fd 443
futex_waitv 449
+mseal 462
diff --git a/include/lapi/syscalls/sparc.in b/include/lapi/syscalls/sparc.in
index 91d2fb1c2..3d123727f 100644
--- a/include/lapi/syscalls/sparc.in
+++ b/include/lapi/syscalls/sparc.in
@@ -410,3 +410,4 @@ faccessat2 439
epoll_pwait2 441
quotactl_fd 443
futex_waitv 449
+mseal 462
diff --git a/include/lapi/syscalls/sparc64.in b/include/lapi/syscalls/sparc64.in
index 1f2fc59b7..9ef7abe37 100644
--- a/include/lapi/syscalls/sparc64.in
+++ b/include/lapi/syscalls/sparc64.in
@@ -375,3 +375,4 @@ faccessat2 439
epoll_pwait2 441
quotactl_fd 443
futex_waitv 449
+mseal 462
diff --git a/include/lapi/syscalls/x86_64.in b/include/lapi/syscalls/x86_64.in
index dc61aa56e..a59fa452d 100644
--- a/include/lapi/syscalls/x86_64.in
+++ b/include/lapi/syscalls/x86_64.in
@@ -352,6 +352,7 @@ faccessat2 439
epoll_pwait2 441
quotactl_fd 443
futex_waitv 449
+mseal 462
rt_sigaction 512
rt_sigreturn 513
ioctl 514
--
2.35.3
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [LTP] [PATCH 2/2] Add mseal01 test
2024-06-10 9:43 [LTP] [PATCH 0/2] Add mseal() testing suite Andrea Cervesato
2024-06-10 9:44 ` [LTP] [PATCH 1/2] Add mseal() syscall declaration Andrea Cervesato
@ 2024-06-10 9:44 ` Andrea Cervesato
2024-07-11 15:53 ` Cyril Hrubis
1 sibling, 1 reply; 4+ messages in thread
From: Andrea Cervesato @ 2024-06-10 9:44 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
This is a smoke test that verifies if mseal() protects specific VMA
portions of a process. According to documentation, the syscall should
protect memory from the following actions:
- unmapping, moving to another location, and shrinking the size, via
munmap() and mremap()
- moving or expanding a different VMA into the current location, via
mremap()
- modifying a VMA via mmap(MAP_FIXED)
- mprotect() and pkey_mprotect()
- destructive madvice() behaviors (e.g. MADV_DONTNEED) for anonymous
memory, when users don’t have write permission to the memory
Any of the described actions is recognized via EPERM errno.
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
testcases/kernel/syscalls/mseal/.gitignore | 1 +
testcases/kernel/syscalls/mseal/Makefile | 7 ++
testcases/kernel/syscalls/mseal/mseal01.c | 177 +++++++++++++++++++++++++++++
3 files changed, 185 insertions(+)
diff --git a/testcases/kernel/syscalls/mseal/.gitignore b/testcases/kernel/syscalls/mseal/.gitignore
new file mode 100644
index 000000000..e13090994
--- /dev/null
+++ b/testcases/kernel/syscalls/mseal/.gitignore
@@ -0,0 +1 @@
+mseal01
diff --git a/testcases/kernel/syscalls/mseal/Makefile b/testcases/kernel/syscalls/mseal/Makefile
new file mode 100644
index 000000000..35317f446
--- /dev/null
+++ b/testcases/kernel/syscalls/mseal/Makefile
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (C) 2023 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
+
+top_srcdir ?= ../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/syscalls/mseal/mseal01.c b/testcases/kernel/syscalls/mseal/mseal01.c
new file mode 100644
index 000000000..bf5e71612
--- /dev/null
+++ b/testcases/kernel/syscalls/mseal/mseal01.c
@@ -0,0 +1,177 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * This is a smoke test that verifies if mseal() protects specific VMA portions
+ * of a process. According to documentation, the syscall should protect memory
+ * from the following actions:
+ *
+ * - unmapping, moving to another location, and shrinking the size, via munmap()
+ * and mremap()
+ * - moving or expanding a different VMA into the current location, via mremap()
+ * - modifying a VMA via mmap(MAP_FIXED)
+ * - mprotect() and pkey_mprotect()
+ * - destructive madvice() behaviors (e.g. MADV_DONTNEED) for anonymous memory,
+ * when users don’t have write permission to the memory
+ *
+ * Any of the described actions is recognized via EPERM errno.
+ */
+
+#define _GNU_SOURCE
+
+#include "tst_test.h"
+
+#ifndef TST_ABI32
+#include "lapi/syscalls.h"
+
+#define MEMPAGES 8
+#define MEMSEAL 2
+
+static void *mem_addr;
+static int mem_size;
+static int mem_offset;
+static int mem_alignment;
+
+static inline int sys_mseal(void *start, size_t len)
+{
+ return tst_syscall(__NR_mseal, start, len, 0);
+}
+
+static void test_mprotect(void)
+{
+ TST_EXP_FAIL(mprotect(mem_addr, mem_size, PROT_NONE), EPERM);
+}
+
+static void test_pkey_mprotect(void)
+{
+ int ret;
+ int pkey;
+
+ pkey = pkey_alloc(0, 0);
+ if (pkey == -1) {
+ if (errno == EINVAL)
+ tst_brk(TCONF, "pku is not supported on this CPU");
+
+ tst_brk(TBROK | TERRNO, "pkey_alloc() error");
+ }
+
+ TST_EXP_FAIL(pkey_mprotect(
+ mem_addr, mem_size,
+ PROT_NONE,
+ pkey),
+ EPERM);
+
+ ret = pkey_free(pkey);
+ if (ret == -1)
+ tst_brk(TBROK | TERRNO, "pkey_free() error");
+}
+
+static void test_madvise(void)
+{
+ TST_EXP_FAIL(madvise(mem_addr, mem_size, MADV_DONTNEED), EPERM);
+}
+
+static void test_munmap(void)
+{
+ TST_EXP_FAIL(munmap(mem_addr, mem_size), EPERM);
+}
+
+static void test_mremap_resize(void)
+{
+ void *new_addr;
+ size_t new_size = 2 * mem_alignment;
+
+ new_addr = SAFE_MMAP(NULL, mem_size,
+ PROT_READ,
+ MAP_ANONYMOUS | MAP_PRIVATE,
+ -1, 0);
+
+ TST_EXP_FAIL_PTR_VOID(mremap(mem_addr, mem_size, new_size,
+ MREMAP_MAYMOVE | MREMAP_FIXED,
+ new_addr),
+ EPERM);
+
+ SAFE_MUNMAP(new_addr, new_size);
+}
+
+static void test_mmap_change_prot(void)
+{
+ TST_EXP_FAIL_PTR_VOID(mmap(mem_addr, mem_size,
+ PROT_READ,
+ MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED,
+ -1, 0), EPERM);
+}
+
+static struct tcase {
+ void (*func_test)(void);
+ int prot;
+ char *message;
+} tcases[] = {
+ {test_mprotect, PROT_READ | PROT_WRITE, "mprotect() availability"},
+ {test_pkey_mprotect, PROT_READ | PROT_WRITE, "pkey_mprotect() availability"},
+ {test_madvise, PROT_READ, "madvise() availability"},
+ {test_munmap, PROT_READ | PROT_WRITE, "munmap() availability from child"},
+ {test_mremap_resize, PROT_READ | PROT_WRITE, "mremap() address move/resize"},
+ {test_mmap_change_prot, PROT_READ | PROT_WRITE, "mmap() protection change"},
+};
+
+static void child(unsigned int n)
+{
+ struct tcase *tc = &tcases[n];
+
+ mem_addr = SAFE_MMAP(NULL, mem_size,
+ tc->prot,
+ MAP_ANONYMOUS | MAP_PRIVATE,
+ -1, 0);
+
+ tst_res(TINFO, "Testing %s", tc->message);
+
+ TST_EXP_PASS(sys_mseal(mem_addr + mem_offset, mem_alignment));
+
+ tc->func_test();
+}
+
+static void run(unsigned int n)
+{
+ /* the reason why we spawn a child is that mseal() will
+ * protect VMA until process will call _exit()
+ */
+ if (!SAFE_FORK()) {
+ child(n);
+ _exit(0);
+ }
+
+ tst_reap_children();
+
+ if (mem_addr != MAP_FAILED)
+ SAFE_MUNMAP(mem_addr, mem_size);
+}
+
+static void setup(void)
+{
+ mem_alignment = getpagesize();
+ mem_size = mem_alignment * MEMPAGES;
+ mem_offset = mem_alignment * MEMSEAL;
+}
+
+static void cleanup(void)
+{
+ if (mem_addr != MAP_FAILED)
+ SAFE_MUNMAP(mem_addr, mem_size);
+}
+
+static struct tst_test test = {
+ .test = run,
+ .tcnt = ARRAY_SIZE(tcases),
+ .setup = setup,
+ .cleanup = cleanup,
+ .min_kver = "6.10",
+ .forks_child = 1,
+};
+#else
+TST_TEST_TCONF("mseal() doesn't support 32bit arch");
+#endif
--
2.35.3
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [LTP] [PATCH 2/2] Add mseal01 test
2024-06-10 9:44 ` [LTP] [PATCH 2/2] Add mseal01 test Andrea Cervesato
@ 2024-07-11 15:53 ` Cyril Hrubis
0 siblings, 0 replies; 4+ messages in thread
From: Cyril Hrubis @ 2024-07-11 15:53 UTC (permalink / raw)
To: Andrea Cervesato; +Cc: ltp
Hi!
> +#ifndef TST_ABI32
This is the worst type of check you can do and should be used only when
the test code does not compile at all.
Instead you should check the return value from mseal() syscall and TCONF
if you get ENOSYS on 32bit, at least the syscalls numbers seems to be
allocated so you should get ENOSYS at runtime.
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-07-11 15:53 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-10 9:43 [LTP] [PATCH 0/2] Add mseal() testing suite Andrea Cervesato
2024-06-10 9:44 ` [LTP] [PATCH 1/2] Add mseal() syscall declaration Andrea Cervesato
2024-06-10 9:44 ` [LTP] [PATCH 2/2] Add mseal01 test Andrea Cervesato
2024-07-11 15:53 ` Cyril Hrubis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox