linux-api.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1 0/7] Minor Landlock fixes and new tests
@ 2022-02-21 15:53 Mickaël Salaün
  2022-02-21 15:53 ` [PATCH v1 1/7] landlock: Fix landlock_add_rule(2) documentation Mickaël Salaün
                   ` (6 more replies)
  0 siblings, 7 replies; 10+ messages in thread
From: Mickaël Salaün @ 2022-02-21 15:53 UTC (permalink / raw)
  To: James Morris, Serge E . Hallyn
  Cc: Mickaël Salaün, Jann Horn, Kees Cook,
	Konstantin Meskhidze, Nathan Chancellor, Nick Desaulniers,
	Paul Moore, Shuah Khan, linux-api, linux-kernel,
	linux-security-module

Hi,

This series contains landlock_add_rule(2) (cosmetic) signature and
documentation fixes.  There is also some miscellaneous new tests to
improve coverage and that may help for future access types (e.g.
networking).

Regards,

Mickaël Salaün (7):
  landlock: Fix landlock_add_rule(2) documentation
  landlock: Fix landlock_add_rule(2) signature
  selftest/landlock: Make tests build with old libc
  selftest/landlock: Extend tests for minimal valid attribute size
  selftest/landlock: Add tests for unknown access rights
  selftest/landlock: Extend access right tests to directories
  selftest/landlock: Fully test file rename with "remove" access

 include/linux/syscalls.h                     |  3 +-
 include/uapi/linux/landlock.h                |  5 +-
 security/landlock/syscalls.c                 | 14 ++--
 tools/testing/selftests/landlock/base_test.c |  5 ++
 tools/testing/selftests/landlock/fs_test.c   | 84 ++++++++++++++++----
 5 files changed, 86 insertions(+), 25 deletions(-)


base-commit: cfb92440ee71adcc2105b0890bb01ac3cddb8507
-- 
2.35.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v1 1/7] landlock: Fix landlock_add_rule(2) documentation
  2022-02-21 15:53 [PATCH v1 0/7] Minor Landlock fixes and new tests Mickaël Salaün
@ 2022-02-21 15:53 ` Mickaël Salaün
  2022-02-21 15:53 ` [PATCH v1 2/7] landlock: Fix landlock_add_rule(2) signature Mickaël Salaün
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Mickaël Salaün @ 2022-02-21 15:53 UTC (permalink / raw)
  To: James Morris, Serge E . Hallyn
  Cc: Mickaël Salaün, Jann Horn, Kees Cook,
	Konstantin Meskhidze, Nathan Chancellor, Nick Desaulniers,
	Paul Moore, Shuah Khan, linux-api, linux-kernel,
	linux-security-module, Mickaël Salaün

From: Mickaël Salaün <mic@linux.microsoft.com>

It is not mandatory to pass a file descriptor obtained with the O_PATH
flag.  Also, replace rule's accesses with ruleset's accesses.

Signed-off-by: Mickaël Salaün <mic@linux.microsoft.com>
Link: https://lore.kernel.org/r/20220221155311.166278-2-mic@digikod.net
---
 include/uapi/linux/landlock.h | 5 +++--
 security/landlock/syscalls.c  | 7 +++----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/include/uapi/linux/landlock.h b/include/uapi/linux/landlock.h
index b3d952067f59..c0390e318a65 100644
--- a/include/uapi/linux/landlock.h
+++ b/include/uapi/linux/landlock.h
@@ -60,8 +60,9 @@ struct landlock_path_beneath_attr {
 	 */
 	__u64 allowed_access;
 	/**
-	 * @parent_fd: File descriptor, open with ``O_PATH``, which identifies
-	 * the parent directory of a file hierarchy, or just a file.
+	 * @parent_fd: File descriptor, preferably opened with ``O_PATH``,
+	 * which identifies the parent directory of a file hierarchy, or just a
+	 * file.
 	 */
 	__s32 parent_fd;
 	/*
diff --git a/security/landlock/syscalls.c b/security/landlock/syscalls.c
index 32396962f04d..fd4b24022a06 100644
--- a/security/landlock/syscalls.c
+++ b/security/landlock/syscalls.c
@@ -290,14 +290,13 @@ static int get_path_from_fd(const s32 fd, struct path *const path)
  *
  * - EOPNOTSUPP: Landlock is supported by the kernel but disabled at boot time;
  * - EINVAL: @flags is not 0, or inconsistent access in the rule (i.e.
- *   &landlock_path_beneath_attr.allowed_access is not a subset of the rule's
- *   accesses);
+ *   &landlock_path_beneath_attr.allowed_access is not a subset of the
+ *   ruleset handled accesses);
  * - ENOMSG: Empty accesses (e.g. &landlock_path_beneath_attr.allowed_access);
  * - EBADF: @ruleset_fd is not a file descriptor for the current thread, or a
  *   member of @rule_attr is not a file descriptor as expected;
  * - EBADFD: @ruleset_fd is not a ruleset file descriptor, or a member of
- *   @rule_attr is not the expected file descriptor type (e.g. file open
- *   without O_PATH);
+ *   @rule_attr is not the expected file descriptor type;
  * - EPERM: @ruleset_fd has no write access to the underlying ruleset;
  * - EFAULT: @rule_attr inconsistency.
  */
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v1 2/7] landlock: Fix landlock_add_rule(2) signature
  2022-02-21 15:53 [PATCH v1 0/7] Minor Landlock fixes and new tests Mickaël Salaün
  2022-02-21 15:53 ` [PATCH v1 1/7] landlock: Fix landlock_add_rule(2) documentation Mickaël Salaün
@ 2022-02-21 15:53 ` Mickaël Salaün
  2022-02-26 21:26   ` Alejandro Colomar (man-pages)
  2022-02-21 15:53 ` [PATCH v1 3/7] selftest/landlock: Make tests build with old libc Mickaël Salaün
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 10+ messages in thread
From: Mickaël Salaün @ 2022-02-21 15:53 UTC (permalink / raw)
  To: James Morris, Serge E . Hallyn
  Cc: Mickaël Salaün, Jann Horn, Kees Cook,
	Konstantin Meskhidze, Nathan Chancellor, Nick Desaulniers,
	Paul Moore, Shuah Khan, linux-api, linux-kernel,
	linux-security-module, Alejandro Colomar,
	Mickaël Salaün

