selftests/landlock: Add layout1.refer_mount_root
Add tests to check error codes when linking or renaming a mount root directory. This previously triggered a kernel warning, but it is fixed with the previous commit. Cc: Günther Noack <gnoack@google.com> Cc: Paul Moore <paul@paul-moore.com> Link: https://lore.kernel.org/r/20240516181935.1645983-3-mic@digikod.net Signed-off-by: Mickaël Salaün <mic@digikod.net>
This commit is contained in:
parent
88da52ccd6
commit
0055f53aac
@ -35,6 +35,7 @@
|
||||
* See https://sourceware.org/glibc/wiki/Synchronizing_Headers.
|
||||
*/
|
||||
#include <linux/fs.h>
|
||||
#include <linux/mount.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
@ -47,6 +48,13 @@ int renameat2(int olddirfd, const char *oldpath, int newdirfd,
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef open_tree
|
||||
int open_tree(int dfd, const char *filename, unsigned int flags)
|
||||
{
|
||||
return syscall(__NR_open_tree, dfd, filename, flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef RENAME_EXCHANGE
|
||||
#define RENAME_EXCHANGE (1 << 1)
|
||||
#endif
|
||||
@ -2400,6 +2408,43 @@ TEST_F_FORK(layout1, refer_denied_by_default4)
|
||||
layer_dir_s1d1_refer);
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests walking through a denied root mount.
|
||||
*/
|
||||
TEST_F_FORK(layout1, refer_mount_root_deny)
|
||||
{
|
||||
const struct landlock_ruleset_attr ruleset_attr = {
|
||||
.handled_access_fs = LANDLOCK_ACCESS_FS_MAKE_DIR,
|
||||
};
|
||||
int root_fd, ruleset_fd;
|
||||
|
||||
/* Creates a mount object from a non-mount point. */
|
||||
set_cap(_metadata, CAP_SYS_ADMIN);
|
||||
root_fd =
|
||||
open_tree(AT_FDCWD, dir_s1d1,
|
||||
AT_EMPTY_PATH | OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
|
||||
clear_cap(_metadata, CAP_SYS_ADMIN);
|
||||
ASSERT_LE(0, root_fd);
|
||||
|
||||
ruleset_fd =
|
||||
landlock_create_ruleset(&ruleset_attr, sizeof(ruleset_attr), 0);
|
||||
ASSERT_LE(0, ruleset_fd);
|
||||
|
||||
ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0));
|
||||
ASSERT_EQ(0, landlock_restrict_self(ruleset_fd, 0));
|
||||
EXPECT_EQ(0, close(ruleset_fd));
|
||||
|
||||
/* Link denied by Landlock: EACCES. */
|
||||
EXPECT_EQ(-1, linkat(root_fd, ".", root_fd, "does_not_exist", 0));
|
||||
EXPECT_EQ(EACCES, errno);
|
||||
|
||||
/* renameat2() always returns EBUSY. */
|
||||
EXPECT_EQ(-1, renameat2(root_fd, ".", root_fd, "does_not_exist", 0));
|
||||
EXPECT_EQ(EBUSY, errno);
|
||||
|
||||
EXPECT_EQ(0, close(root_fd));
|
||||
}
|
||||
|
||||
TEST_F_FORK(layout1, reparent_link)
|
||||
{
|
||||
const struct rule layer1[] = {
|
||||
|
Loading…
Reference in New Issue
Block a user