From: "Mickaël Salaün" <mic@digikod.net>
To: "Günther Noack" <gnoack@google.com>
Cc: linux-security-module@vger.kernel.org,
Jeff Xu <jeffxu@google.com>, Arnd Bergmann <arnd@arndb.de>,
Jorge Lucangeli Obes <jorgelo@chromium.org>,
Allen Webb <allenwebb@google.com>,
Dmitry Torokhov <dtor@google.com>,
Paul Moore <paul@paul-moore.com>,
Konstantin Meskhidze <konstantin.meskhidze@huawei.com>,
Matt Bobrowski <repnop@google.com>,
linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH v14 03/12] selftests/landlock: Test IOCTL support
Date: Fri, 12 Apr 2024 17:17:44 +0200 [thread overview]
Message-ID: <20240412.ooteCh1thee0@digikod.net> (raw)
In-Reply-To: <20240405214040.101396-4-gnoack@google.com>
On Fri, Apr 05, 2024 at 09:40:31PM +0000, Günther Noack wrote:
> Exercises Landlock's IOCTL feature in different combinations of
> handling and permitting the LANDLOCK_ACCESS_FS_IOCTL_DEV right, and in
> different combinations of using files and directories.
>
> Signed-off-by: Günther Noack <gnoack@google.com>
> ---
> tools/testing/selftests/landlock/fs_test.c | 227 ++++++++++++++++++++-
> 1 file changed, 224 insertions(+), 3 deletions(-)
>
> diff --git a/tools/testing/selftests/landlock/fs_test.c b/tools/testing/selftests/landlock/fs_test.c
> index 418ad745a5dd..8a72e26d4977 100644
> --- a/tools/testing/selftests/landlock/fs_test.c
> +++ b/tools/testing/selftests/landlock/fs_test.c
> +TEST_F_FORK(ioctl, handle_dir_access_file)
> +{
> + const int flag = 0;
> + const struct rule rules[] = {
> + {
> + .path = "/dev",
> + .access = variant->allowed,
> + },
> + {},
> + };
> + int file_fd, ruleset_fd;
> +
> + /* Enables Landlock. */
> + ruleset_fd = create_ruleset(_metadata, variant->handled, rules);
> + ASSERT_LE(0, ruleset_fd);
> + enforce_ruleset(_metadata, ruleset_fd);
> + ASSERT_EQ(0, close(ruleset_fd));
> +
> + file_fd = open("/dev/tty", variant->open_mode);
Why /dev/tty? Could we use /dev/null or something less tied to the
current context and less sensitive?
> + ASSERT_LE(0, file_fd);
> +
> + /* Checks that IOCTL commands return the expected errors. */
> + EXPECT_EQ(variant->expected_tcgets_result, test_tcgets_ioctl(file_fd));
> + EXPECT_EQ(variant->expected_fionread_result,
> + test_fionread_ioctl(file_fd));
> +
> + /* Checks that unrestrictable commands are unrestricted. */
> + EXPECT_EQ(0, ioctl(file_fd, FIOCLEX));
> + EXPECT_EQ(0, ioctl(file_fd, FIONCLEX));
> + EXPECT_EQ(0, ioctl(file_fd, FIONBIO, &flag));
> + EXPECT_EQ(0, ioctl(file_fd, FIOASYNC, &flag));
> + EXPECT_EQ(0, ioctl(file_fd, FIGETBSZ, &flag));
> +
> + ASSERT_EQ(0, close(file_fd));
> +}
> +
> +TEST_F_FORK(ioctl, handle_dir_access_dir)
> +{
> + const int flag = 0;
> + const struct rule rules[] = {
> + {
> + .path = "/dev",
> + .access = variant->allowed,
> + },
> + {},
> + };
> + int dir_fd, ruleset_fd;
> +
> + /* Enables Landlock. */
> + ruleset_fd = create_ruleset(_metadata, variant->handled, rules);
> + ASSERT_LE(0, ruleset_fd);
> + enforce_ruleset(_metadata, ruleset_fd);
> + ASSERT_EQ(0, close(ruleset_fd));
> +
> + /*
> + * Ignore variant->open_mode for this test, as we intend to open a
> + * directory. If the directory can not be opened, the variant is
> + * infeasible to test with an opened directory.
> + */
> + dir_fd = open("/dev", O_RDONLY);
> + if (dir_fd < 0)
> + return;
> +
> + /*
> + * Checks that IOCTL commands return the expected errors.
> + * We do not use the expected values from the fixture here.
> + *
> + * When using IOCTL on a directory, no Landlock restrictions apply.
> + * TCGETS will fail anyway because it is not invoked on a TTY device.
> + */
> + EXPECT_EQ(ENOTTY, test_tcgets_ioctl(dir_fd));
> + EXPECT_EQ(0, test_fionread_ioctl(dir_fd));
> +
> + /* Checks that unrestrictable commands are unrestricted. */
> + EXPECT_EQ(0, ioctl(dir_fd, FIOCLEX));
> + EXPECT_EQ(0, ioctl(dir_fd, FIONCLEX));
> + EXPECT_EQ(0, ioctl(dir_fd, FIONBIO, &flag));
> + EXPECT_EQ(0, ioctl(dir_fd, FIOASYNC, &flag));
> + EXPECT_EQ(0, ioctl(dir_fd, FIGETBSZ, &flag));
> +
> + ASSERT_EQ(0, close(dir_fd));
> +}
> +
> +TEST_F_FORK(ioctl, handle_file_access_file)
> +{
> + const int flag = 0;
> + const struct rule rules[] = {
> + {
> + .path = "/dev/tty0",
Same here (and elsewhere), /dev/null or a similar harmless device file
would be better.
> + .access = variant->allowed,
> + },
> + {},
> + };
> + int file_fd, ruleset_fd;
> +
> + if (variant->allowed & LANDLOCK_ACCESS_FS_READ_DIR) {
> + SKIP(return, "LANDLOCK_ACCESS_FS_READ_DIR "
> + "can not be granted on files");
Can we avoid using SKIP() in this case? Tests should only be skipped
when not supported, in other words, we should be able to run all tests
with the right combination of architecture and kernel options.
> + }
> +
> + /* Enables Landlock. */
> + ruleset_fd = create_ruleset(_metadata, variant->handled, rules);
> + ASSERT_LE(0, ruleset_fd);
> + enforce_ruleset(_metadata, ruleset_fd);
> + ASSERT_EQ(0, close(ruleset_fd));
> +
> + file_fd = open("/dev/tty0", variant->open_mode);
> + ASSERT_LE(0, file_fd)
> + {
> + TH_LOG("Failed to open /dev/tty0: %s", strerror(errno));
> + }
> +
> + /* Checks that IOCTL commands return the expected errors. */
> + EXPECT_EQ(variant->expected_tcgets_result, test_tcgets_ioctl(file_fd));
> + EXPECT_EQ(variant->expected_fionread_result,
> + test_fionread_ioctl(file_fd));
> +
> + /* Checks that unrestrictable commands are unrestricted. */
> + EXPECT_EQ(0, ioctl(file_fd, FIOCLEX));
> + EXPECT_EQ(0, ioctl(file_fd, FIONCLEX));
> + EXPECT_EQ(0, ioctl(file_fd, FIONBIO, &flag));
> + EXPECT_EQ(0, ioctl(file_fd, FIOASYNC, &flag));
> + EXPECT_EQ(0, ioctl(file_fd, FIGETBSZ, &flag));
> +
> + ASSERT_EQ(0, close(file_fd));
> +}
> +
> /* clang-format off */
> FIXTURE(layout1_bind) {};
> /* clang-format on */
> --
> 2.44.0.478.gd926399ef9-goog
>
>
next prev parent reply other threads:[~2024-04-12 15:17 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-05 21:40 [PATCH v14 00/12] Landlock: IOCTL support Günther Noack
2024-04-05 21:40 ` [PATCH v14 01/12] fs: Return ENOTTY directly if FS_IOC_GETUUID or FS_IOC_GETFSSYSFSPATH fail Günther Noack
2024-04-05 21:54 ` Kent Overstreet
2024-04-09 10:08 ` (subset) " Christian Brauner
2024-04-09 12:11 ` Mickaël Salaün
2024-04-12 15:17 ` Mickaël Salaün
2024-04-05 21:40 ` [PATCH v14 02/12] landlock: Add IOCTL access right for character and block devices Günther Noack
2024-04-12 15:16 ` Mickaël Salaün
2024-04-18 9:28 ` Günther Noack
2024-04-19 5:43 ` Mickaël Salaün
2024-04-05 21:40 ` [PATCH v14 03/12] selftests/landlock: Test IOCTL support Günther Noack
2024-04-12 15:17 ` Mickaël Salaün [this message]
2024-04-18 11:10 ` Günther Noack
2024-04-19 5:44 ` Mickaël Salaün
2024-04-19 14:06 ` Günther Noack
2024-04-05 21:40 ` [PATCH v14 04/12] selftests/landlock: Test IOCTL with memfds Günther Noack
2024-04-05 21:40 ` [PATCH v14 05/12] selftests/landlock: Test ioctl(2) and ftruncate(2) with open(O_PATH) Günther Noack
2024-04-05 21:40 ` [PATCH v14 06/12] selftests/landlock: Test IOCTLs on named pipes Günther Noack
2024-04-05 21:40 ` [PATCH v14 07/12] selftests/landlock: Check IOCTL restrictions for named UNIX domain sockets Günther Noack
2024-04-12 15:17 ` Mickaël Salaün
2024-04-18 11:24 ` Günther Noack
2024-04-05 21:40 ` [PATCH v14 08/12] selftests/landlock: Exhaustive test for the IOCTL allow-list Günther Noack
2024-04-12 15:18 ` Mickaël Salaün
2024-04-18 12:21 ` Günther Noack
2024-04-19 5:44 ` Mickaël Salaün
2024-04-19 14:49 ` Günther Noack
2024-04-05 21:40 ` [PATCH v14 09/12] samples/landlock: Add support for LANDLOCK_ACCESS_FS_IOCTL_DEV Günther Noack
2024-04-05 21:40 ` [PATCH v14 10/12] landlock: Document IOCTL support Günther Noack
2024-04-05 21:40 ` [PATCH v14 11/12] MAINTAINERS: Notify Landlock maintainers about changes to fs/ioctl.c Günther Noack
2024-04-05 21:40 ` [PATCH v14 12/12] fs/ioctl: Add a comment to keep the logic in sync with LSM policies Günther Noack
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240412.ooteCh1thee0@digikod.net \
--to=mic@digikod.net \
--cc=allenwebb@google.com \
--cc=arnd@arndb.de \
--cc=dtor@google.com \
--cc=gnoack@google.com \
--cc=jeffxu@google.com \
--cc=jorgelo@chromium.org \
--cc=konstantin.meskhidze@huawei.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=paul@paul-moore.com \
--cc=repnop@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).