35
35
* See https://sourceware.org/glibc/wiki/Synchronizing_Headers.
36
36
*/
37
37
#include <linux/fs.h>
38
+ #include <linux/mount.h>
38
39
39
40
#include "common.h"
40
41
@@ -47,6 +48,13 @@ int renameat2(int olddirfd, const char *oldpath, int newdirfd,
47
48
}
48
49
#endif
49
50
51
+ #ifndef open_tree
52
+ int open_tree (int dfd , const char * filename , unsigned int flags )
53
+ {
54
+ return syscall (__NR_open_tree , dfd , filename , flags );
55
+ }
56
+ #endif
57
+
50
58
#ifndef RENAME_EXCHANGE
51
59
#define RENAME_EXCHANGE (1 << 1)
52
60
#endif
@@ -2400,6 +2408,43 @@ TEST_F_FORK(layout1, refer_denied_by_default4)
2400
2408
layer_dir_s1d1_refer );
2401
2409
}
2402
2410
2411
+ /*
2412
+ * Tests walking through a denied root mount.
2413
+ */
2414
+ TEST_F_FORK (layout1 , refer_mount_root_deny )
2415
+ {
2416
+ const struct landlock_ruleset_attr ruleset_attr = {
2417
+ .handled_access_fs = LANDLOCK_ACCESS_FS_MAKE_DIR ,
2418
+ };
2419
+ int root_fd , ruleset_fd ;
2420
+
2421
+ /* Creates a mount object from a non-mount point. */
2422
+ set_cap (_metadata , CAP_SYS_ADMIN );
2423
+ root_fd =
2424
+ open_tree (AT_FDCWD , dir_s1d1 ,
2425
+ AT_EMPTY_PATH | OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC );
2426
+ clear_cap (_metadata , CAP_SYS_ADMIN );
2427
+ ASSERT_LE (0 , root_fd );
2428
+
2429
+ ruleset_fd =
2430
+ landlock_create_ruleset (& ruleset_attr , sizeof (ruleset_attr ), 0 );
2431
+ ASSERT_LE (0 , ruleset_fd );
2432
+
2433
+ ASSERT_EQ (0 , prctl (PR_SET_NO_NEW_PRIVS , 1 , 0 , 0 , 0 ));
2434
+ ASSERT_EQ (0 , landlock_restrict_self (ruleset_fd , 0 ));
2435
+ EXPECT_EQ (0 , close (ruleset_fd ));
2436
+
2437
+ /* Link denied by Landlock: EACCES. */
2438
+ EXPECT_EQ (-1 , linkat (root_fd , "." , root_fd , "does_not_exist" , 0 ));
2439
+ EXPECT_EQ (EACCES , errno );
2440
+
2441
+ /* renameat2() always returns EBUSY. */
2442
+ EXPECT_EQ (-1 , renameat2 (root_fd , "." , root_fd , "does_not_exist" , 0 ));
2443
+ EXPECT_EQ (EBUSY , errno );
2444
+
2445
+ EXPECT_EQ (0 , close (root_fd ));
2446
+ }
2447
+
2403
2448
TEST_F_FORK (layout1 , reparent_link )
2404
2449
{
2405
2450
const struct rule layer1 [] = {
0 commit comments