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