1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright © 2025 Microsoft Corporation 4 * Copyright © 2026 Cloudflare, Inc. 5 */ 6 7 #undef TRACE_SYSTEM 8 #define TRACE_SYSTEM landlock 9 10 #if !defined(_TRACE_LANDLOCK_H) || defined(TRACE_HEADER_MULTI_READ) 11 #define _TRACE_LANDLOCK_H 12 13 #include <linux/landlock.h> 14 #include <linux/string.h> 15 #include <linux/string_helpers.h> 16 #include <linux/tracepoint.h> 17 #include <linux/trace_seq.h> 18 #include <net/af_unix.h> 19 20 struct dentry; 21 struct landlock_domain; 22 struct landlock_hierarchy; 23 struct landlock_rule; 24 struct landlock_ruleset; 25 struct path; 26 struct sock; 27 struct task_struct; 28 29 #ifdef CREATE_TRACE_POINTS 30 31 /* About 6 KiB, leaving about 2 KiB for sibling helpers and fixed fields. */ 32 #define TRACE_UNTRUSTED_STR_OUTPUT_SIZE \ 33 (TRACE_SEQ_BUFFER_SIZE - TRACE_SEQ_BUFFER_SIZE / 4) 34 35 /* 36 * A raw UTF-8 ellipsis (…) marks truncation and cannot collide with escaped 37 * input: ESCAPE_NAP renders every non-ASCII input byte in octal. 38 */ 39 #define TRACE_TRUNCATION_MARKER "\xe2\x80\xa6" 40 41 /* 42 * Escapes @len bytes of an untrusted string into the trace sequence @p so it 43 * cannot inject field separators or control characters into the ftrace text 44 * output, and can be unambiguously recovered. Called from the TP_printk() of 45 * the tracepoints that expose paths and process names. @len is passed by the 46 * caller (rather than derived with strlen()) so a name that is not 47 * NUL-terminated or carries embedded NUL bytes (an abstract socket name) is 48 * escaped in full instead of being truncated at the first NUL. 49 * 50 * Strings that exceed the output limit retain the largest complete escaped 51 * prefix followed by the truncation marker. 52 * 53 * Return: a pointer into @p's buffer, or NULL if @src is NULL or the fixed 54 * output reservation is unavailable. 55 */ 56 static inline const char * 57 __trace_print_untrusted_str(struct trace_seq *p, const char *src, size_t len) 58 { 59 const unsigned int escape_flags = ESCAPE_SPACE | ESCAPE_SPECIAL | 60 ESCAPE_NAP | ESCAPE_APPEND | 61 ESCAPE_OCTAL; 62 const size_t marker_len = sizeof(TRACE_TRUNCATION_MARKER) - 1; 63 size_t buf_size, prefix_len, prefix_size; 64 int escaped_size; 65 char *buf; 66 const char *ret; 67 68 buf_size = seq_buf_get_buf(&p->seq, &buf); 69 if (!src || buf_size < TRACE_UNTRUSTED_STR_OUTPUT_SIZE) 70 return NULL; 71 72 ret = trace_seq_buffer_ptr(p); 73 escaped_size = string_escape_mem(src, len, buf, 74 TRACE_UNTRUSTED_STR_OUTPUT_SIZE, 75 escape_flags, " ='\"\\"); 76 if (likely(escaped_size < TRACE_UNTRUSTED_STR_OUTPUT_SIZE)) { 77 seq_buf_commit(&p->seq, escaped_size); 78 trace_seq_putc(p, 0); 79 return ret; 80 } 81 82 prefix_len = 0; 83 prefix_size = 0; 84 while (prefix_len < len) { 85 const char *const src_char = src + prefix_len; 86 int char_size; 87 88 char_size = string_escape_mem(src_char, 1, NULL, 0, 89 escape_flags, " ='\"\\"); 90 if (char_size > TRACE_UNTRUSTED_STR_OUTPUT_SIZE - marker_len - 91 1 - prefix_size) 92 break; 93 prefix_size += char_size; 94 prefix_len++; 95 } 96 97 escaped_size = string_escape_mem(src, prefix_len, buf, prefix_size, 98 escape_flags, " ='\"\\"); 99 if (WARN_ON_ONCE(escaped_size != prefix_size)) 100 return NULL; 101 memcpy(buf + prefix_size, TRACE_TRUNCATION_MARKER, marker_len); 102 seq_buf_commit(&p->seq, prefix_size + marker_len); 103 trace_seq_putc(p, 0); 104 return ret; 105 } 106 107 /* 108 * Fills the dense per-domain-layer array layers (one access mask per layer, 109 * indexed by level - 1) from rule's sparse layer stack, keeping only the 110 * requested rights (access_request). Layers with no matching rule entry get 111 * a zero mask. Shared by the check_rule_fs and check_rule_net events. 112 * 113 * rule->layers is sorted by ascending level, with levels in the domain's 114 * [1, num_layers] range (see landlock_merge_ruleset()), so every entry maps 115 * to a slot. A leftover entry would be a malformed rule; the zero-filled 116 * slots keep the output and the array bounds safe regardless. 117 */ 118 static inline void 119 __trace_landlock_fill_layers(access_mask_t *const layers, 120 const size_t num_layers, 121 const struct landlock_rule *const rule, 122 const access_mask_t access_request) 123 { 124 size_t i = 0; 125 126 for (size_t level = 1; level <= num_layers; level++) { 127 access_mask_t grants = 0; 128 129 if (i < rule->num_layers && level == rule->layers[i].level) { 130 grants = rule->layers[i].access & access_request; 131 i++; 132 } 133 layers[level - 1] = grants; 134 } 135 136 /* A leftover entry means an out-of-range or unsorted rule level. */ 137 WARN_ON_ONCE(i < rule->num_layers); 138 } 139 140 /* 141 * Renders the dense per-domain-layer access array as symbolic flag names for 142 * the grants field: layers wrapped in "{}", flags within a layer joined by 143 * "|", layers separated by ",", an empty layer rendered as nothing. 144 * Open-codes the flag walk because trace_print_flags_seq() NUL-terminates per 145 * call and so cannot be chained into a single field. The shared names table 146 * covers every access right, so masked bits are always named. Returns the 147 * trace_seq position like __print_flags(). 148 */ 149 static inline const char *__trace_landlock_print_layers( 150 struct trace_seq *p, const access_mask_t *const layers, 151 const size_t num_layers, const struct trace_print_flags *const names, 152 const size_t names_size) 153 { 154 const char *const ret = trace_seq_buffer_ptr(p); 155 156 trace_seq_putc(p, '{'); 157 for (size_t i = 0; i < num_layers; i++) { 158 access_mask_t mask = layers[i]; 159 bool first = true; 160 161 if (i) 162 trace_seq_putc(p, ','); 163 for (size_t j = 0; mask && j < names_size; j++) { 164 if ((mask & names[j].mask) != names[j].mask) 165 continue; 166 if (!first) 167 trace_seq_putc(p, '|'); 168 trace_seq_puts(p, names[j].name); 169 mask &= ~names[j].mask; 170 first = false; 171 } 172 } 173 trace_seq_putc(p, '}'); 174 trace_seq_putc(p, 0); 175 return ret; 176 } 177 178 #endif /* CREATE_TRACE_POINTS */ 179 180 /* clang-format off */ 181 182 /* Maps a shared _LANDLOCK_*_NAMES entry to a __print_flags() pair. */ 183 #define _LANDLOCK_NAME_ENTRY(mask, name) { mask, name } 184 185 /** 186 * DOC: Landlock trace events 187 * 188 * These guarantees and constraints hold for every Landlock tracepoint. 189 * A new tracepoint must uphold them, and an eBPF consumer can rely on 190 * them. 191 * 192 * Decision context 193 * ~~~~~~~~~~~~~~~~ 194 * 195 * A denial event, together with the lifecycle events, exposes the full 196 * set of inputs the verdict consumed, so a consumer that tracked domain 197 * creation (landlock_create_ruleset, landlock_create_domain) can verify 198 * or reproduce the Landlock decision rather than merely observe it 199 * happened. In who/what/why terms: who is the denying domain (the domain 200 * field, always the subject that enforced the policy, never the current 201 * task), what is the operation and its object, and why is every other 202 * input the verdict weighed. 203 * 204 * Lifecycle consistency 205 * ~~~~~~~~~~~~~~~~~~~~~~ 206 * 207 * Lifecycle events are balanced: a creation event always has a matching 208 * deallocation event and vice versa, so an eBPF program can model object 209 * lifetimes from the trace stream without reconciliation logic. A creation 210 * event fires while the object is still private to the calling thread 211 * (landlock_create_ruleset fires before the ruleset's file descriptor is 212 * installed, so it cannot race a concurrent :manpage:`close(2)`); if fd 213 * installation later fails and the ruleset is freed, free_ruleset still 214 * fires, keeping the pair balanced. The domain pair (create_domain and 215 * free_domain) is balanced the same way: create_domain fires when the 216 * domain is created (under the ruleset lock, before thread-sync), and 217 * free_domain fires when it is freed. A rare thread-sync failure aborts 218 * the just-created domain, which then emits both events (its creation, then 219 * an immediate free). Denial events fire only for denials that actually 220 * happen. 221 * 222 * Pointer access 223 * ~~~~~~~~~~~~~~ 224 * 225 * All pointer arguments in TP_PROTO are guaranteed non-NULL by the 226 * caller, but pointers reached through them may still be NULL (e.g., 227 * hierarchy->parent at a root domain) and must be checked. eBPF programs 228 * read these pointers via BTF for richer introspection than the 229 * TP_STRUCT__entry fields, which serve TP_printk display only. 230 * 231 * Mutable object pointers are passed while the caller holds the object's 232 * lock, so TP_fast_assign and a BTF reader see the exact object the event 233 * reports, a snapshot no concurrent writer can change: add_rule holds the 234 * modified ruleset's lock, and create_domain holds the ruleset lock across 235 * the emission (before the thread-sync wait) so the inspected ruleset is 236 * the one merged into the domain. Objects immutable at the emission site 237 * (a domain after creation, a hierarchy at its last reference) need no 238 * lock. A few values that no held lock protects are a best-effort 239 * lockless snapshot instead: a task's comm, and the deny_access_net struct 240 * sock (whose network hook holds no socket lock), matching how the sched 241 * and signal trace events sample comm. 242 * 243 * Field encoding 244 * ~~~~~~~~~~~~~~ 245 * 246 * Fields that mirror the Landlock UAPI use the same C types and endianness 247 * (e.g. network ports are __u64 in host endianness, like 248 * landlock_net_port_attr.port). Per-event details, such as where a value 249 * is byte-swapped, live in the field's own kdoc. 250 * 251 * Rule-check fields 252 * ~~~~~~~~~~~~~~~~~ 253 * 254 * The check_rule events fire during an access check, once per matching 255 * rule, before the final allow-or-deny verdict. They share domain (the 256 * enforcing domain being evaluated), access_request (the access mask being 257 * checked), and rule (the matching rule, with per-layer access masks). 258 * 259 * Denial fields 260 * ~~~~~~~~~~~~~ 261 * 262 * Every denial event shares three fields. domain is the ID of the 263 * innermost domain that blocked the access. same_exec tells whether the 264 * current task is the same executable that entered that domain. logged is 265 * the domain's audit-logging decision for this denial (its log_status is 266 * enabled and the per-execution flag selected by same_exec is set); a 267 * stateless ftrace filter can select the denials the domain submits to 268 * audit with logged==1, without reconstructing it from the per-execution 269 * log flags. Denial events order their fields as domain, same_exec, 270 * logged, then blockers (deny_access events only), then the type-specific 271 * object fields, then any variable-length field. 272 * 273 * Relational referents 274 * ~~~~~~~~~~~~~~~~~~~~~ 275 * 276 * A scope or ptrace verdict compares two domains, so the other party's 277 * domain is part of the decision context. It is exposed as a scalar 278 * domain ID (0 when that party is unsandboxed): target_domain (signal), 279 * peer_domain (abstract unix socket), tracee_domain (ptrace). With both 280 * IDs in the stream, a consumer that tracked domain creation can relate 281 * the two parties without kernel-internal state. The ID is a scalar 282 * snapshot, not a live domain pointer that could dangle: an optional 283 * relational referent is a scalar (0 sentinel), not a nullable pointer. 284 */ 285 286 /* 287 * Prints a per-layer access mask array (the dynamic array @array) as symbolic 288 * flag names using the shared @flag_names list (a _LANDLOCK_*_NAMES macro). 289 * Stays outside CREATE_TRACE_POINTS: TP_printk is expanded in the print-output 290 * pass where that macro is undefined. 291 */ 292 #define __print_landlock_layers(array, flag_names...) \ 293 ({ \ 294 static const struct trace_print_flags __layer_names[] = { \ 295 flag_names \ 296 }; \ 297 __trace_landlock_print_layers( \ 298 p, __get_dynamic_array(array), \ 299 __get_dynamic_array_len(array) / \ 300 sizeof(access_mask_t), \ 301 __layer_names, ARRAY_SIZE(__layer_names)); \ 302 }) 303 304 /** 305 * landlock_create_ruleset - New ruleset created 306 * 307 * @ruleset: Newly created ruleset (never NULL); not yet shared via an fd, 308 * so no lock is needed. 309 * 310 * Emitted by sys_landlock_create_ruleset() while the new ruleset is still 311 * private to the calling thread, before its file descriptor is installed, 312 * so it cannot race a concurrent :manpage:`close(2)`. Balanced by a 313 * matching landlock_free_ruleset event. 314 */ 315 TRACE_EVENT(landlock_create_ruleset, 316 317 TP_PROTO(const struct landlock_ruleset *ruleset), 318 319 TP_ARGS(ruleset), 320 321 TP_STRUCT__entry( 322 __field( __u64, ruleset_id ) 323 __field( __u32, ruleset_version ) 324 __field( access_mask_t, handled_fs ) 325 __field( access_mask_t, handled_net ) 326 __field( access_mask_t, scoped ) 327 ), 328 329 TP_fast_assign( 330 __entry->ruleset_id = ruleset->id; 331 __entry->ruleset_version = ruleset->version; 332 __entry->handled_fs = ruleset->handled_masks.fs; 333 __entry->handled_net = ruleset->handled_masks.net; 334 __entry->scoped = ruleset->handled_masks.scope; 335 ), 336 337 TP_printk("ruleset=%llx.%u handled_fs=%s handled_net=%s scoped=%s", 338 __entry->ruleset_id, __entry->ruleset_version, 339 __print_flags(__entry->handled_fs, "|", _LANDLOCK_ACCESS_FS_NAMES), 340 __print_flags(__entry->handled_net, "|", _LANDLOCK_ACCESS_NET_NAMES), 341 __print_flags(__entry->scoped, "|", _LANDLOCK_SCOPE_NAMES)) 342 ); 343 344 /** 345 * landlock_free_ruleset - Ruleset freed 346 * 347 * @ruleset: Ruleset being freed (never NULL); at its last reference, so no 348 * lock is needed. 349 * 350 * Emitted when a ruleset's last reference is dropped (typically when 351 * the creating process closes the ruleset file descriptor). Fires even 352 * when file-descriptor installation failed after creation, keeping the 353 * create/free pair balanced. 354 */ 355 TRACE_EVENT(landlock_free_ruleset, 356 357 TP_PROTO(const struct landlock_ruleset *ruleset), 358 359 TP_ARGS(ruleset), 360 361 TP_STRUCT__entry( 362 __field( __u64, ruleset_id ) 363 __field( __u32, ruleset_version ) 364 ), 365 366 TP_fast_assign( 367 __entry->ruleset_id = ruleset->id; 368 __entry->ruleset_version = ruleset->version; 369 ), 370 371 TP_printk("ruleset=%llx.%u", 372 __entry->ruleset_id, __entry->ruleset_version) 373 ); 374 375 /** 376 * landlock_add_rule_fs - Filesystem rule added to a ruleset 377 * 378 * @ruleset: Source ruleset (never NULL). 379 * @access_rights: Effective access mask stored in the rule, not the raw 380 * sys_landlock_add_rule() argument (unhandled rights 381 * added). 382 * @path: Filesystem path for the rule (never NULL). 383 * @pathname: Resolved absolute path string (never NULL; error placeholder 384 * on resolution failure). 385 * 386 * Emitted by sys_landlock_add_rule() under the modified ruleset's lock, so 387 * the reported ruleset is a stable snapshot that no concurrent writer can 388 * change. 389 */ 390 TRACE_EVENT(landlock_add_rule_fs, 391 392 TP_PROTO(const struct landlock_ruleset *ruleset, 393 access_mask_t access_rights, const struct path *path, 394 const char *pathname), 395 396 TP_ARGS(ruleset, access_rights, path, pathname), 397 398 TP_STRUCT__entry( 399 __field( __u64, ruleset_id ) 400 __field( __u32, ruleset_version ) 401 __field( access_mask_t, access_rights ) 402 __field( dev_t, dev ) 403 __field( ino_t, ino ) 404 __string( pathname, pathname ) 405 ), 406 407 TP_fast_assign( 408 lockdep_assert_held(&ruleset->lock); 409 __entry->ruleset_id = ruleset->id; 410 __entry->ruleset_version = ruleset->version; 411 __entry->access_rights = access_rights; 412 __entry->dev = path->dentry->d_sb->s_dev; 413 /* 414 * The inode number may not be the user-visible one, 415 * but it will be the same used by audit. 416 */ 417 __entry->ino = d_backing_inode(path->dentry)->i_ino; 418 __assign_str(pathname); 419 ), 420 421 TP_printk("ruleset=%llx.%u access_rights=%s dev=%u:%u ino=%lu path=%s", 422 __entry->ruleset_id, __entry->ruleset_version, 423 __print_flags(__entry->access_rights, "|", _LANDLOCK_ACCESS_FS_NAMES), 424 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, 425 __trace_print_untrusted_str(p, __get_str(pathname), 426 __get_dynamic_array_len(pathname) - 1)) 427 ); 428 429 /** 430 * landlock_add_rule_net - Network port rule added to a ruleset 431 * 432 * @ruleset: Source ruleset (never NULL). 433 * @access_rights: Effective access mask stored in the rule, not the raw 434 * sys_landlock_add_rule() argument (unhandled rights 435 * added). 436 * @port: Network port, the landlock_net_port_attr.port UAPI value 437 * forwarded directly. 438 * 439 * Emitted by sys_landlock_add_rule() under the modified ruleset's lock, so 440 * the reported ruleset is a stable snapshot that no concurrent writer can 441 * change. 442 */ 443 TRACE_EVENT(landlock_add_rule_net, 444 445 TP_PROTO(const struct landlock_ruleset *ruleset, 446 access_mask_t access_rights, __u64 port), 447 448 TP_ARGS(ruleset, access_rights, port), 449 450 TP_STRUCT__entry( 451 __field( __u64, ruleset_id ) 452 __field( __u32, ruleset_version ) 453 __field( access_mask_t, access_rights ) 454 __field( __u64, port ) 455 ), 456 457 TP_fast_assign( 458 lockdep_assert_held(&ruleset->lock); 459 __entry->ruleset_id = ruleset->id; 460 __entry->ruleset_version = ruleset->version; 461 __entry->access_rights = access_rights; 462 __entry->port = port; 463 ), 464 465 TP_printk("ruleset=%llx.%u access_rights=%s port=%llu", 466 __entry->ruleset_id, __entry->ruleset_version, 467 __print_flags(__entry->access_rights, "|", _LANDLOCK_ACCESS_NET_NAMES), 468 __entry->port) 469 ); 470 471 /** 472 * landlock_create_domain - New domain created 473 * 474 * @domain: Newly created domain (never NULL, immutable after creation). 475 * @domain->hierarchy->id is its unique ID, shared with the 476 * landlock_enforce_domain and landlock_free_domain events; 477 * @domain->hierarchy->details holds the requesting process. 478 * @ruleset: Source ruleset frozen into the domain (never NULL). The 479 * ruleset lock is held across the emission, so a BPF program 480 * reading it via BTF sees the exact merged ruleset; 481 * @ruleset->id / @ruleset->version identify it. 482 * 483 * Emitted by sys_landlock_restrict_self() once, in the requesting 484 * thread's context, right after the merge and before thread-sync. The 485 * flags-only path (ruleset_fd == -1) creates no domain and does not 486 * emit this event. Paired with the per-thread landlock_enforce_domain 487 * (join on @domain->hierarchy->id) and balanced by a matching 488 * landlock_free_domain event. 489 */ 490 TRACE_EVENT(landlock_create_domain, 491 492 TP_PROTO(const struct landlock_domain *domain, 493 const struct landlock_ruleset *ruleset), 494 495 TP_ARGS(domain, ruleset), 496 497 TP_STRUCT__entry( 498 __field( __u64, domain_id ) 499 __field( __u64, parent_id ) 500 __field( __u64, ruleset_id ) 501 __field( __u32, ruleset_version ) 502 ), 503 504 TP_fast_assign( 505 lockdep_assert_held(&ruleset->lock); 506 __entry->domain_id = domain->hierarchy->id; 507 __entry->parent_id = domain->hierarchy->parent ? 508 domain->hierarchy->parent->id : 0; 509 __entry->ruleset_id = ruleset->id; 510 __entry->ruleset_version = ruleset->version; 511 ), 512 513 TP_printk("domain=%llx parent=%llx ruleset=%llx.%u", 514 __entry->domain_id, __entry->parent_id, 515 __entry->ruleset_id, __entry->ruleset_version) 516 ); 517 518 /** 519 * landlock_enforce_domain - Domain enforced on a thread 520 * 521 * @domain: Domain now enforced on the current thread (never NULL, 522 * immutable; read locklessly). Correlate to 523 * landlock_create_domain via @domain->hierarchy->id for the 524 * source ruleset and requesting thread, or read 525 * @domain->hierarchy->details for the requesting process. 526 * @complete: Set on the single event that concludes the operation, after 527 * all its other enforcements; filter on it for one event per 528 * operation. 529 * @process_wide: The enforcement covers every eligible (non-exiting) 530 * thread of the process: set when the caller used 531 * %LANDLOCK_RESTRICT_SELF_TSYNC or the process is 532 * single-threaded. A lone thread whose group still 533 * holds a zombie leader is not counted single-threaded, 534 * so process_wide == 0 never proves the opposite. 535 * @no_new_privs: The enforcing thread's no_new_privs state at 536 * enforcement time: 1 if set (by a prior 537 * :manpage:`prctl(2)` %PR_SET_NO_NEW_PRIVS or by 538 * %LANDLOCK_RESTRICT_SELF_NO_NEW_PRIVS), 0 if the domain 539 * was enforced with %CAP_SYS_ADMIN instead. 540 * 541 * Emitted for each thread sys_landlock_restrict_self() enforces the 542 * domain on, in that thread's own context, right after its 543 * commit_creds(), so it fires only once the thread is irreversibly 544 * enforcing the domain (aborted operations emit none). Not 545 * balanced; every enforcement falls between the domain's 546 * landlock_create_domain and landlock_free_domain events. 547 * 548 * @complete == 1 && @process_wide == 1 means the whole process is 549 * sandboxed by @domain, durably (Landlock domains are monotonic and 550 * inherited on :manpage:`clone(2)`). 551 */ 552 TRACE_EVENT(landlock_enforce_domain, 553 554 TP_PROTO(const struct landlock_domain *domain, bool complete, 555 bool process_wide, bool no_new_privs), 556 557 TP_ARGS(domain, complete, process_wide, no_new_privs), 558 559 TP_STRUCT__entry( 560 __field( __u64, domain_id ) 561 __field( bool, complete ) 562 __field( bool, process_wide ) 563 __field( bool, no_new_privs ) 564 ), 565 566 TP_fast_assign( 567 __entry->domain_id = domain->hierarchy->id; 568 __entry->complete = complete; 569 __entry->process_wide = process_wide; 570 __entry->no_new_privs = no_new_privs; 571 ), 572 573 TP_printk("domain=%llx complete=%d process_wide=%d no_new_privs=%d", 574 __entry->domain_id, __entry->complete, __entry->process_wide, 575 __entry->no_new_privs) 576 ); 577 578 /** 579 * landlock_free_domain - Domain freed 580 * 581 * @hierarchy: Hierarchy node being freed (never NULL). 582 * 583 * Emitted when the hierarchy node's last reference is dropped: its 584 * refcount reaches zero after all child domains have released their 585 * parent reference. A committed domain is 586 * freed from a kworker via landlock_put_domain_deferred() (the credential 587 * free path runs in RCU context, where sleeping is forbidden), so the 588 * current task is not the sandboxed task that triggered the free. Balanced 589 * by a matching landlock_create_domain event. 590 */ 591 TRACE_EVENT(landlock_free_domain, 592 593 TP_PROTO(const struct landlock_hierarchy *hierarchy), 594 595 TP_ARGS(hierarchy), 596 597 TP_STRUCT__entry( 598 __field( __u64, domain_id ) 599 __field( __u64, denials ) 600 ), 601 602 TP_fast_assign( 603 __entry->domain_id = hierarchy->id; 604 __entry->denials = atomic64_read(&hierarchy->num_denials); 605 ), 606 607 TP_printk("domain=%llx denials=%llu", 608 __entry->domain_id, __entry->denials) 609 ); 610 611 /** 612 * landlock_check_rule_fs - Filesystem rule evaluated during access check 613 * 614 * @domain: Enforcing domain (never NULL). 615 * @rule: Matching rule with per-layer access masks (never NULL). 616 * @access_request: Access mask evaluated against the rule (the domain's 617 * handled mask during rename/link double-checks). 618 * @dentry: Filesystem dentry being checked (never NULL). 619 * 620 * Emitted for each rule that matches during a filesystem access check. 621 * The grants array shows the requested rights the rule grants at each 622 * domain layer. See Documentation/trace/events-landlock.rst for how to 623 * interpret it. 624 */ 625 TRACE_EVENT(landlock_check_rule_fs, 626 627 TP_PROTO(const struct landlock_domain *domain, 628 const struct landlock_rule *rule, 629 access_mask_t access_request, const struct dentry *dentry), 630 631 TP_ARGS(domain, rule, access_request, dentry), 632 633 TP_STRUCT__entry( 634 __field( __u64, domain_id ) 635 __field( access_mask_t, access_request ) 636 __field( dev_t, dev ) 637 __field( ino_t, ino ) 638 __dynamic_array(access_mask_t, grants, 639 domain->num_layers) 640 ), 641 642 TP_fast_assign( 643 __entry->domain_id = domain->hierarchy->id; 644 __entry->access_request = access_request; 645 __entry->dev = dentry->d_sb->s_dev; 646 __entry->ino = d_backing_inode(dentry)->i_ino; 647 648 __trace_landlock_fill_layers(__get_dynamic_array(grants), 649 __get_dynamic_array_len(grants) / 650 sizeof(access_mask_t), 651 rule, access_request); 652 ), 653 654 TP_printk("domain=%llx access_request=%s dev=%u:%u ino=%lu grants=%s", 655 __entry->domain_id, 656 __print_flags(__entry->access_request, "|", _LANDLOCK_ACCESS_FS_NAMES), 657 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, 658 __print_landlock_layers(grants, _LANDLOCK_ACCESS_FS_NAMES)) 659 ); 660 661 /** 662 * landlock_check_rule_net - Network port rule evaluated during access check 663 * 664 * @domain: Enforcing domain (never NULL). 665 * @rule: Matching rule with per-layer access masks (never NULL). 666 * @access_request: Access mask being requested. 667 * @port: Network port being checked (host endianness). 668 * 669 * Emitted for each rule that matches during a network access check. The 670 * grants array shows the requested rights the rule grants at each domain 671 * layer. See Documentation/trace/events-landlock.rst for how to 672 * interpret it. 673 */ 674 TRACE_EVENT(landlock_check_rule_net, 675 676 TP_PROTO(const struct landlock_domain *domain, 677 const struct landlock_rule *rule, 678 access_mask_t access_request, __u64 port), 679 680 TP_ARGS(domain, rule, access_request, port), 681 682 TP_STRUCT__entry( 683 __field( __u64, domain_id ) 684 __field( access_mask_t, access_request ) 685 __field( __u64, port ) 686 __dynamic_array(access_mask_t, grants, 687 domain->num_layers) 688 ), 689 690 TP_fast_assign( 691 __entry->domain_id = domain->hierarchy->id; 692 __entry->access_request = access_request; 693 __entry->port = port; 694 695 __trace_landlock_fill_layers(__get_dynamic_array(grants), 696 __get_dynamic_array_len(grants) / 697 sizeof(access_mask_t), 698 rule, access_request); 699 ), 700 701 TP_printk("domain=%llx access_request=%s port=%llu grants=%s", 702 __entry->domain_id, 703 __print_flags(__entry->access_request, "|", _LANDLOCK_ACCESS_NET_NAMES), 704 __entry->port, 705 __print_landlock_layers(grants, _LANDLOCK_ACCESS_NET_NAMES)) 706 ); 707 708 /** 709 * landlock_deny_access_fs - Filesystem access denied 710 * 711 * @hierarchy: Denying domain's hierarchy node (never NULL); its id is the 712 * domain field. 713 * @same_exec: Whether the current task entered the denying domain itself. 714 * @logged: The domain's audit-logging decision for this denial. 715 * @blockers: Access mask that was blocked (zero for a mount-topology 716 * change, whose only blocker is the operation itself). 717 * @path: Filesystem path that was denied (never NULL). 718 * @pathname: Resolved path string (never NULL; an error placeholder on 719 * resolution failure). 720 * 721 * Emitted when a Landlock domain denies a filesystem access. 722 */ 723 TRACE_EVENT(landlock_deny_access_fs, 724 725 TP_PROTO(const struct landlock_hierarchy *hierarchy, bool same_exec, 726 bool logged, access_mask_t blockers, const struct path *path, 727 const char *pathname), 728 729 TP_ARGS(hierarchy, same_exec, logged, blockers, path, pathname), 730 731 TP_STRUCT__entry( 732 __field( __u64, domain_id ) 733 __field( bool, same_exec ) 734 __field( bool, logged ) 735 __field( access_mask_t, blockers ) 736 __field( dev_t, dev ) 737 __field( ino_t, ino ) 738 __string( pathname, pathname ) 739 ), 740 741 TP_fast_assign( 742 const struct inode *inode = d_backing_inode(path->dentry); 743 744 __entry->domain_id = hierarchy->id; 745 __entry->same_exec = same_exec; 746 __entry->logged = logged; 747 __entry->blockers = blockers; 748 __entry->dev = path->dentry->d_sb->s_dev; 749 /* 750 * A negative dentry has no backing inode, so mirror the 751 * guard in dump_common_audit_data() and report inode 0. 752 */ 753 __entry->ino = inode ? inode->i_ino : 0; 754 __assign_str(pathname); 755 ), 756 757 TP_printk("domain=%llx same_exec=%d logged=%d blockers=%s dev=%u:%u ino=%lu path=%s", 758 __entry->domain_id, __entry->same_exec, __entry->logged, 759 __print_flags(__entry->blockers, "|", _LANDLOCK_ACCESS_FS_NAMES), 760 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, 761 __trace_print_untrusted_str(p, __get_str(pathname), 762 __get_dynamic_array_len(pathname) - 1)) 763 ); 764 765 /** 766 * landlock_deny_access_net - Network access denied 767 * 768 * @hierarchy: Denying domain's hierarchy node (never NULL); its id is the 769 * domain field. 770 * @same_exec: Whether the current task entered the denying domain itself. 771 * @logged: The domain's audit-logging decision for this denial. 772 * @blockers: Access mask that was blocked. 773 * @sk: Socket object (never NULL), read without a socket lock, so its 774 * fields are a best-effort snapshot. The denied endpoint is not 775 * available: the hook runs before :manpage:`bind(2)` / 776 * :manpage:`connect(2)` sets the socket addresses. 777 * @sport: Source port in host endianness, set for bind denials (zero for 778 * an autobind/ephemeral port); zero for connect and send denials. 779 * @dport: Destination port in host endianness, set for connect and send 780 * denials; zero for bind denials, and also zero for a UDP send to 781 * an AF_UNSPEC address on an IPv6 socket (indistinguishable from a 782 * real destination port 0). The bind-vs-connect direction is 783 * given by @blockers, not by which port is set. 784 * 785 * Emitted when a Landlock domain denies a network operation. 786 * 787 * The port fields are converted from the socket's network byte order to 788 * host endianness before emitting. 789 */ 790 TRACE_EVENT(landlock_deny_access_net, 791 792 TP_PROTO(const struct landlock_hierarchy *hierarchy, bool same_exec, 793 bool logged, access_mask_t blockers, const struct sock *sk, 794 __u64 sport, __u64 dport), 795 796 TP_ARGS(hierarchy, same_exec, logged, blockers, sk, sport, dport), 797 798 TP_STRUCT__entry( 799 __field( __u64, domain_id ) 800 __field( bool, same_exec ) 801 __field( bool, logged ) 802 __field( access_mask_t, blockers ) 803 __field( __u64, sport ) 804 __field( __u64, dport ) 805 ), 806 807 TP_fast_assign( 808 __entry->domain_id = hierarchy->id; 809 __entry->same_exec = same_exec; 810 __entry->logged = logged; 811 __entry->blockers = blockers; 812 __entry->sport = sport; 813 __entry->dport = dport; 814 ), 815 816 TP_printk("domain=%llx same_exec=%d logged=%d blockers=%s sport=%llu dport=%llu", 817 __entry->domain_id, __entry->same_exec, __entry->logged, 818 __print_flags(__entry->blockers, "|", _LANDLOCK_ACCESS_NET_NAMES), 819 __entry->sport, __entry->dport) 820 ); 821 822 /** 823 * landlock_deny_ptrace - Ptrace access denied by a Landlock domain 824 * 825 * @hierarchy: Denying domain's hierarchy node (never NULL); its id is the 826 * domain field. 827 * @same_exec: Whether the current task entered the denying domain itself. 828 * @logged: The domain's audit-logging decision for this denial. 829 * @tracee_domain_id: The tracee's Landlock domain ID, or 0 if the tracee 830 * is unsandboxed. 831 * @tracee: The target task ptrace acted on (never NULL). tracee_pid is 832 * the init-namespace TGID (like audit's opid). 833 * 834 * Emitted when a Landlock domain denies a ptrace operation. 835 */ 836 TRACE_EVENT(landlock_deny_ptrace, 837 838 TP_PROTO(const struct landlock_hierarchy *hierarchy, bool same_exec, 839 bool logged, u64 tracee_domain_id, 840 const struct task_struct *tracee), 841 842 TP_ARGS(hierarchy, same_exec, logged, tracee_domain_id, tracee), 843 844 TP_STRUCT__entry( 845 __field( __u64, domain_id ) 846 __field( bool, same_exec ) 847 __field( bool, logged ) 848 __field( __u64, tracee_domain_id) 849 __field( pid_t, tracee_pid ) 850 __string( tracee_comm, tracee->comm ) 851 ), 852 853 TP_fast_assign( 854 __entry->domain_id = hierarchy->id; 855 __entry->same_exec = same_exec; 856 __entry->logged = logged; 857 __entry->tracee_domain_id = tracee_domain_id; 858 __entry->tracee_pid = task_tgid_nr((struct task_struct *)tracee); 859 __assign_str(tracee_comm); 860 ), 861 862 TP_printk("domain=%llx same_exec=%d logged=%d tracee_domain=%llx tracee_pid=%d tracee_comm=%s", 863 __entry->domain_id, __entry->same_exec, __entry->logged, 864 __entry->tracee_domain_id, __entry->tracee_pid, 865 __trace_print_untrusted_str(p, __get_str(tracee_comm), 866 __get_dynamic_array_len(tracee_comm) - 1)) 867 ); 868 869 /** 870 * landlock_deny_scope_signal - Signal delivery denied by 871 * LANDLOCK_SCOPE_SIGNAL 872 * 873 * @hierarchy: Denying domain's hierarchy node (never NULL); its id is the 874 * domain field. 875 * @same_exec: Whether the current task entered the denying domain itself. 876 * @logged: The domain's audit-logging decision for this denial. 877 * @target_domain_id: The target's Landlock domain ID, or 0 if the target 878 * is unsandboxed. 879 * @target: The task the signal was aimed at (never NULL). target_pid is 880 * the init-namespace TGID (like audit's opid). 881 * 882 * Emitted when a Landlock domain denies signal delivery to a scoped-out 883 * target. 884 */ 885 TRACE_EVENT(landlock_deny_scope_signal, 886 887 TP_PROTO(const struct landlock_hierarchy *hierarchy, bool same_exec, 888 bool logged, u64 target_domain_id, 889 const struct task_struct *target), 890 891 TP_ARGS(hierarchy, same_exec, logged, target_domain_id, target), 892 893 TP_STRUCT__entry( 894 __field( __u64, domain_id ) 895 __field( bool, same_exec ) 896 __field( bool, logged ) 897 __field( __u64, target_domain_id) 898 __field( pid_t, target_pid ) 899 __string( target_comm, target->comm ) 900 ), 901 902 TP_fast_assign( 903 __entry->domain_id = hierarchy->id; 904 __entry->same_exec = same_exec; 905 __entry->logged = logged; 906 __entry->target_domain_id = target_domain_id; 907 __entry->target_pid = task_tgid_nr((struct task_struct *)target); 908 __assign_str(target_comm); 909 ), 910 911 TP_printk("domain=%llx same_exec=%d logged=%d target_domain=%llx target_pid=%d target_comm=%s", 912 __entry->domain_id, __entry->same_exec, __entry->logged, 913 __entry->target_domain_id, __entry->target_pid, 914 __trace_print_untrusted_str(p, __get_str(target_comm), 915 __get_dynamic_array_len(target_comm) - 1)) 916 ); 917 918 /** 919 * landlock_deny_scope_abstract_unix_socket - Abstract unix socket access 920 * denied by LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET 921 * 922 * @hierarchy: Denying domain's hierarchy node (never NULL); its id is the 923 * domain field. 924 * @same_exec: Whether the current task entered the denying domain itself. 925 * @logged: The domain's audit-logging decision for this denial. 926 * @peer_domain_id: The peer's Landlock domain ID, or 0 if the peer is 927 * unsandboxed. 928 * @peer: Peer socket (never NULL). peer_pid is best-effort: it is 0 for 929 * a datagram peer (no SO_PEERCRED), so sun_path is the reliable 930 * peer identifier. 931 * 932 * Emitted when a Landlock domain denies access to a scoped-out abstract 933 * unix socket. 934 */ 935 TRACE_EVENT(landlock_deny_scope_abstract_unix_socket, 936 937 TP_PROTO(const struct landlock_hierarchy *hierarchy, bool same_exec, 938 bool logged, u64 peer_domain_id, const struct sock *peer), 939 940 TP_ARGS(hierarchy, same_exec, logged, peer_domain_id, peer), 941 942 TP_STRUCT__entry( 943 __field( __u64, domain_id ) 944 __field( bool, same_exec ) 945 __field( bool, logged ) 946 __field( __u64, peer_domain_id ) 947 __field( pid_t, peer_pid ) 948 /* 949 * Abstract socket names are untrusted binary data from 950 * user space. Use __string_len because abstract names 951 * are not NUL-terminated; their length is determined by 952 * addr->len. unix_sk(peer)->addr is stable here because 953 * the caller (hook_unix_stream_connect or 954 * hook_unix_may_send) holds unix_state_lock(peer). 955 */ 956 __string_len( sun_path, 957 unix_sk(peer)->addr ? 958 unix_sk(peer)->addr->name->sun_path + 1 : 959 "", 960 unix_sk(peer)->addr ? 961 unix_sk(peer)->addr->len - 962 offsetof(struct sockaddr_un, 963 sun_path) - 1 : 964 0) 965 ), 966 967 TP_fast_assign( 968 struct pid *peer_pid; 969 970 lockdep_assert_held(&unix_sk(peer)->lock); 971 __entry->domain_id = hierarchy->id; 972 __entry->same_exec = same_exec; 973 __entry->logged = logged; 974 __entry->peer_domain_id = peer_domain_id; 975 /* 976 * Best-effort (0 for a datagram peer). sk_peer_pid is 977 * canonically guarded by sk->sk_peer_lock, but the target 978 * peer's peercred is set once and not updated concurrently in 979 * these hooks, so this READ_ONCE() is safe; sun_path is the 980 * reliable identifier. 981 */ 982 peer_pid = READ_ONCE(peer->sk_peer_pid); 983 __entry->peer_pid = peer_pid ? pid_nr(peer_pid) : 0; 984 __assign_str(sun_path); 985 ), 986 987 TP_printk("domain=%llx same_exec=%d logged=%d peer_domain=%llx peer_pid=%d sun_path=%s", 988 __entry->domain_id, __entry->same_exec, __entry->logged, 989 __entry->peer_domain_id, __entry->peer_pid, 990 __trace_print_untrusted_str(p, __get_str(sun_path), 991 __get_dynamic_array_len(sun_path) - 1)) 992 ); 993 994 #undef _LANDLOCK_NAME_ENTRY 995 996 #endif /* _TRACE_LANDLOCK_H */ 997 998 /* This part must be outside protection */ 999 #include <trace/define_trace.h> 1000 1001 /* clang-format on */ 1002