Skip to content

Commit

Permalink
selftests: cgroup: Test open-time credential usage for migration checks
Browse files Browse the repository at this point in the history
When a task is writing to an fd opened by a different task, the perm check
should use the credentials of the latter task. Add a test for it.

Tested-by: Michal Koutný <[email protected]>
Signed-off-by: Tejun Heo <[email protected]>
  • Loading branch information
htejun committed Jan 6, 2022
1 parent b09c2ba commit 613e040
Showing 1 changed file with 68 additions and 0 deletions.
68 changes: 68 additions & 0 deletions tools/testing/selftests/cgroup/test_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -674,6 +674,73 @@ static int test_cgcore_thread_migration(const char *root)
return ret;
}

/*
* cgroup migration permission check should be performed based on the
* credentials at the time of open instead of write.
*/
static int test_cgcore_lesser_euid_open(const char *root)
{
const uid_t test_euid = 65534; /* usually nobody, any !root is fine */
int ret = KSFT_FAIL;
char *cg_test_a = NULL, *cg_test_b = NULL;
char *cg_test_a_procs = NULL, *cg_test_b_procs = NULL;
int cg_test_b_procs_fd = -1;
uid_t saved_uid;

cg_test_a = cg_name(root, "cg_test_a");
cg_test_b = cg_name(root, "cg_test_b");

if (!cg_test_a || !cg_test_b)
goto cleanup;

cg_test_a_procs = cg_name(cg_test_a, "cgroup.procs");
cg_test_b_procs = cg_name(cg_test_b, "cgroup.procs");

if (!cg_test_a_procs || !cg_test_b_procs)
goto cleanup;

if (cg_create(cg_test_a) || cg_create(cg_test_b))
goto cleanup;

if (cg_enter_current(cg_test_a))
goto cleanup;

if (chown(cg_test_a_procs, test_euid, -1) ||
chown(cg_test_b_procs, test_euid, -1))
goto cleanup;

saved_uid = geteuid();
if (seteuid(test_euid))
goto cleanup;

cg_test_b_procs_fd = open(cg_test_b_procs, O_RDWR);

if (seteuid(saved_uid))
goto cleanup;

if (cg_test_b_procs_fd < 0)
goto cleanup;

if (write(cg_test_b_procs_fd, "0", 1) >= 0 || errno != EACCES)
goto cleanup;

ret = KSFT_PASS;

cleanup:
cg_enter_current(root);
if (cg_test_b_procs_fd >= 0)
close(cg_test_b_procs_fd);
if (cg_test_b)
cg_destroy(cg_test_b);
if (cg_test_a)
cg_destroy(cg_test_a);
free(cg_test_b_procs);
free(cg_test_a_procs);
free(cg_test_b);
free(cg_test_a);
return ret;
}

#define T(x) { x, #x }
struct corecg_test {
int (*fn)(const char *root);
Expand All @@ -689,6 +756,7 @@ struct corecg_test {
T(test_cgcore_proc_migration),
T(test_cgcore_thread_migration),
T(test_cgcore_destroy),
T(test_cgcore_lesser_euid_open),
};
#undef T

Expand Down

0 comments on commit 613e040

Please sign in to comment.