Skip to content

Commit

Permalink
Add landlock07 test
Browse files Browse the repository at this point in the history
This test is a reproducer for the CVE-2024-42318 bug, also known as
landlock Houdini.

More information at:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-42318

Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
  • Loading branch information
acerv committed Aug 21, 2024
1 parent f4f8adc commit dc8e343
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 0 deletions.
1 change: 1 addition & 0 deletions runtest/syscalls
Original file line number Diff line number Diff line change
Expand Up @@ -706,6 +706,7 @@ landlock03 landlock03
landlock04 landlock04
landlock05 landlock05
landlock06 landlock06
landlock07 landlock07

lchown01 lchown01
lchown01_16 lchown01_16
Expand Down
1 change: 1 addition & 0 deletions testcases/kernel/syscalls/landlock/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ landlock03
landlock04
landlock05
landlock06
landlock07
109 changes: 109 additions & 0 deletions testcases/kernel/syscalls/landlock/landlock07.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
*/

/**
* [Description]
*
* CVE-2024-42318
*
* Test to check if system is affected by Landlock Houdini bug:
* https://www.suse.com/security/cve/CVE-2024-42318.html
*
* Kernel bug fixed in:
*
* commit 39705a6c29f8a2b93cf5b99528a55366c50014d1
* Author: Jann Horn <jannh@google.com>
* Date: Wed Jul 24 14:49:01 2024 +0200
*
* landlock: Don't lose track of restrictions on cred_transfer
*/

#include "tst_test.h"
#include "lapi/prctl.h"
#include "lapi/keyctl.h"
#include "tst_test_macros.h"
#include "landlock_common.h"

static struct landlock_ruleset_attr *ruleset_attr;
static int ruleset_fd;

static pid_t spawn_houdini(void)
{
pid_t pid;

SAFE_KEYCTL(KEYCTL_JOIN_SESSION_KEYRING, 0, 0, 0, 0);

pid = SAFE_FORK();
if (!pid) {
SAFE_KEYCTL(KEYCTL_JOIN_SESSION_KEYRING, 0, 0, 0, 0);
SAFE_KEYCTL(KEYCTL_SESSION_TO_PARENT, 0, 0, 0, 0);
exit(0);
}

return pid;
}

static void run(void)
{
pid_t pid_houdini;

if (SAFE_FORK())
return;

SAFE_PRCTL(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
SAFE_LANDLOCK_RESTRICT_SELF(ruleset_fd, 0);

TST_EXP_FAIL(open("/dev/null", O_WRONLY), EACCES);
if (TST_RET != -1) {
SAFE_CLOSE(TST_RET);
return;
}

pid_houdini = spawn_houdini();
SAFE_WAITPID(pid_houdini, NULL, 0);

TST_EXP_FAIL(open("/dev/null", O_WRONLY), EACCES);
if (TST_RET != -1)
SAFE_CLOSE(TST_RET);

exit(0);
}

static void setup(void)
{
verify_landlock_is_enabled();

ruleset_attr->handled_access_fs = LANDLOCK_ACCESS_FS_WRITE_FILE;
ruleset_fd = SAFE_LANDLOCK_CREATE_RULESET(
ruleset_attr,
sizeof(struct landlock_ruleset_attr),
0);
}

static void cleanup(void)
{
if (ruleset_fd != -1)
SAFE_CLOSE(ruleset_fd);
}

static struct tst_test test = {
.test_all = run,
.setup = setup,
.cleanup = cleanup,
.forks_child = 1,
.bufs = (struct tst_buffers []) {
{&ruleset_attr, .size = sizeof(struct landlock_ruleset_attr)},
{},
},
.caps = (struct tst_cap []) {
TST_CAP(TST_CAP_REQ, CAP_SYS_ADMIN),
{}
},
.tags = (const struct tst_tag[]) {
{"linux-git", "39705a6c29f8"},
{"CVE", "2024-42318"},
{}
}
};

0 comments on commit dc8e343

Please sign in to comment.