Skip to content

Commit 1d5073c

Browse files
committed
selftests/landlock: Add tests for quiet flag with scope
Enhance scoped_audit.connect_to_child and audit_flags.signal to test interaction with various quiet flag settings. Signed-off-by: Tingmao Wang <[email protected]>
1 parent 2400b0c commit 1d5073c

File tree

2 files changed

+87
-15
lines changed

2 files changed

+87
-15
lines changed

tools/testing/selftests/landlock/audit_test.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -289,30 +289,42 @@ FIXTURE(audit_flags)
289289
FIXTURE_VARIANT(audit_flags)
290290
{
291291
const int restrict_flags;
292+
const __u64 quiet_scoped;
292293
};
293294

294295
/* clang-format off */
295296
FIXTURE_VARIANT_ADD(audit_flags, default) {
296297
/* clang-format on */
297298
.restrict_flags = 0,
299+
.quiet_scoped = 0,
298300
};
299301

300302
/* clang-format off */
301303
FIXTURE_VARIANT_ADD(audit_flags, same_exec_off) {
302304
/* clang-format on */
303305
.restrict_flags = LANDLOCK_RESTRICT_SELF_LOG_SAME_EXEC_OFF,
306+
.quiet_scoped = 0,
304307
};
305308

306309
/* clang-format off */
307310
FIXTURE_VARIANT_ADD(audit_flags, subdomains_off) {
308311
/* clang-format on */
309312
.restrict_flags = LANDLOCK_RESTRICT_SELF_LOG_SUBDOMAINS_OFF,
313+
.quiet_scoped = 0,
310314
};
311315

312316
/* clang-format off */
313317
FIXTURE_VARIANT_ADD(audit_flags, cross_exec_on) {
314318
/* clang-format on */
315319
.restrict_flags = LANDLOCK_RESTRICT_SELF_LOG_NEW_EXEC_ON,
320+
.quiet_scoped = 0,
321+
};
322+
323+
/* clang-format off */
324+
FIXTURE_VARIANT_ADD(audit_flags, signal_quieted) {
325+
/* clang-format on */
326+
.restrict_flags = 0,
327+
.quiet_scoped = LANDLOCK_SCOPE_SIGNAL,
316328
};
317329

318330
FIXTURE_SETUP(audit_flags)
@@ -356,12 +368,16 @@ TEST_F(audit_flags, signal)
356368
pid_t child;
357369
struct audit_records records;
358370
__u64 deallocated_dom = 2;
371+
bool expect_audit = !(variant->restrict_flags &
372+
LANDLOCK_RESTRICT_SELF_LOG_SAME_EXEC_OFF) &&
373+
!(variant->quiet_scoped & LANDLOCK_SCOPE_SIGNAL);
359374