From: Mickaël Salaün <mic@linux.microsoft.com>

Replace the enum landlock_rule_type with an int in the syscall signature
of landlock_add_rule to avoid an implementation-defined size.  In
practice an enum type is like an int (at least with GCC and clang), but
compilers may accept options (e.g. -fshort-enums) that would have an
impact on that [1].  This change is mostly a cosmetic fix according to
the current kernel compilers and used options.

Link: https://lore.kernel.org/r/8a22a3c2-468c-e96c-6516-22a0f029aa34@gmail.com/ [1]
Reported-by: Alejandro Colomar <alx.manpages@gmail.com>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Mickaël Salaün <mic@linux.microsoft.com>
Link: https://lore.kernel.org/r/20220221155311.166278-3-mic@digikod.net
---
 include/linux/syscalls.h     | 3 +--
 security/landlock/syscalls.c | 7 ++++---
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 819c0cb00b6d..a5956f91caf2 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -71,7 +71,6 @@ struct clone_args;
 struct open_how;
 struct mount_attr;
 struct landlock_ruleset_attr;
-enum landlock_rule_type;
 
 #include <linux/types.h>
 #include <linux/aio_abi.h>
@@ -1053,7 +1052,7 @@ asmlinkage long sys_pidfd_send_signal(int pidfd, int sig,
 asmlinkage long sys_pidfd_getfd(int pidfd, int fd, unsigned int flags);
 asmlinkage long sys_landlock_create_ruleset(const struct landlock_ruleset_attr __user *attr,
 		size_t size, __u32 flags);
-asmlinkage long sys_landlock_add_rule(int ruleset_fd, enum landlock_rule_type rule_type,
+asmlinkage long sys_landlock_add_rule(int ruleset_fd, int rule_type,
 		const void __user *rule_attr, __u32 flags);
 asmlinkage long sys_landlock_restrict_self(int ruleset_fd, __u32 flags);
 asmlinkage long sys_memfd_secret(unsigned int flags);
diff --git a/security/landlock/syscalls.c b/security/landlock/syscalls.c
index fd4b24022a06..3b40fc5d0216 100644
--- a/security/landlock/syscalls.c
+++ b/security/landlock/syscalls.c
@@ -277,8 +277,9 @@ static int get_path_from_fd(const s32 fd, struct path *const path)
  *
  * @ruleset_fd: File descriptor tied to the ruleset that should be extended
  *		with the new rule.
- * @rule_type: Identify the structure type pointed to by @rule_attr (only
- *             LANDLOCK_RULE_PATH_BENEATH for now).
+ * @rule_type: Identify the structure type pointed to by @rule_attr as defined
+ *             by enum landlock_rule_type (only LANDLOCK_RULE_PATH_BENEATH for
+ *             now).
  * @rule_attr: Pointer to a rule (only of type &struct
  *             landlock_path_beneath_attr for now).
  * @flags: Must be 0.
@@ -301,7 +302,7 @@ static int get_path_from_fd(const s32 fd, struct path *const path)
  * - EFAULT: @rule_attr inconsistency.
  */
 SYSCALL_DEFINE4(landlock_add_rule,
-		const int, ruleset_fd, const enum landlock_rule_type, rule_type,
+		const int, ruleset_fd, const int, rule_type,
 		const void __user *const, rule_attr, const __u32, flags)
 {
 	struct landlock_path_beneath_attr path_beneath_attr;
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v1 3/7] selftest/landlock: Make tests build with old libc
  2022-02-21 15:53 [PATCH v1 0/7] Minor Landlock fixes and new tests Mickaël Salaün
  2022-02-21 15:53 ` [PATCH v1 1/7] landlock: Fix landlock_add_rule(2) documentation Mickaël Salaün
  2022-02-21 15:53 ` [PATCH v1 2/7] landlock: Fix landlock_add_rule(2) signature Mickaël Salaün
@ 2022-02-21 15:53 ` Mickaël Salaün
  2022-02-21 15:53 ` [PATCH v1 4/7] selftest/landlock: Extend tests for minimal valid attribute size Mickaël Salaün
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Mickaël Salaün @ 2022-02-21 15:53 UTC (permalink / raw)
  To: James Morris, Serge E . Hallyn
  Cc: Mickaël Salaün, Jann Horn, Kees Cook,
	Konstantin Meskhidze, Nathan Chancellor, Nick Desaulniers,
	Paul Moore, Shuah Khan, linux-api, linux-kernel,
	linux-security-module, Mickaël Salaün

From: Mickaël Salaün <mic@linux.microsoft.com>

Replace SYS_<syscall> with __NR_<syscall>.  Using the __NR_<syscall>
notation, provided by UAPI, is useful to build tests on systems without
the SYS_<syscall> definitions.

Replace SYS_pivot_root with __NR_pivot_root, and SYS_move_mount with
__NR_move_mount.

Define renameat2() and RENAME_EXCHANGE if they are unknown to old build
systems.

Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Mickaël Salaün <mic@linux.microsoft.com>
Link: https://lore.kernel.org/r/20220221155311.166278-4-mic@digikod.net
---
 tools/testing/selftests/landlock/fs_test.c | 23 +++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/tools/testing/selftests/landlock/fs_test.c b/tools/testing/selftests/landlock/fs_test.c
index 10c9a1e4ebd9..699cda25a12a 100644
--- a/tools/testing/selftests/landlock/fs_test.c
+++ b/tools/testing/selftests/landlock/fs_test.c
@@ -22,6 +22,19 @@
 
 #include "common.h"
 
+#ifndef renameat2
+int renameat2(int olddirfd, const char *oldpath, int newdirfd,
+		const char *newpath, unsigned int flags)
+{
+	return syscall(__NR_renameat2, olddirfd, oldpath, newdirfd, newpath,
+			flags);
+}
+#endif
+
+#ifndef RENAME_EXCHANGE
+#define RENAME_EXCHANGE		(1 << 1)
+#endif
+
 #define TMP_DIR		"tmp"
 #define BINARY_PATH	"./true"
 
@@ -1249,7 +1262,7 @@ TEST_F_FORK(layout1, rule_inside_mount_ns)
 	int ruleset_fd;
 
 	set_cap(_metadata, CAP_SYS_ADMIN);
-	ASSERT_EQ(0, syscall(SYS_pivot_root, dir_s3d2, dir_s3d3)) {
+	ASSERT_EQ(0, syscall(__NR_pivot_root, dir_s3d2, dir_s3d3)) {
 		TH_LOG("Failed to pivot root: %s", strerror(errno));
 	};
 	ASSERT_EQ(0, chdir("/"));
@@ -1282,7 +1295,7 @@ TEST_F_FORK(layout1, mount_and_pivot)
 	set_cap(_metadata, CAP_SYS_ADMIN);
 	ASSERT_EQ(-1, mount(NULL, dir_s3d2, NULL, MS_RDONLY, NULL));
 	ASSERT_EQ(EPERM, errno);
-	ASSERT_EQ(-1, syscall(SYS_pivot_root, dir_s3d2, dir_s3d3));
+	ASSERT_EQ(-1, syscall(__NR_pivot_root, dir_s3d2, dir_s3d3));
 	ASSERT_EQ(EPERM, errno);
 	clear_cap(_metadata, CAP_SYS_ADMIN);
 }
@@ -1301,12 +1314,12 @@ TEST_F_FORK(layout1, move_mount)
 	ASSERT_LE(0, ruleset_fd);
 
 	set_cap(_metadata, CAP_SYS_ADMIN);
-	ASSERT_EQ(0, syscall(SYS_move_mount, AT_FDCWD, dir_s3d2, AT_FDCWD,
+	ASSERT_EQ(0, syscall(__NR_move_mount, AT_FDCWD, dir_s3d2, AT_FDCWD,
 				dir_s1d2, 0)) {
 		TH_LOG("Failed to move mount: %s", strerror(errno));
 	}
 
-	ASSERT_EQ(0, syscall(SYS_move_mount, AT_FDCWD, dir_s1d2, AT_FDCWD,
+	ASSERT_EQ(0, syscall(__NR_move_mount, AT_FDCWD, dir_s1d2, AT_FDCWD,
 				dir_s3d2, 0));
 	clear_cap(_metadata, CAP_SYS_ADMIN);
 
@@ -1314,7 +1327,7 @@ TEST_F_FORK(layout1, move_mount)
 	ASSERT_EQ(0, close(ruleset_fd));
 
 	set_cap(_metadata, CAP_SYS_ADMIN);
-	ASSERT_EQ(-1, syscall(SYS_move_mount, AT_FDCWD, dir_s3d2, AT_FDCWD,
+	ASSERT_EQ(-1, syscall(__NR_move_mount, AT_FDCWD, dir_s3d2, AT_FDCWD,
 				dir_s1d2, 0));
 	ASSERT_EQ(EPERM, errno);
 	clear_cap(_metadata, CAP_SYS_ADMIN);
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v1 4/7] selftest/landlock: Extend tests for minimal valid attribute size
  2022-02-21 15:53 [PATCH v1 0/7] Minor Landlock fixes and new tests Mickaël Salaün
                   ` (2 preceding siblings ...)
  2022-02-21 15:53 ` [PATCH v1 3/7] selftest/landlock: Make tests build with old libc Mickaël Salaün
@ 2022-02-21 15:53 ` Mickaël Salaün
  2022-02-21 15:53 ` [PATCH v1 5/7] selftest/landlock: Add tests for unknown access rights Mickaël Salaün
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Mickaël Salaün @ 2022-02-21 15:53 UTC (permalink / raw)
  To: James Morris, Serge E . Hallyn
  Cc: Mickaël Salaün, Jann Horn, Kees Cook,
	Konstantin Meskhidze, Nathan Chancellor, Nick Desaulniers,
	Paul Moore, Shuah Khan, linux-api, linux-kernel,
	linux-security-module, Mickaël Salaün

From: Mickaël Salaün <mic@linux.microsoft.com>

This might be useful when the struct landlock_ruleset_attr will get more
fields.

Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Mickaël Salaün <mic@linux.microsoft.com>
Link: https://lore.kernel.org/r/20220221155311.166278-5-mic@digikod.net
---
 tools/testing/selftests/landlock/base_test.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/tools/testing/selftests/landlock/base_test.c b/tools/testing/selftests/landlock/base_test.c
index ca40abe9daa8..38fa1e0dfa33 100644
--- a/tools/testing/selftests/landlock/base_test.c
+++ b/tools/testing/selftests/landlock/base_test.c
@@ -34,6 +34,8 @@ TEST(inconsistent_attr) {
 	ASSERT_EQ(EINVAL, errno);
 	ASSERT_EQ(-1, landlock_create_ruleset(ruleset_attr, 1, 0));
 	ASSERT_EQ(EINVAL, errno);
+	ASSERT_EQ(-1, landlock_create_ruleset(ruleset_attr, 7, 0));
+	ASSERT_EQ(EINVAL, errno);
 
 	ASSERT_EQ(-1, landlock_create_ruleset(NULL, 1, 0));
 	/* The size if less than sizeof(struct landlock_attr_enforce). */
@@ -46,6 +48,9 @@ TEST(inconsistent_attr) {
 	ASSERT_EQ(-1, landlock_create_ruleset(ruleset_attr, page_size + 1, 0));
 	ASSERT_EQ(E2BIG, errno);
 
+	/* Checks minimal valid attribute size. */
+	ASSERT_EQ(-1, landlock_create_ruleset(ruleset_attr, 8, 0));
+	ASSERT_EQ(ENOMSG, errno);
 	ASSERT_EQ(-1, landlock_create_ruleset(ruleset_attr,
 				sizeof(struct landlock_ruleset_attr), 0));
 	ASSERT_EQ(ENOMSG, errno);
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v1 5/7] selftest/landlock: Add tests for unknown access rights
  2022-02-21 15:53 [PATCH v1 0/7] Minor Landlock fixes and new tests Mickaël Salaün
                   ` (3 preceding siblings ...)
  2022-02-21 15:53 ` [PATCH v1 4/7] selftest/landlock: Extend tests for minimal valid attribute size Mickaël Salaün
@ 2022-02-21 15:53 ` Mickaël Salaün
  2022-02-21 15:53 ` [PATCH v1 6/7] selftest/landlock: Extend access right tests to directories Mickaël Salaün
  2022-02-21 15:53 ` [PATCH v1 7/7] selftest/landlock: Fully test file rename with "remove" access Mickaël Salaün
  6 siblings, 0 replies; 10+ messages in thread
From: Mickaël Salaün @ 2022-02-21 15:53 UTC (permalink / raw)
  To: James Morris, Serge E . Hallyn
  Cc: Mickaël Salaün, Jann Horn, Kees Cook,
	Konstantin Meskhidze, Nathan Chancellor, Nick Desaulniers,
	Paul Moore, Shuah Khan, linux-api, linux-kernel,
	linux-security-module, Mickaël Salaün

From: Mickaël Salaün <mic@linux.microsoft.com>

Make sure that trying to use unknown access rights returns an error.

Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Mickaël Salaün <mic@linux.microsoft.com>
Link: https://lore.kernel.org/r/20220221155311.166278-6-mic@digikod.net
---
 tools/testing/selftests/landlock/fs_test.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/tools/testing/selftests/landlock/fs_test.c b/tools/testing/selftests/landlock/fs_test.c
index 699cda25a12a..5506472a46ce 100644
--- a/tools/testing/selftests/landlock/fs_test.c
+++ b/tools/testing/selftests/landlock/fs_test.c
@@ -439,6 +439,22 @@ TEST_F_FORK(layout1, file_access_rights)
 	ASSERT_EQ(0, close(path_beneath.parent_fd));
 }
 
+TEST_F_FORK(layout1, unknown_access_rights)
+{
+	__u64 access_mask;
+
+	for (access_mask = 1ULL << 63; access_mask != ACCESS_LAST;
+			access_mask >>= 1) {
+		struct landlock_ruleset_attr ruleset_attr = {
+			.handled_access_fs = access_mask,
+		};
+
+		ASSERT_EQ(-1, landlock_create_ruleset(&ruleset_attr,
+					sizeof(ruleset_attr), 0));
+		ASSERT_EQ(EINVAL, errno);
+	}
+}
+
 static void add_path_beneath(struct __test_metadata *const _metadata,
 		const int ruleset_fd, const __u64 allowed_access,
 		const char *const path)
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v1 6/7] selftest/landlock: Extend access right tests to directories
  2022-02-21 15:53 [PATCH v1 0/7] Minor Landlock fixes and new tests Mickaël Salaün
                   ` (4 preceding siblings ...)
  2022-02-21 15:53 ` [PATCH v1 5/7] selftest/landlock: Add tests for unknown access rights Mickaël Salaün
@ 2022-02-21 15:53 ` Mickaël Salaün
  2022-02-21 15:53 ` [PATCH v1 7/7] selftest/landlock: Fully test file rename with "remove" access Mickaël Salaün
  6 siblings, 0 replies; 10+ messages in thread
From: Mickaël Salaün @ 2022-02-21 15:53 UTC (permalink / raw)
  To: James Morris, Serge E . Hallyn
  Cc: Mickaël Salaün, Jann Horn, Kees Cook,
	Konstantin Meskhidze, Nathan Chancellor, Nick Desaulniers,
	Paul Moore, Shuah Khan, linux-api, linux-kernel,
	linux-security-module, Mickaël Salaün

From: Mickaël Salaün <mic@linux.microsoft.com>

Make sure that all filesystem access rights can be tied to directories.

Rename layout1/file_access_rights to layout1/file_and_dir_access_rights
to reflect this change.

Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Mickaël Salaün <mic@linux.microsoft.com>
Link: https://lore.kernel.org/r/20220221155311.166278-7-mic@digikod.net
---
 tools/testing/selftests/landlock/fs_test.c | 29 ++++++++++++++++------
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/tools/testing/selftests/landlock/fs_test.c b/tools/testing/selftests/landlock/fs_test.c
index 5506472a46ce..3736253c9582 100644
--- a/tools/testing/selftests/landlock/fs_test.c
+++ b/tools/testing/selftests/landlock/fs_test.c
@@ -409,11 +409,12 @@ TEST_F_FORK(layout1, inval)
 	LANDLOCK_ACCESS_FS_MAKE_BLOCK | \
 	ACCESS_LAST)
 
-TEST_F_FORK(layout1, file_access_rights)
+TEST_F_FORK(layout1, file_and_dir_access_rights)
 {
 	__u64 access;
 	int err;
-	struct landlock_path_beneath_attr path_beneath = {};
+	struct landlock_path_beneath_attr path_beneath_file = {},
+					  path_beneath_dir = {};
 	struct landlock_ruleset_attr ruleset_attr = {
 		.handled_access_fs = ACCESS_ALL,
 	};
@@ -423,20 +424,32 @@ TEST_F_FORK(layout1, file_access_rights)
 	ASSERT_LE(0, ruleset_fd);
 
 	/* Tests access rights for files. */
-	path_beneath.parent_fd = open(file1_s1d2, O_PATH | O_CLOEXEC);
-	ASSERT_LE(0, path_beneath.parent_fd);
+	path_beneath_file.parent_fd = open(file1_s1d2, O_PATH | O_CLOEXEC);
+	ASSERT_LE(0, path_beneath_file.parent_fd);
+
+	/* Tests access rights for directories. */
+	path_beneath_dir.parent_fd = open(dir_s1d2, O_PATH | O_DIRECTORY |
+			O_CLOEXEC);
+	ASSERT_LE(0, path_beneath_dir.parent_fd);
+
 	for (access = 1; access <= ACCESS_LAST; access <<= 1) {
-		path_beneath.allowed_access = access;
+		path_beneath_dir.allowed_access = access;
+		ASSERT_EQ(0, landlock_add_rule(ruleset_fd, LANDLOCK_RULE_PATH_BENEATH,
+				&path_beneath_dir, 0));
+
+		path_beneath_file.allowed_access = access;
 		err = landlock_add_rule(ruleset_fd, LANDLOCK_RULE_PATH_BENEATH,
-				&path_beneath, 0);
-		if ((access | ACCESS_FILE) == ACCESS_FILE) {
+				&path_beneath_file, 0);
+		if (access & ACCESS_FILE) {
 			ASSERT_EQ(0, err);
 		} else {
 			ASSERT_EQ(-1, err);
 			ASSERT_EQ(EINVAL, errno);
 		}
 	}
-	ASSERT_EQ(0, close(path_beneath.parent_fd));
+	ASSERT_EQ(0, close(path_beneath_file.parent_fd));
+	ASSERT_EQ(0, close(path_beneath_dir.parent_fd));
+	ASSERT_EQ(0, close(ruleset_fd));
 }
 
 TEST_F_FORK(layout1, unknown_access_rights)
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v1 7/7] selftest/landlock: Fully test file rename with "remove" access
  2022-02-21 15:53 [PATCH v1 0/7] Minor Landlock fixes and new tests Mickaël Salaün
                   ` (5 preceding siblings ...)
  2022-02-21 15:53 ` [PATCH v1 6/7] selftest/landlock: Extend access right tests to directories Mickaël Salaün
@ 2022-02-21 15:53 ` Mickaël Salaün
  6 siblings, 0 replies; 10+ messages in thread
From: Mickaël Salaün @ 2022-02-21 15:53 UTC (permalink / raw)
  To: James Morris, Serge E . Hallyn
  Cc: Mickaël Salaün, Jann Horn, Kees Cook,
	Konstantin Meskhidze, Nathan Chancellor, Nick Desaulniers,
	Paul Moore, Shuah Khan, linux-api, linux-kernel,
	linux-security-module, Mickaël Salaün

From: Mickaël Salaün <mic@linux.microsoft.com>

These tests were missing to check the check_access_path() call with all
combinations of maybe_remove(old_dentry) and maybe_remove(new_dentry).

Extend layout1/link with a new complementary test.

Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Mickaël Salaün <mic@linux.microsoft.com>
Link: https://lore.kernel.org/r/20220221155311.166278-8-mic@digikod.net
---
 tools/testing/selftests/landlock/fs_test.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/landlock/fs_test.c b/tools/testing/selftests/landlock/fs_test.c
index 3736253c9582..62b88406419d 100644
--- a/tools/testing/selftests/landlock/fs_test.c
+++ b/tools/testing/selftests/landlock/fs_test.c
@@ -1640,11 +1640,14 @@ TEST_F_FORK(layout1, link)
 
 	ASSERT_EQ(-1, link(file2_s1d1, file1_s1d1));
 	ASSERT_EQ(EACCES, errno);
+
 	/* Denies linking because of reparenting. */
 	ASSERT_EQ(-1, link(file1_s2d1, file1_s1d2));
 	ASSERT_EQ(EXDEV, errno);
 	ASSERT_EQ(-1, link(file2_s1d2, file1_s1d3));
 	ASSERT_EQ(EXDEV, errno);
+	ASSERT_EQ(-1, link(file2_s1d3, file1_s1d2));
+	ASSERT_EQ(EXDEV, errno);
 
 	ASSERT_EQ(0, link(file2_s1d2, file1_s1d2));
 	ASSERT_EQ(0, link(file2_s1d3, file1_s1d3));
@@ -1668,7 +1671,6 @@ TEST_F_FORK(layout1, rename_file)
 
 	ASSERT_LE(0, ruleset_fd);
 
-	ASSERT_EQ(0, unlink(file1_s1d1));
 	ASSERT_EQ(0, unlink(file1_s1d2));
 
 	enforce_ruleset(_metadata, ruleset_fd);
@@ -1704,9 +1706,15 @@ TEST_F_FORK(layout1, rename_file)
 	ASSERT_EQ(-1, renameat2(AT_FDCWD, dir_s2d2, AT_FDCWD, file1_s2d1,
 				RENAME_EXCHANGE));
 	ASSERT_EQ(EACCES, errno);
+	/* Checks that file1_s2d1 cannot be removed (instead of ENOTDIR). */
+	ASSERT_EQ(-1, rename(dir_s2d2, file1_s2d1));
+	ASSERT_EQ(EACCES, errno);
 	ASSERT_EQ(-1, renameat2(AT_FDCWD, file1_s2d1, AT_FDCWD, dir_s2d2,
 				RENAME_EXCHANGE));
 	ASSERT_EQ(EACCES, errno);
+	/* Checks that file1_s1d1 cannot be removed (instead of EISDIR). */
+	ASSERT_EQ(-1, rename(file1_s1d1, dir_s1d2));
+	ASSERT_EQ(EACCES, errno);
 
 	/* Renames files with different parents. */
 	ASSERT_EQ(-1, rename(file1_s2d2, file1_s1d2));
@@ -1769,9 +1777,15 @@ TEST_F_FORK(layout1, rename_dir)
 	ASSERT_EQ(-1, renameat2(AT_FDCWD, dir_s1d1, AT_FDCWD, dir_s2d1,
 				RENAME_EXCHANGE));
 	ASSERT_EQ(EACCES, errno);
+	/* Checks that dir_s1d2 cannot be removed (instead of ENOTDIR). */
+	ASSERT_EQ(-1, rename(dir_s1d2, file1_s1d1));
+	ASSERT_EQ(EACCES, errno);
 	ASSERT_EQ(-1, renameat2(AT_FDCWD, file1_s1d1, AT_FDCWD, dir_s1d2,
 				RENAME_EXCHANGE));
 	ASSERT_EQ(EACCES, errno);
+	/* Checks that dir_s1d2 cannot be removed (instead of EISDIR). */
+	ASSERT_EQ(-1, rename(file1_s1d1, dir_s1d2));
+	ASSERT_EQ(EACCES, errno);
 
 	/*
 	 * Exchanges and renames directory to the same parent, which allows
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v1 2/7] landlock: Fix landlock_add_rule(2) signature
  2022-02-21 15:53 ` [PATCH v1 2/7] landlock: Fix landlock_add_rule(2) signature Mickaël Salaün
@ 2022-02-26 21:26   ` Alejandro Colomar (man-pages)
  2022-02-28  7:59     ` Mickaël Salaün
  0 siblings, 1 reply; 10+ messages in thread
From: Alejandro Colomar (man-pages) @ 2022-02-26 21:26 UTC (permalink / raw)
  To: Mickaël Salaün, James Morris, Serge E . Hallyn
  Cc: Jann Horn, Kees Cook, Konstantin Meskhidze, Nathan Chancellor,
	Nick Desaulniers, Paul Moore, Shuah Khan, linux-api,
	linux-kernel, linux-security-module, Mickaël Salaün

Hi Mickaël,

On 21/2/22 16:53, Mickaël Salaün wrote:
> From: Mickaël Salaün <mic@linux.microsoft.com>
> 
> Replace the enum landlock_rule_type with an int in the syscall signature
> of landlock_add_rule to avoid an implementation-defined size.  In
> practice an enum type is like an int (at least with GCC and clang), but
> compilers may accept options (e.g. -fshort-enums) that would have an
> impact on that [1].  This change is mostly a cosmetic fix according to
> the current kernel compilers and used options.

There are two proposals for C2x that might bring C++ syntax to C for 
enums, i.e., being able to specify the underlying type of an enum.

See:
<http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2904.htm>
<http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2908.htm>

Since the current kernel is safe from that enum problem, it may be 
better to wait and see what the standard decides to do with enum.  I 
guess they'll add this feature sooner or later.

Regards,
Alex

> 
> Link: https://lore.kernel.org/r/8a22a3c2-468c-e96c-6516-22a0f029aa34@gmail.com/ [1]
> Reported-by: Alejandro Colomar <alx.manpages@gmail.com>
> Cc: Nathan Chancellor <nathan@kernel.org>
> Cc: Nick Desaulniers <ndesaulniers@google.com>
> Signed-off-by: Mickaël Salaün <mic@linux.microsoft.com>
> Link: https://lore.kernel.org/r/20220221155311.166278-3-mic@digikod.net
> ---
>   include/linux/syscalls.h     | 3 +--
>   security/landlock/syscalls.c | 7 ++++---
>   2 files changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
> index 819c0cb00b6d..a5956f91caf2 100644
> --- a/include/linux/syscalls.h
> +++ b/include/linux/syscalls.h
> @@ -71,7 +71,6 @@ struct clone_args;
>   struct open_how;
>   struct mount_attr;
>   struct landlock_ruleset_attr;
> -enum landlock_rule_type;
>   
>   #include <linux/types.h>
>   #include <linux/aio_abi.h>
> @@ -1053,7 +1052,7 @@ asmlinkage long sys_pidfd_send_signal(int pidfd, int sig,
>   asmlinkage long sys_pidfd_getfd(int pidfd, int fd, unsigned int flags);
>   asmlinkage long sys_landlock_create_ruleset(const struct landlock_ruleset_attr __user *attr,
>   		size_t size, __u32 flags);
> -asmlinkage long sys_landlock_add_rule(int ruleset_fd, enum landlock_rule_type rule_type,
> +asmlinkage long sys_landlock_add_rule(int ruleset_fd, int rule_type,
>   		const void __user *rule_attr, __u32 flags);
>   asmlinkage long sys_landlock_restrict_self(int ruleset_fd, __u32 flags);
>   asmlinkage long sys_memfd_secret(unsigned int flags);
> diff --git a/security/landlock/syscalls.c b/security/landlock/syscalls.c
> index fd4b24022a06..3b40fc5d0216 100644
> --- a/security/landlock/syscalls.c
> +++ b/security/landlock/syscalls.c
> @@ -277,8 +277,9 @@ static int get_path_from_fd(const s32 fd, struct path *const path)
>    *
>    * @ruleset_fd: File descriptor tied to the ruleset that should be extended
>    *		with the new rule.
> - * @rule_type: Identify the structure type pointed to by @rule_attr (only
> - *             LANDLOCK_RULE_PATH_BENEATH for now).
> + * @rule_type: Identify the structure type pointed to by @rule_attr as defined
> + *             by enum landlock_rule_type (only LANDLOCK_RULE_PATH_BENEATH for
> + *             now).
>    * @rule_attr: Pointer to a rule (only of type &struct
>    *             landlock_path_beneath_attr for now).
>    * @flags: Must be 0.
> @@ -301,7 +302,7 @@ static int get_path_from_fd(const s32 fd, struct path *const path)
>    * - EFAULT: @rule_attr inconsistency.
>    */
>   SYSCALL_DEFINE4(landlock_add_rule,
> -		const int, ruleset_fd, const enum landlock_rule_type, rule_type,
> +		const int, ruleset_fd, const int, rule_type,
>   		const void __user *const, rule_attr, const __u32, flags)
>   {
>   	struct landlock_path_beneath_attr path_beneath_attr;


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v1 2/7] landlock: Fix landlock_add_rule(2) signature
  2022-02-26 21:26   ` Alejandro Colomar (man-pages)
@ 2022-02-28  7:59     ` Mickaël Salaün
  0 siblings, 0 replies; 10+ messages in thread
From: Mickaël Salaün @ 2022-02-28  7:59 UTC (permalink / raw)
  To: Alejandro Colomar (man-pages), James Morris, Serge E . Hallyn
  Cc: Jann Horn, Kees Cook, Konstantin Meskhidze, Nathan Chancellor,
	Nick Desaulniers, Paul Moore, Shuah Khan, linux-api,
	linux-kernel, linux-security-module, Mickaël Salaün


On 26/02/2022 22:26, Alejandro Colomar (man-pages) wrote:
> Hi Mickaël,
> 
> On 21/2/22 16:53, Mickaël Salaün wrote:
>> From: Mickaël Salaün <mic@linux.microsoft.com>
>>
>> Replace the enum landlock_rule_type with an int in the syscall signature
>> of landlock_add_rule to avoid an implementation-defined size.  In
>> practice an enum type is like an int (at least with GCC and clang), but
>> compilers may accept options (e.g. -fshort-enums) that would have an
>> impact on that [1].  This change is mostly a cosmetic fix according to
>> the current kernel compilers and used options.
> 
> There are two proposals for C2x that might bring C++ syntax to C for 
> enums, i.e., being able to specify the underlying type of an enum.
> 
> See:
> <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2904.htm>
> <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2908.htm>
> 
> Since the current kernel is safe from that enum problem, it may be 
> better to wait and see what the standard decides to do with enum.  I 
> guess they'll add this feature sooner or later.

Ok, interesting, I'll remove this patch then. I'd be curious to know 
when this will impact Linux though.

Thanks!

> 
> Regards,
> Alex
> 
>>
>> Link: 
>> https://lore.kernel.org/r/8a22a3c2-468c-e96c-6516-22a0f029aa34@gmail.com/ 
>> [1]
>> Reported-by: Alejandro Colomar <alx.manpages@gmail.com>
>> Cc: Nathan Chancellor <nathan@kernel.org>
>> Cc: Nick Desaulniers <ndesaulniers@google.com>
>> Signed-off-by: Mickaël Salaün <mic@linux.microsoft.com>
>> Link: https://lore.kernel.org/r/20220221155311.166278-3-mic@digikod.net
>> ---
>>   include/linux/syscalls.h     | 3 +--
>>   security/landlock/syscalls.c | 7 ++++---
>>   2 files changed, 5 insertions(+), 5 deletions(-)
>>
>> diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
>> index 819c0cb00b6d..a5956f91caf2 100644
>> --- a/include/linux/syscalls.h
>> +++ b/include/linux/syscalls.h
>> @@ -71,7 +71,6 @@ struct clone_args;
>>   struct open_how;
>>   struct mount_attr;
>>   struct landlock_ruleset_attr;
>> -enum landlock_rule_type;
>>   #include <linux/types.h>
>>   #include <linux/aio_abi.h>
>> @@ -1053,7 +1052,7 @@ asmlinkage long sys_pidfd_send_signal(int pidfd, 
>> int sig,
>>   asmlinkage long sys_pidfd_getfd(int pidfd, int fd, unsigned int flags);
>>   asmlinkage long sys_landlock_create_ruleset(const struct 
>> landlock_ruleset_attr __user *attr,
>>           size_t size, __u32 flags);
>> -asmlinkage long sys_landlock_add_rule(int ruleset_fd, enum 
>> landlock_rule_type rule_type,
>> +asmlinkage long sys_landlock_add_rule(int ruleset_fd, int rule_type,
>>           const void __user *rule_attr, __u32 flags);
>>   asmlinkage long sys_landlock_restrict_self(int ruleset_fd, __u32 
>> flags);
>>   asmlinkage long sys_memfd_secret(unsigned int flags);
>> diff --git a/security/landlock/syscalls.c b/security/landlock/syscalls.c
>> index fd4b24022a06..3b40fc5d0216 100644
>> --- a/security/landlock/syscalls.c
>> +++ b/security/landlock/syscalls.c
>> @@ -277,8 +277,9 @@ static int get_path_from_fd(const s32 fd, struct 
>> path *const path)
>>    *
>>    * @ruleset_fd: File descriptor tied to the ruleset that should be 
>> extended
>>    *        with the new rule.
>> - * @rule_type: Identify the structure type pointed to by @rule_attr 
>> (only
>> - *             LANDLOCK_RULE_PATH_BENEATH for now).
>> + * @rule_type: Identify the structure type pointed to by @rule_attr 
>> as defined
>> + *             by enum landlock_rule_type (only 
>> LANDLOCK_RULE_PATH_BENEATH for
>> + *             now).
>>    * @rule_attr: Pointer to a rule (only of type &struct
>>    *             landlock_path_beneath_attr for now).
>>    * @flags: Must be 0.
>> @@ -301,7 +302,7 @@ static int get_path_from_fd(const s32 fd, struct 
>> path *const path)
>>    * - EFAULT: @rule_attr inconsistency.
>>    */
>>   SYSCALL_DEFINE4(landlock_add_rule,
>> -        const int, ruleset_fd, const enum landlock_rule_type, rule_type,
>> +        const int, ruleset_fd, const int, rule_type,
>>           const void __user *const, rule_attr, const __u32, flags)
>>   {
>>       struct landlock_path_beneath_attr path_beneath_attr;
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2022-02-28  7:59 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-21 15:53 [PATCH v1 0/7] Minor Landlock fixes and new tests Mickaël Salaün
2022-02-21 15:53 ` [PATCH v1 1/7] landlock: Fix landlock_add_rule(2) documentation Mickaël Salaün
2022-02-21 15:53 ` [PATCH v1 2/7] landlock: Fix landlock_add_rule(2) signature Mickaël Salaün
2022-02-26 21:26   ` Alejandro Colomar (man-pages)
2022-02-28  7:59     ` Mickaël Salaün
2022-02-21 15:53 ` [PATCH v1 3/7] selftest/landlock: Make tests build with old libc Mickaël Salaün
2022-02-21 15:53 ` [PATCH v1 4/7] selftest/landlock: Extend tests for minimal valid attribute size Mickaël Salaün
2022-02-21 15:53 ` [PATCH v1 5/7] selftest/landlock: Add tests for unknown access rights Mickaël Salaün
2022-02-21 15:53 ` [PATCH v1 6/7] selftest/landlock: Extend access right tests to directories Mickaël Salaün
2022-02-21 15:53 ` [PATCH v1 7/7] selftest/landlock: Fully test file rename with "remove" access Mickaël Salaün

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).