brintos

brintos / linux-shallow public Read only

0
0
Text · 2.0 KiB · 1bc6241 Raw
103 lines · c
1// SPDX-License-Identifier: GPL-2.02#define _GNU_SOURCE3#include <test_progs.h>4#include "test_deny_namespace.skel.h"5#include <sched.h>6#include "cap_helpers.h"7#include <stdio.h>8 9static int wait_for_pid(pid_t pid)10{11	int status, ret;12 13again:14	ret = waitpid(pid, &status, 0);15	if (ret == -1) {16		if (errno == EINTR)17			goto again;18 19		return -1;20	}21 22	if (!WIFEXITED(status))23		return -1;24 25	return WEXITSTATUS(status);26}27 28/* negative return value -> some internal error29 * positive return value -> userns creation failed30 * 0                     -> userns creation succeeded31 */32static int create_user_ns(void)33{34	pid_t pid;35 36	pid = fork();37	if (pid < 0)38		return -1;39 40	if (pid == 0) {41		if (unshare(CLONE_NEWUSER))42			_exit(EXIT_FAILURE);43		_exit(EXIT_SUCCESS);44	}45 46	return wait_for_pid(pid);47}48 49static void test_userns_create_bpf(void)50{51	__u32 cap_mask = 1ULL << CAP_SYS_ADMIN;52	__u64 old_caps = 0;53 54	cap_enable_effective(cap_mask, &old_caps);55 56	ASSERT_OK(create_user_ns(), "priv new user ns");57 58	cap_disable_effective(cap_mask, &old_caps);59 60	ASSERT_EQ(create_user_ns(), EPERM, "unpriv new user ns");61 62	if (cap_mask & old_caps)63		cap_enable_effective(cap_mask, NULL);64}65 66static void test_unpriv_userns_create_no_bpf(void)67{68	__u32 cap_mask = 1ULL << CAP_SYS_ADMIN;69	__u64 old_caps = 0;70 71	cap_disable_effective(cap_mask, &old_caps);72 73	ASSERT_OK(create_user_ns(), "no-bpf unpriv new user ns");74 75	if (cap_mask & old_caps)76		cap_enable_effective(cap_mask, NULL);77}78 79void test_deny_namespace(void)80{81	struct test_deny_namespace *skel = NULL;82	int err;83 84	if (test__start_subtest("unpriv_userns_create_no_bpf"))85		test_unpriv_userns_create_no_bpf();86 87	skel = test_deny_namespace__open_and_load();88	if (!ASSERT_OK_PTR(skel, "skel load"))89		goto close_prog;90 91	err = test_deny_namespace__attach(skel);92	if (!ASSERT_OK(err, "attach"))93		goto close_prog;94 95	if (test__start_subtest("userns_create_bpf"))96		test_userns_create_bpf();97 98	test_deny_namespace__detach(skel);99 100close_prog:101	test_deny_namespace__destroy(skel);102}103