360375
child = fork();
361376
ASSERT_LE(0, child);
362377
if (child == 0) {
363378
const struct landlock_ruleset_attr ruleset_attr = {
364379
.scoped = LANDLOCK_SCOPE_SIGNAL,
380+
.quiet_scoped = variant->quiet_scoped,
365381
};
366382
int ruleset_fd;
367383

@@ -378,8 +394,7 @@ TEST_F(audit_flags, signal)
378394
EXPECT_EQ(-1, kill(getppid(), 0));
379395
EXPECT_EQ(EPERM, errno);
380396

381-
if (variant->restrict_flags &
382-
LANDLOCK_RESTRICT_SELF_LOG_SAME_EXEC_OFF) {
397+
if (!expect_audit) {
383398
EXPECT_EQ(-EAGAIN, matches_log_signal(
384399
_metadata, self->audit_fd,
385400
getppid(), self->domain_id));
@@ -406,8 +421,7 @@ TEST_F(audit_flags, signal)
406421

407422
/* Makes sure there is no superfluous logged records. */
408423
EXPECT_EQ(0, audit_count_records(self->audit_fd, &records));
409-
if (variant->restrict_flags &
410-
LANDLOCK_RESTRICT_SELF_LOG_SAME_EXEC_OFF) {
424+
if (!expect_audit) {
411425
EXPECT_EQ(0, records.access);
412426
} else {
413427
EXPECT_EQ(1, records.access);
@@ -431,8 +445,7 @@ TEST_F(audit_flags, signal)
431445
WEXITSTATUS(status) != EXIT_SUCCESS)
432446
_metadata->exit_code = KSFT_FAIL;
433447

434-
if (variant->restrict_flags &
435-
LANDLOCK_RESTRICT_SELF_LOG_SAME_EXEC_OFF) {
448+
if (!expect_audit) {
436449
EXPECT_EQ(-EAGAIN,
437450
matches_log_domain_deallocated(self->audit_fd, 0,
438451
&deallocated_dom));

tools/testing/selftests/landlock/scoped_abstract_unix_test.c

Lines changed: 68 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,45 @@ FIXTURE_TEARDOWN_PARENT(scoped_audit)
293293
EXPECT_EQ(0, audit_cleanup(-1, NULL));
294294
}
295295

296+
FIXTURE_VARIANT(scoped_audit)
297+
{
298+
const __u64 scoped;
299+
const __u64 quiet_scoped;
300+
};
301+
302+
// clang-format off
303+
FIXTURE_VARIANT_ADD(scoped_audit, no_quiet)
304+
{
305+
// clang-format on
306+
.scoped = LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET,
307+
.quiet_scoped = 0,
308+
};
309+
310+
// clang-format off
311+
FIXTURE_VARIANT_ADD(scoped_audit, quiet_abstract_socket)
312+
{
313+
// clang-format on
314+
.scoped = LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET,
315+
.quiet_scoped = LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET,
316+
};
317+
318+
// clang-format off
319+
FIXTURE_VARIANT_ADD(scoped_audit, quiet_abstract_socket_2)
320+
{
321+
// clang-format on
322+
.scoped = LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET | LANDLOCK_SCOPE_SIGNAL,
323+
.quiet_scoped = LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET |
324+
LANDLOCK_SCOPE_SIGNAL,
325+
};
326+
327+
// clang-format off
328+
FIXTURE_VARIANT_ADD(scoped_audit, quiet_unrelated)
329+
{
330+
// clang-format on
331+
.scoped = LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET | LANDLOCK_SCOPE_SIGNAL,
332+
.quiet_scoped = LANDLOCK_SCOPE_SIGNAL,
333+
};
334+
296335
/* python -c 'print(b"\0selftests-landlock-abstract-unix-".hex().upper())' */
297336
#define ABSTRACT_SOCKET_PATH_PREFIX \
298337
"0073656C6674657374732D6C616E646C6F636B2D61627374726163742D756E69782D"
@@ -308,6 +347,13 @@ TEST_F(scoped_audit, connect_to_child)
308347
char buf;
309348
int dgram_client;
310349
struct audit_records records;
350+
int ruleset_fd;
351+
const struct landlock_ruleset_attr ruleset_attr = {
352+
.scoped = variant->scoped,
353+
.quiet_scoped = variant->quiet_scoped,
354+
};
355+
bool should_audit =
356+
!(variant->quiet_scoped & LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET);
311357

312358
/* Makes sure there is no superfluous logged records. */
313359
EXPECT_EQ(0, audit_count_records(self->audit_fd, &records));
@@ -345,7 +391,14 @@ TEST_F(scoped_audit, connect_to_child)
345391
EXPECT_EQ(0, close(pipe_child[1]));
346392
EXPECT_EQ(0, close(pipe_parent[0]));
347393

348-
create_scoped_domain(_metadata, LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET);
394+
ruleset_fd =
395+
landlock_create_ruleset(&ruleset_attr, sizeof(ruleset_attr), 0);
396+
ASSERT_LE(0, ruleset_fd)
397+
{
398+
TH_LOG("Failed to create a ruleset: %s", strerror(errno));
399+
}
400+
enforce_ruleset(_metadata, ruleset_fd);
401+
EXPECT_EQ(0, close(ruleset_fd));
349402

350403
/* Signals that the parent is in a domain, if any. */
351404
ASSERT_EQ(1, write(pipe_parent[1], ".", 1));
@@ -360,14 +413,20 @@ TEST_F(scoped_audit, connect_to_child)
360413
EXPECT_EQ(-1, err_dgram);
361414
EXPECT_EQ(EPERM, errno);
362415

363-
EXPECT_EQ(
364-
0,
365-
audit_match_record(
366-
self->audit_fd, AUDIT_LANDLOCK_ACCESS,
367-
REGEX_LANDLOCK_PREFIX
368-
" blockers=scope\\.abstract_unix_socket path=" ABSTRACT_SOCKET_PATH_PREFIX
369-
"[0-9A-F]\\+$",
370-
NULL));
416+
if (should_audit) {
417+
EXPECT_EQ(
418+
0,
419+
audit_match_record(
420+
self->audit_fd, AUDIT_LANDLOCK_ACCESS,
421+
REGEX_LANDLOCK_PREFIX
422+
" blockers=scope\\.abstract_unix_socket path=" ABSTRACT_SOCKET_PATH_PREFIX
423+
"[0-9A-F]\\+$",
424+
NULL));
425+
}
426+
427+
/* No other logs */
428+
EXPECT_EQ(0, audit_count_records(self->audit_fd, &records));
429+
EXPECT_EQ(0, records.access);
371430

372431
ASSERT_EQ(1, write(pipe_parent[1], ".", 1));
373432
EXPECT_EQ(0, close(dgram_client));

0 commit comments

Comments
 (0)