xref: /linux/security/landlock/log.h (revision 67f8bc848ee31831336bd478e57d2f993551902e)
1e761a88cSMickaël Salaün /* SPDX-License-Identifier: GPL-2.0-only */
2e761a88cSMickaël Salaün /*
3e761a88cSMickaël Salaün  * Landlock - Log helpers
4e761a88cSMickaël Salaün  *
5e761a88cSMickaël Salaün  * Copyright © 2023-2025 Microsoft Corporation
6*bb91730fSMickaël Salaün  * Copyright © 2026 Cloudflare, Inc.
7e761a88cSMickaël Salaün  */
8e761a88cSMickaël Salaün 
9e761a88cSMickaël Salaün #ifndef _SECURITY_LANDLOCK_LOG_H
10e761a88cSMickaël Salaün #define _SECURITY_LANDLOCK_LOG_H
11e761a88cSMickaël Salaün 
12e761a88cSMickaël Salaün #include <linux/lsm_audit.h>
13e761a88cSMickaël Salaün 
14e761a88cSMickaël Salaün #include "access.h"
15e761a88cSMickaël Salaün 
16e761a88cSMickaël Salaün struct landlock_cred_security;
17e761a88cSMickaël Salaün struct landlock_hierarchy;
18e761a88cSMickaël Salaün 
19e761a88cSMickaël Salaün enum landlock_request_type {
20e761a88cSMickaël Salaün 	LANDLOCK_REQUEST_PTRACE = 1,
21e761a88cSMickaël Salaün 	LANDLOCK_REQUEST_FS_CHANGE_TOPOLOGY,
22e761a88cSMickaël Salaün 	LANDLOCK_REQUEST_FS_ACCESS,
23e761a88cSMickaël Salaün 	LANDLOCK_REQUEST_NET_ACCESS,
24e761a88cSMickaël Salaün 	LANDLOCK_REQUEST_SCOPE_ABSTRACT_UNIX_SOCKET,
25e761a88cSMickaël Salaün 	LANDLOCK_REQUEST_SCOPE_SIGNAL,
26e761a88cSMickaël Salaün };
27e761a88cSMickaël Salaün 
28e761a88cSMickaël Salaün /*
29e761a88cSMickaël Salaün  * We should be careful to only use a variable of this type for
30e761a88cSMickaël Salaün  * landlock_log_denial().  This way, the compiler can remove it entirely if
31e761a88cSMickaël Salaün  * CONFIG_SECURITY_LANDLOCK_LOG is not set.
32e761a88cSMickaël Salaün  */
33e761a88cSMickaël Salaün struct landlock_request {
34e761a88cSMickaël Salaün 	/* Mandatory fields. */
35e761a88cSMickaël Salaün 	enum landlock_request_type type;
36e761a88cSMickaël Salaün 	struct common_audit_data audit;
37e761a88cSMickaël Salaün 
38e761a88cSMickaël Salaün 	/**
39e761a88cSMickaël Salaün 	 * layer_plus_one: First layer level that denies the request + 1.  The
40e761a88cSMickaël Salaün 	 * extra one is useful to detect uninitialized field.
41e761a88cSMickaël Salaün 	 */
42e761a88cSMickaël Salaün 	size_t layer_plus_one;
43e761a88cSMickaël Salaün 
44e761a88cSMickaël Salaün 	/* Required field for configurable access control. */
45e761a88cSMickaël Salaün 	access_mask_t access;
46e761a88cSMickaël Salaün 
47e761a88cSMickaël Salaün 	/* Required fields for requests with layer masks. */
48e761a88cSMickaël Salaün 	const struct layer_masks *layer_masks;
49e761a88cSMickaël Salaün 
50e761a88cSMickaël Salaün 	/* Required fields for requests with deny masks. */
51e761a88cSMickaël Salaün 	const access_mask_t all_existing_optional_access;
52e761a88cSMickaël Salaün 	deny_masks_t deny_masks;
53e761a88cSMickaël Salaün 	optional_access_t quiet_optional_accesses;
54*bb91730fSMickaël Salaün 
55*bb91730fSMickaël Salaün 	/*
56*bb91730fSMickaël Salaün 	 * Other-party domain ID for a relational (scope/ptrace) denial, or 0 if
57*bb91730fSMickaël Salaün 	 * that party is unsandboxed.  An ID, not a pointer: the other task can
58*bb91730fSMickaël Salaün 	 * replace its credential and free the domain it referenced.  Trace path
59*bb91730fSMickaël Salaün 	 * only; audit ignores it.
60*bb91730fSMickaël Salaün 	 */
61*bb91730fSMickaël Salaün 	u64 other_domain_id;
62e761a88cSMickaël Salaün };
63e761a88cSMickaël Salaün 
64e761a88cSMickaël Salaün #ifdef CONFIG_SECURITY_LANDLOCK_LOG
65e761a88cSMickaël Salaün 
66e761a88cSMickaël Salaün void landlock_log_free_domain(const struct landlock_hierarchy *const hierarchy);
67e761a88cSMickaël Salaün 
68e761a88cSMickaël Salaün void landlock_log_denial(const struct landlock_cred_security *const subject,
69e761a88cSMickaël Salaün 			 const struct landlock_request *const request);
70e761a88cSMickaël Salaün 
71e761a88cSMickaël Salaün #else /* CONFIG_SECURITY_LANDLOCK_LOG */
72e761a88cSMickaël Salaün 
73e761a88cSMickaël Salaün static inline void
74e761a88cSMickaël Salaün landlock_log_free_domain(const struct landlock_hierarchy *const hierarchy)
75e761a88cSMickaël Salaün {
76e761a88cSMickaël Salaün }
77e761a88cSMickaël Salaün 
78e761a88cSMickaël Salaün static inline void
79e761a88cSMickaël Salaün landlock_log_denial(const struct landlock_cred_security *const subject,
80e761a88cSMickaël Salaün 		    const struct landlock_request *const request)
81e761a88cSMickaël Salaün {
82e761a88cSMickaël Salaün }
83e761a88cSMickaël Salaün 
84e761a88cSMickaël Salaün #endif /* CONFIG_SECURITY_LANDLOCK_LOG */
85e761a88cSMickaël Salaün 
86e761a88cSMickaël Salaün #endif /* _SECURITY_LANDLOCK_LOG_H */
87