From e311dc74b5ef92ffb8ed9dd00513649b0c084a30 Mon Sep 17 00:00:00 2001 From: LinuxDev9002 Date: Wed, 22 Jul 2026 01:38:02 -0700 Subject: [PATCH 1/4] Rebase lesson 54 as a standalone monitor --- src/54-exec-image-inspector/README.md | 596 +++++++----------- src/54-exec-image-inspector/README.zh.md | 596 +++++++----------- .../exec-image-flow.dot | 23 +- .../exec-image-flow.png | Bin 209831 -> 109558 bytes .../exec_image_inspector.bpf.c | 156 +++-- .../exec_image_inspector.c | 357 +++-------- .../exec_image_inspector.h | 2 + .../tests/test_exec_image_inspector.py | 269 ++++---- 8 files changed, 749 insertions(+), 1250 deletions(-) diff --git a/src/54-exec-image-inspector/README.md b/src/54-exec-image-inspector/README.md index aab86ca6..e8743701 100644 --- a/src/54-exec-image-inspector/README.md +++ b/src/54-exec-image-inspector/README.md @@ -2,7 +2,7 @@ When a process calls `execve`, the kernel replaces its memory image with a new executable. But which executable, exactly? If the command line says `/usr/bin/wrapper.sh --config /etc/app.conf`, the actual running code might be a Python interpreter or a compiled binary launched three layers deep through wrapper scripts. Security tools, container runtimes, and troubleshooting utilities all need to know what the kernel *actually* installed, not just what the user typed. -This tutorial builds a tool that captures that information at the kernel level. It hooks the moment credentials are committed after exec, schedules a deferred callback, then reads the installed executable's ELF header and reports the architecture, byte order, and file type. Along the way, it demonstrates two recent kernel features (BPF task work and file dynptr) that together solve a problem traditional eBPF approaches cannot. +This tutorial builds a continuously running tool that captures that information at the kernel level. It hooks the moment credentials are committed after each successful exec, schedules a deferred callback, then reads the installed executable's ELF header and reports the architecture, byte order, and file type. Along the way, it demonstrates two recent kernel features (BPF task work and file dynptr) that together solve a problem traditional eBPF approaches cannot. > Complete source: @@ -14,6 +14,8 @@ The most direct approach to inspecting an executable is reading `/proc//exe Tracepoints and kprobes can hook `sched_process_exec` to observe exec events synchronously, but these hooks run in what the kernel calls a **non-sleepable context**. This matters because of how Linux manages file data in memory. +This tutorial uses an LSM hook for a second, stricter reason: the kernel exposes `bpf_get_task_exe_file`, `bpf_put_file`, and `bpf_path_d_path` only to BPF LSM programs. A `sched_process_exec` tracepoint can report basic exec metadata, but it cannot call those kfuncs, and its borrowed `bprm->file` cannot be retained across an asynchronous task-work boundary. Without BPF LSM, this exact design cannot reliably recover the installed executable file and path for deferred cold-page reads. + When you read from a file, the kernel first checks whether the requested bytes are already in the **page cache**, a memory region that caches recently-accessed file data. If they are, the read completes immediately. If they are not (a **cold page**), the kernel must issue I/O to the storage device, and the calling context must **sleep** while waiting for that I/O to complete. BPF programs attached to tracepoints and kprobes cannot sleep. They run with interrupts potentially disabled and locks held; sleeping would deadlock the system. If a BPF program tries to read file content and encounters a cold page, the read fails with `-EFAULT` instead of waiting for I/O. @@ -28,17 +30,17 @@ Linux 6.19 introduced **file dynptr**, which provides verifier-tracked access to Combining these features, the design becomes: -1. Attach an LSM hook to `bprm_committed_creds`, which fires after exec installs the new credentials -2. In the hook (non-sleepable), identify the target process and schedule a task work callback +1. Attach an LSM hook to `bprm_committed_creds`, which fires after each successful exec installs the new credentials +2. In the hook (non-sleepable), create per-exec state and schedule a task work callback 3. The callback runs in a sleepable context, where it can access the installed executable, read content from any offset (including cold pages), and send results to user space -This separation (identify the target in a non-sleepable hook, do the heavy lifting in a sleepable callback) is the key insight. +This separation (admit the exec in a non-sleepable hook, do the heavy lifting in a sleepable callback) is the key insight. ## How BPF task work operates When you call `bpf_task_work_schedule_signal(task, work, map, callback)`, the kernel associates your callback with the specified task. The callback does not run immediately; it runs later, at a safe point before that task returns to user space. -The `struct bpf_task_work` is an opaque structure that the kernel uses to track the scheduled callback. Your BPF program allocates storage for it but does not interpret its contents. This tool uses a single-element ARRAY map to hold `struct exec_work`, which contains the `bpf_task_work` storage plus fields for timestamps and intermediate results. +The `struct bpf_task_work` is an opaque structure that the kernel uses to track the scheduled callback. Your BPF program allocates storage for it but does not interpret its contents. This tool uses a HASH map keyed by `pid_tgid`; each `struct exec_work` value contains the `bpf_task_work` storage plus fields for timestamps and intermediate results. Separate keys allow concurrent execs to remain independent. The callback signature is `int callback(struct bpf_map *map, void *key, void *value)`. The `value` parameter points to the map element containing your `bpf_task_work`, so you can pass data from the scheduling hook to the callback through surrounding fields. @@ -56,18 +58,11 @@ In a non-sleepable context, `bpf_dynptr_read` only succeeds if the target bytes ## Tool architecture -The user-space program forks a child process, but holds the child blocked on a pipe before it calls `execvp`. This gives the parent time to: - -1. Note the child's PID (which becomes its TGID, thread group ID) -2. Open the BPF skeleton and write the target TGID into read-only data -3. Load and attach the BPF program -4. Create a ring buffer reader - -Only then does the parent release the child by writing to the pipe. This handshake eliminates a race condition: without it, a fast-exiting command might finish before the BPF program attaches. +The user-space program loads and attaches the BPF program, creates a ring buffer reader, and prints `READY scope=system-wide`. It then remains active until SIGINT or SIGTERM, so workloads can start independently after readiness instead of being launched through a special child-command interface. -When the child calls `execvp`, the `lsm/bprm_committed_creds` hook fires. The BPF program compares the current TGID with the configured target; if they match, it records a timestamp and schedules a task work callback. +For every successful exec after `READY`, the `lsm/bprm_committed_creds` hook inserts one `exec_work` value into the `pending` HASH map under the current `pid_tgid`, records a timestamp, and schedules a task work callback. Failed insertions or scheduling attempts are counted and clean up the map entry. -The callback (`inspect_executable`) runs in the child's sleepable context. It: +The callback (`inspect_executable`) runs later in the execing task's sleepable context. It: 1. Calls `bpf_get_task_exe_file` to get the installed executable (returning a referenced `struct file` that must be released with `bpf_put_file`) 2. Resolves the path with `bpf_path_d_path` @@ -75,7 +70,7 @@ The callback (`inspect_executable`) runs in the child's sleepable context. It: 4. Parses ELF fields: magic number, class (32/64-bit), data (endianness), type (executable vs shared object), and machine (architecture) 5. Sends an event through the ring buffer -User space polls the ring buffer while also checking whether the child has exited. A single child might exec multiple times (for example, `/bin/sh -c 'exec /bin/true'` first execs the shell, then execs `/bin/true`), so after the child exits, the tool drains any remaining events from the ring buffer. +User space polls the ring buffer until a signal arrives. Shutdown first detaches the LSM program to stop admitting new execs, waits until `completed >= scheduled`, drains remaining events, prints stable counters, and only then destroys the skeleton. This ordering prevents queued callbacks from outliving their maps or ring buffer. ![Exec image inspector data flow](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/54-exec-image-inspector/exec-image-flow.png) @@ -121,6 +116,7 @@ struct inspector_stats { unsigned long long scheduled; unsigned long long schedule_errors; unsigned long long callbacks; + unsigned long long completed; unsigned long long header_errors; unsigned long long path_errors; unsigned long long direct_probes; @@ -128,6 +124,7 @@ struct inspector_stats { unsigned long long deferred_probes; unsigned long long deferred_probe_errors; unsigned long long dropped; + unsigned long long cleanup_errors; }; #endif /* __EXEC_IMAGE_INSPECTOR_H */ @@ -196,7 +193,6 @@ char LICENSE[] SEC("license") = "GPL"; #define ELFDATA2LSB 1 #define ELFDATA2MSB 2 -const volatile __u32 target_tgid; const volatile __u32 probe_offset; struct inspector_stats stats; @@ -213,9 +209,10 @@ struct exec_work { }; struct { - __uint(type, BPF_MAP_TYPE_ARRAY); - __uint(max_entries, 1); - __type(key, __u32); + __uint(type, BPF_MAP_TYPE_HASH); + __uint(map_flags, BPF_F_NO_PREALLOC); + __uint(max_entries, 4096); + __type(key, __u64); __type(value, struct exec_work); } pending SEC(".maps"); @@ -256,91 +253,106 @@ record: return err; } -static int inspect_executable(struct bpf_map *map, void *key, void *value) +static __always_inline void record_header_error(struct exec_event *event, int err) { - unsigned char header[64] = {}; - struct exec_work *work = value; - struct exec_event event = {}; - struct task_struct *task; - struct bpf_dynptr dynptr; - struct file *file; - __u64 pid_tgid; - int err; + event->header_error = err; + __sync_fetch_and_add(&stats.header_errors, 1); +} - (void)map; - (void)key; - __sync_fetch_and_add(&stats.callbacks, 1); +static __always_inline void record_deferred_probe(struct exec_event *event, + int err) +{ + if (!probe_offset) + return; - pid_tgid = bpf_get_current_pid_tgid(); - event.pid = (__u32)pid_tgid; - event.tgid = pid_tgid >> 32; - event.latency_ns = bpf_ktime_get_ns() - work->scheduled_ns; - event.direct_probe_error = work->direct_probe_error; - event.probe_offset = probe_offset; - bpf_get_current_comm(event.comm, sizeof(event.comm)); + event->deferred_probe_error = err; + __sync_fetch_and_add(&stats.deferred_probes, 1); + if (err) + __sync_fetch_and_add(&stats.deferred_probe_errors, 1); +} - task = bpf_get_current_task_btf(); - file = bpf_get_task_exe_file(task); - if (!file) { - event.header_error = -ENOENT; - __sync_fetch_and_add(&stats.header_errors, 1); - if (probe_offset) { - event.deferred_probe_error = -ENOENT; - __sync_fetch_and_add(&stats.deferred_probes, 1); - __sync_fetch_and_add(&stats.deferred_probe_errors, 1); - } - goto emit; - } +static __always_inline void parse_elf_header(const unsigned char *header, + struct exec_event *event) +{ + if (event->header_error || header[0] != 0x7f || header[1] != 'E' || + header[2] != 'L' || header[3] != 'F') + return; - err = bpf_path_d_path(&file->f_path, event.path, sizeof(event.path)); + event->is_elf = 1; + event->elf_class = header[EI_CLASS]; + event->elf_data = header[EI_DATA]; + event->elf_type = read_elf_u16(header, 16, event->elf_data); + event->elf_machine = read_elf_u16(header, 18, event->elf_data); +} + +static __always_inline void inspect_file(struct file *file, + struct exec_event *event) +{ + unsigned char header[64] = {}; + struct bpf_dynptr dynptr; + int err; + + err = bpf_path_d_path(&file->f_path, event->path, sizeof(event->path)); if (err < 0) { - event.path_error = err; + event->path_error = err; __sync_fetch_and_add(&stats.path_errors, 1); } err = bpf_dynptr_from_file(file, 0, &dynptr); if (err) { bpf_dynptr_file_discard(&dynptr); - event.header_error = err; - __sync_fetch_and_add(&stats.header_errors, 1); - if (probe_offset) { - event.deferred_probe_error = err; - __sync_fetch_and_add(&stats.deferred_probes, 1); - __sync_fetch_and_add(&stats.deferred_probe_errors, 1); - } - goto put_file; + record_header_error(event, err); + record_deferred_probe(event, err); + return; } err = bpf_dynptr_read(header, sizeof(header), &dynptr, 0, 0); - if (err) { - event.header_error = err; - __sync_fetch_and_add(&stats.header_errors, 1); - } + if (err) + record_header_error(event, err); if (probe_offset) { - __sync_fetch_and_add(&stats.deferred_probes, 1); - err = bpf_dynptr_read(event.probe_bytes, sizeof(event.probe_bytes), + err = bpf_dynptr_read(event->probe_bytes, + sizeof(event->probe_bytes), &dynptr, probe_offset, 0); - event.deferred_probe_error = err; - if (err) - __sync_fetch_and_add(&stats.deferred_probe_errors, 1); + record_deferred_probe(event, err); } bpf_dynptr_file_discard(&dynptr); + parse_elf_header(header, event); +} + +static int inspect_executable(struct bpf_map *map, void *key, void *value) +{ + struct exec_work *work = value; + struct exec_event event = {}; + struct task_struct *task; + struct file *file; + __u64 pid_tgid; - if (!event.header_error && header[0] == 0x7f && header[1] == 'E' && - header[2] == 'L' && header[3] == 'F') { - event.is_elf = 1; - event.elf_class = header[EI_CLASS]; - event.elf_data = header[EI_DATA]; - event.elf_type = read_elf_u16(header, 16, event.elf_data); - event.elf_machine = read_elf_u16(header, 18, event.elf_data); + __sync_fetch_and_add(&stats.callbacks, 1); + pid_tgid = bpf_get_current_pid_tgid(); + event.pid = (__u32)pid_tgid; + event.tgid = pid_tgid >> 32; + event.latency_ns = bpf_ktime_get_ns() - work->scheduled_ns; + event.direct_probe_error = work->direct_probe_error; + event.probe_offset = probe_offset; + bpf_get_current_comm(event.comm, sizeof(event.comm)); + + task = bpf_get_current_task_btf(); + file = bpf_get_task_exe_file(task); + if (!file) { + record_header_error(&event, -ENOENT); + record_deferred_probe(&event, -ENOENT); + goto emit; } -put_file: + inspect_file(file, &event); bpf_put_file(file); emit: if (bpf_ringbuf_output(&events, &event, sizeof(event), 0)) __sync_fetch_and_add(&stats.dropped, 1); + if (bpf_map_delete_elem(map, key)) + __sync_fetch_and_add(&stats.cleanup_errors, 1); + __sync_fetch_and_add(&stats.completed, 1); return 0; } @@ -348,20 +360,25 @@ SEC("lsm/bprm_committed_creds") void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) { struct task_struct *task; + struct exec_work empty_work = {}; struct exec_work *work; __u64 pid_tgid; - __u32 key = 0, tgid; + __u64 key; int err; pid_tgid = bpf_get_current_pid_tgid(); - tgid = pid_tgid >> 32; - if (target_tgid && tgid != target_tgid) - return; - + key = pid_tgid; __sync_fetch_and_add(&stats.matched, 1); + err = bpf_map_update_elem(&pending, &key, &empty_work, BPF_NOEXIST); + if (err) { + __sync_fetch_and_add(&stats.schedule_errors, 1); + return; + } work = bpf_map_lookup_elem(&pending, &key); if (!work) { __sync_fetch_and_add(&stats.schedule_errors, 1); + if (bpf_map_delete_elem(&pending, &key)) + __sync_fetch_and_add(&stats.cleanup_errors, 1); return; } @@ -372,29 +389,31 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) inspect_executable); if (err) { __sync_fetch_and_add(&stats.schedule_errors, 1); + if (bpf_map_delete_elem(&pending, &key)) + __sync_fetch_and_add(&stats.cleanup_errors, 1); return; } __sync_fetch_and_add(&stats.scheduled, 1); } ``` -The entry point is `schedule_exec_inspection`, declared with `SEC("lsm/bprm_committed_creds")`. This LSM hook fires after the new executable's credentials have been installed, so `bprm->file` points to the file being executed. The hook itself is non-sleepable, but it can identify the target and schedule the deferred work. +The entry point is `schedule_exec_inspection`, declared with `SEC("lsm/bprm_committed_creds")`. This LSM hook fires after the new executable's credentials have been installed, so `bprm->file` points to the file being executed. The hook itself is non-sleepable, but it can admit the exec and schedule the deferred work. -The two `const volatile` variables (`target_tgid` and `probe_offset`) live in the `.rodata` section. User space writes values between `open()` and `load()`, and the verifier treats them as compile-time constants for optimization. +The optional `probe_offset` variable lives in `.rodata`. User space writes it between `open()` and `load()`, and the verifier treats it as a compile-time constant for optimization. -When the target matches, the program looks up `struct exec_work` from the single-element `pending` ARRAY map. This structure holds the `bpf_task_work` storage plus a timestamp and optional direct-probe result. A single slot suffices because this tool observes one child process per invocation. +For each exec, the program inserts a zeroed `struct exec_work` into the `pending` HASH map with `BPF_NOEXIST`, keyed by `pid_tgid`, then looks it up to fill the timestamp and optional direct-probe result. The callback deletes that exact key. This supports concurrent execs without sharing one task-work slot. The optional `--probe-offset` flag makes the tool attempt a direct read in the non-sleepable hook via `probe_file_without_sleep`. The test suite uses this to verify that reading a cold page fails with `-EFAULT` in the non-sleepable context but succeeds in the sleepable callback. -After saving the timestamp and direct-probe result, the hook calls `bpf_task_work_schedule_signal`. The kernel holds the references needed to execute the callback later. +After saving the timestamp and direct-probe result, the hook calls `bpf_task_work_schedule_signal`. The kernel holds the references needed to execute the callback later. Every insert, lookup, or scheduling failure is counted, and every path that created pending state deletes it. The callback `inspect_executable` calculates latency for diagnostics, then acquires the executable file with `bpf_get_task_exe_file`. This returns a referenced `struct file` that must be released with `bpf_put_file`. The callback resolves the path, creates a file dynptr, reads the 64-byte ELF header, and parses it. The `read_elf_u16` helper handles endianness: ELF files declare their byte order in the header, and multi-byte fields must be read accordingly. -Every path that creates a dynptr, success or failure, must call `bpf_dynptr_file_discard`. Finally, `bpf_ringbuf_output` sends the event to user space. +Every path that creates a dynptr, success or failure, must call `bpf_dynptr_file_discard`. Finally, `bpf_ringbuf_output` sends the event to user space, the callback deletes its pending entry, and `completed` is incremented so shutdown can wait for finished work rather than merely scheduled work. ### User-space loader -`exec_image_inspector.c` coordinates the child process, loads BPF, receives events, and reports results: +`exec_image_inspector.c` loads BPF, receives events continuously, handles signals, and reports results: ```c // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) @@ -403,13 +422,9 @@ Every path that creates a dynptr, success or failure, must call `bpf_dynptr_file #include #include #include -#include #include #include #include -#include -#include -#include #include #include #include "exec_image_inspector.h" @@ -417,26 +432,15 @@ Every path that creates a dynptr, success or failure, must call `bpf_dynptr_file struct environment { unsigned long long probe_offset; - unsigned int timeout_ms; bool verbose; - char **command; -}; - -struct child_process { - pid_t pid; - int release_fd; - bool released; - bool reaped; - int status; }; struct event_context { - unsigned int seen; + unsigned long long seen; }; -static struct environment env = { - .timeout_ms = 5000, -}; +static struct environment env; +static volatile sig_atomic_t exiting; static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) @@ -446,40 +450,28 @@ static int libbpf_print_fn(enum libbpf_print_level level, const char *format, return vfprintf(stderr, format, args); } -static void usage(const char *program) +static void usage(FILE *stream, const char *program) { - fprintf(stderr, - "Usage: %s [--probe-offset BYTES] [--timeout-ms MS] [--verbose] " - "-- COMMAND [ARG...]\n\n" - "Inspect the executable image installed by one command.\n\n" + fprintf(stream, + "Usage: %s [--probe-offset BYTES] [--verbose]\n\n" + "Continuously inspect executable images installed by exec.\n" + "Press Ctrl-C to stop and print a summary.\n\n" "Options:\n" - " -p, --probe-offset BYTES also compare direct/deferred file reads\n" - " -t, --timeout-ms MS bound the command, 100-60000 " - "(default: 5000)\n" + " -p, --probe-offset BYTES compare reads at a positive offset\n" " -v, --verbose print libbpf diagnostics\n" " -h, --help show this help\n", program); } -static int parse_u64(const char *value, unsigned long long maximum, - unsigned long long *result) +static int parse_probe_offset(const char *value) { char *end = NULL; unsigned long long parsed; errno = 0; parsed = strtoull(value, &end, 10); - if (errno || end == value || *end || parsed > maximum) - return -EINVAL; - *result = parsed; - return 0; -} - -static int parse_probe_offset(const char *value) -{ - unsigned long long parsed; - - if (parse_u64(value, UINT_MAX - EXEC_PROBE_LEN, &parsed)) { + if (errno || end == value || *end || !parsed || + parsed > UINT_MAX - EXEC_PROBE_LEN) { fprintf(stderr, "invalid probe offset: %s\n", value); return -EINVAL; } @@ -487,154 +479,58 @@ static int parse_probe_offset(const char *value) return 0; } -static int parse_timeout(const char *value) -{ - unsigned long long parsed; - - if (parse_u64(value, 60000, &parsed) || parsed < 100) { - fprintf(stderr, "invalid timeout in milliseconds: %s\n", value); - return -EINVAL; - } - env.timeout_ms = parsed; - return 0; -} - -static int parse_option(int option, const char *program) -{ - switch (option) { - case 'p': - return parse_probe_offset(optarg); - case 't': - return parse_timeout(optarg); - case 'v': - env.verbose = true; - return 0; - case 'h': - usage(program); - exit(0); - default: - return -EINVAL; - } -} - static int parse_args(int argc, char **argv) { static const struct option options[] = { { "probe-offset", required_argument, NULL, 'p' }, - { "timeout-ms", required_argument, NULL, 't' }, { "verbose", no_argument, NULL, 'v' }, { "help", no_argument, NULL, 'h' }, {}, }; - int error, option; + int option; - while ((option = getopt_long(argc, argv, "+p:t:vh", options, NULL)) != -1) { - error = parse_option(option, argv[0]); - if (error) - return error; + while ((option = getopt_long(argc, argv, "+p:vh", options, NULL)) != -1) { + switch (option) { + case 'p': + if (parse_probe_offset(optarg)) + return -EINVAL; + break; + case 'v': + env.verbose = true; + break; + case 'h': + usage(stdout, argv[0]); + exit(0); + default: + return -EINVAL; + } } - if (optind == argc) { - fprintf(stderr, "COMMAND is required\n"); + if (optind != argc) { + fprintf(stderr, "unexpected argument: %s\n", argv[optind]); return -EINVAL; } - env.command = &argv[optind]; return 0; } -static long long monotonic_milliseconds(void) +static void handle_signal(int signal_number) { - struct timespec timestamp; - - if (clock_gettime(CLOCK_MONOTONIC, ×tamp)) - return -errno; - return timestamp.tv_sec * 1000LL + timestamp.tv_nsec / 1000000; + (void)signal_number; + exiting = 1; } -static int start_blocked_child(struct child_process *child) +static int install_signal_handlers(void) { - int pipe_fds[2]; - pid_t pid; + struct sigaction action = { + .sa_handler = handle_signal, + }; - if (pipe(pipe_fds)) + sigemptyset(&action.sa_mask); + if (sigaction(SIGINT, &action, NULL) || sigaction(SIGTERM, &action, NULL)) return -errno; - - pid = fork(); - if (pid < 0) { - int error = -errno; - - close(pipe_fds[0]); - close(pipe_fds[1]); - return error; - } - - if (pid == 0) { - char release; - ssize_t count; - - close(pipe_fds[1]); - do { - count = read(pipe_fds[0], &release, sizeof(release)); - } while (count < 0 && errno == EINTR); - close(pipe_fds[0]); - if (count != sizeof(release)) - _exit(126); - - /* Intentional argv execution; no shell parses the supplied arguments. */ - execvp(env.command[0], env.command); /* Flawfinder: ignore */ - fprintf(stderr, "failed to execute %s: %s\n", env.command[0], - strerror(errno)); - _exit(127); - } - - close(pipe_fds[0]); - child->pid = pid; - child->release_fd = pipe_fds[1]; - return 0; -} - -static int release_child(struct child_process *child) -{ - char release = 1; - ssize_t count; - - do { - count = write(child->release_fd, &release, sizeof(release)); - } while (count < 0 && errno == EINTR); - close(child->release_fd); - child->release_fd = -1; - if (count != sizeof(release)) - return count < 0 ? -errno : -EIO; - child->released = true; return 0; } -static int child_exit_code(int status) -{ - if (WIFEXITED(status)) - return WEXITSTATUS(status); - if (WIFSIGNALED(status)) - return 128 + WTERMSIG(status); - return 125; -} - -static int reap_child(struct child_process *child, int options) -{ - pid_t result; - - if (child->reaped) - return 1; - do { - result = waitpid(child->pid, &child->status, options); - } while (result < 0 && errno == EINTR); - if (result < 0) - return -errno; - if (result == 0) - return 0; - child->reaped = true; - return 1; -} - static int drain_events(struct ring_buffer *ring_buffer) { int error; @@ -738,21 +634,7 @@ static int handle_event(void *context, void *data, size_t size) return 0; } -static void stop_child(struct child_process *child) -{ - if (child->reaped || child->pid <= 0) - return; - if (!child->released && child->release_fd >= 0) { - close(child->release_fd); - child->release_fd = -1; - } else { - kill(child->pid, SIGKILL); - } - (void)reap_child(child, 0); -} - -static int setup_inspector(const struct child_process *child, - struct event_context *events, +static int setup_inspector(struct event_context *events, struct exec_image_inspector_bpf **skeleton, struct ring_buffer **ring_buffer) { @@ -766,12 +648,16 @@ static int setup_inspector(const struct child_process *child, return -ENOMEM; } *skeleton = skel; - skel->rodata->target_tgid = child->pid; skel->rodata->probe_offset = env.probe_offset; error = exec_image_inspector_bpf__load(skel); if (error) { - fprintf(stderr, "failed to load BPF object: %s\n", strerror(-error)); + fprintf(stderr, + "failed to load BPF object: %s\n" + "This monitor requires Linux 6.19+, BTF, BPF JIT, " + "CONFIG_BPF_LSM=y, and an active bpf LSM.\n" + "Check the active list with: cat /sys/kernel/security/lsm\n", + strerror(-error)); return error; } error = exec_image_inspector_bpf__attach(skel); @@ -791,155 +677,107 @@ static int setup_inspector(const struct child_process *child, return 0; } -static int reap_timed_out_child(struct child_process *child) -{ - int error; - - if (child->reaped) - return 0; - - fprintf(stderr, "command exceeded timeout; sending SIGKILL\n"); - kill(child->pid, SIGKILL); - error = reap_child(child, 0); - if (error < 0) { - fprintf(stderr, "waitpid after timeout failed: %s\n", - strerror(-error)); - return error; - } - return 0; -} - -static int wait_for_command(struct ring_buffer *ring_buffer, - struct child_process *child, - const struct event_context *events) +static int monitor_execs(struct ring_buffer *ring_buffer) { - long long deadline, now; int error; - printf("READY target_tgid=%d probe_offset=%llu timeout_ms=%u command=%s\n", - child->pid, env.probe_offset, env.timeout_ms, env.command[0]); + printf("READY scope=system-wide probe_offset=%llu\n", env.probe_offset); fflush(stdout); - error = release_child(child); - if (error) { - fprintf(stderr, "failed to release command process: %s\n", - strerror(-error)); - return error; - } - - now = monotonic_milliseconds(); - if (now < 0) { - fprintf(stderr, "failed to read monotonic clock: %s\n", - strerror((int)-now)); - return (int)now; - } - deadline = now + env.timeout_ms; - - for (;;) { - error = ring_buffer__poll(ring_buffer, 50); + while (!exiting) { + error = ring_buffer__poll(ring_buffer, 100); if (error == -EINTR) continue; if (error < 0) { fprintf(stderr, "ring-buffer poll failed: %s\n", strerror(-error)); return error; } + } + return 0; +} + +static int drain_pending_events(struct ring_buffer *ring_buffer, + const struct exec_image_inspector_bpf *skel) +{ + int attempts, error; - error = reap_child(child, WNOHANG); + for (attempts = 0; attempts < 10; attempts++) { + if (skel->bss->stats.completed >= skel->bss->stats.scheduled) + return drain_events(ring_buffer); + error = ring_buffer__poll(ring_buffer, 100); + if (error == -EINTR) + continue; if (error < 0) { - fprintf(stderr, "waitpid failed: %s\n", strerror(-error)); + fprintf(stderr, "ring-buffer shutdown poll failed: %s\n", + strerror(-error)); return error; } - if (child->reaped && events->seen) - break; - - now = monotonic_milliseconds(); - if (now < 0) - return (int)now; - if (now >= deadline) - break; - if (child->reaped && !events->seen) - continue; } - error = reap_timed_out_child(child); - if (error) - return error; - error = drain_events(ring_buffer); - if (error) - return error; - return child_exit_code(child->status); + fprintf(stderr, "timed out waiting for %llu scheduled callbacks\n", + skel->bss->stats.scheduled - skel->bss->stats.completed); + return -ETIMEDOUT; } -static int report_result(const struct exec_image_inspector_bpf *skel, - const struct event_context *events, int command_exit) +static void report_result(const struct exec_image_inspector_bpf *skel, + const struct event_context *events) { struct inspector_stats final_stats = skel->bss->stats; printf("SUMMARY matched=%llu scheduled=%llu schedule_errors=%llu " - "callbacks=%llu header_errors=%llu path_errors=%llu " + "callbacks=%llu completed=%llu header_errors=%llu path_errors=%llu " "direct_probes=%llu direct_probe_errors=%llu " "deferred_probes=%llu deferred_probe_errors=%llu dropped=%llu " - "events=%u command_exit=%d\n", + "cleanup_errors=%llu events=%llu\n", final_stats.matched, final_stats.scheduled, final_stats.schedule_errors, final_stats.callbacks, - final_stats.header_errors, final_stats.path_errors, + final_stats.completed, final_stats.header_errors, + final_stats.path_errors, final_stats.direct_probes, final_stats.direct_probe_errors, final_stats.deferred_probes, final_stats.deferred_probe_errors, - final_stats.dropped, events->seen, command_exit); - - if (!events->seen) { - fprintf(stderr, "no executable image event was observed\n"); - return 1; - } - if (command_exit) { - fprintf(stderr, "command exited with status %d\n", command_exit); - return command_exit; - } - return 0; + final_stats.dropped, final_stats.cleanup_errors, events->seen); } int main(int argc, char **argv) { struct exec_image_inspector_bpf *skel = NULL; - struct child_process child = { .release_fd = -1 }; struct event_context events = {}; struct ring_buffer *ring_buffer = NULL; - int command_exit, error, result = 1; + int error, result = 1; error = parse_args(argc, argv); if (error) { - usage(argv[0]); + usage(stderr, argv[0]); return 2; } - - libbpf_set_print(libbpf_print_fn); - error = start_blocked_child(&child); + error = install_signal_handlers(); if (error) { - fprintf(stderr, "failed to create command process: %s\n", + fprintf(stderr, "failed to install signal handlers: %s\n", strerror(-error)); return 1; } - error = setup_inspector(&child, &events, &skel, &ring_buffer); + libbpf_set_print(libbpf_print_fn); + error = setup_inspector(&events, &skel, &ring_buffer); if (error) goto cleanup; - command_exit = wait_for_command(ring_buffer, &child, &events); - if (command_exit < 0) - goto cleanup; - result = report_result(skel, &events, command_exit); + error = monitor_execs(ring_buffer); + exec_image_inspector_bpf__detach(skel); + if (!error) + error = drain_pending_events(ring_buffer, skel); + report_result(skel, &events); + if (!error) + result = 0; cleanup: - stop_child(&child); ring_buffer__free(ring_buffer); exec_image_inspector_bpf__destroy(skel); return result; } ``` -The core technique is the blocked-child handshake. `start_blocked_child` forks before BPF setup, but the child blocks on a pipe read. The parent notes the child's PID, opens the skeleton, writes `target_tgid`, loads and attaches, creates the ring buffer, and only then calls `release_child` to write to the pipe and let the child proceed to `execvp`. +`setup_inspector` opens, configures, loads, and attaches the skeleton before creating the ring buffer. `monitor_execs` prints `READY`, then polls until SIGINT or SIGTERM. There is no required timeout and no `-- COMMAND` child-launch mode. -`wait_for_command` is the main loop. It prints a `READY` line, releases the child, then alternates between polling the ring buffer and checking whether the child has exited. The loop ends when the child is reaped and at least one event has arrived, or when the timeout expires. After timeout, `reap_timed_out_child` sends SIGKILL and waits. - -A single exec might trigger multiple events if the command itself execs (for example, `/bin/sh -c 'exec /bin/true'`). After the child exits, `drain_events` does a zero-timeout poll to collect any remaining events. +On shutdown, `main` detaches first. `drain_pending_events` then waits in bounded 100 ms polls for `completed` to catch up with `scheduled`, drains the ring buffer, and reports all counters before resources are destroyed. `handle_event` formats the output, translating numeric ELF values to readable names while preserving the raw values for scripting. @@ -968,44 +806,36 @@ cd src/54-exec-image-inspector sudo make test ``` -The repository CI only compiles this lesson. Runtime behavior was functionally tested on x86_64 with kernel `7.0.0-rc2+`. Sample output: +The repository CI compiles this lesson. Runtime behavior was also functionally tested in the tutorial KVM on x86_64 with kernel `7.2.0-rc4`. A shortened sample is: ```text -TEST-MISSING matched=0 events=0 command_exit=127 -TEST-TIMEOUT matched=1 callbacks=1 events=1 command_exit=137 -TEST-REEXEC matched=2 callbacks=2 events=2 command_exit=0 final_path=/usr/bin/true -READY target_tgid=1265 probe_offset=4214784 timeout_ms=3000 command=/tmp/exec-image-inspector-sxm3lumw/exec_fixture_image -EXEC pid=1265 tgid=1265 comm=exec_fixture_im path=/tmp/exec-image-inspector-sxm3lumw/exec_fixture_image is_elf=1 class=ELF64 endian=LSB type=ET_DYN(3) machine=EM_X86_64(62) header_error=0 path_error=0 latency_us=37 +TEST-CONTINUOUS workers=16 matched=18 callbacks=18 events=18 +READY scope=system-wide probe_offset=4214784 +EXEC pid=... tgid=... comm=exec_fixture_im path=/tmp/.../exec_fixture_image is_elf=1 class=ELF64 endian=LSB type=ET_DYN(3) machine=EM_X86_64(62) header_error=0 path_error=0 latency_us=... PROBE offset=4214784 direct_error=-14 deferred_error=0 bytes=454950524f424521 -exec fixture completed -SUMMARY matched=1 scheduled=1 schedule_errors=0 callbacks=1 header_errors=0 path_errors=0 direct_probes=1 direct_probe_errors=1 deferred_probes=1 deferred_probe_errors=0 dropped=0 events=1 command_exit=0 -PASS: missing-command, timeout cleanup, re-exec drain, ELF decode, and deferred file read succeeded +SUMMARY matched=18 scheduled=18 schedule_errors=0 callbacks=18 completed=18 header_errors=0 path_errors=0 direct_probes=18 direct_probe_errors=18 deferred_probes=18 deferred_probe_errors=2 dropped=0 cleanup_errors=0 events=18 +PASS: persistent monitoring, concurrent execs, signal cleanup, ELF decode, and deferred file reads succeeded ``` -The first three test lines cover boundary conditions: - -- **TEST-MISSING**: A nonexistent command exits with status 127. The LSM hook never fires because exec fails before credentials are committed, so `matched=0` and `events=0`. -- **TEST-TIMEOUT**: The command runs too long, gets SIGKILL, and is reaped with status 137 (128 + 9). One exec event was observed. -- **TEST-REEXEC**: A shell command that uses `exec` internally produces two events, and the final path is `/usr/bin/true`. +The test starts the monitor, waits for `READY`, launches 16 fixture processes concurrently plus a shell that re-execs `/bin/true`, and stops the monitor with SIGINT. It checks `scheduled == callbacks == completed == events`, with zero scheduling, drop, or cleanup errors. It also verifies that the obsolete `--timeout-ms` and `-- COMMAND` interface is rejected. The `EXEC` line shows the installed image and parsed ELF fields. The `PROBE` line demonstrates the sleepable-context difference: the test writes a marker (`EIPROBE!`) to a page, flushes and evicts it from the page cache, then execs. The direct read in the non-sleepable hook returns `-EFAULT` (`-14`) because the page is cold. The deferred read in the sleepable callback succeeds, returning the marker bytes as hex (`454950524f424521`). -To inspect a simple command: +To monitor subsequent execs system-wide: ```bash -sudo ./exec_image_inspector --timeout-ms 3000 -- /bin/true +sudo ./exec_image_inspector ``` Command-line format: ```text -exec_image_inspector [--probe-offset BYTES] [--timeout-ms MS] [--verbose] -- COMMAND [ARG...] +exec_image_inspector [--probe-offset BYTES] [--verbose] ``` -- `--timeout-ms`: 100 to 60000 milliseconds (default 5000). The tool kills and reaps the command after this deadline. - `--probe-offset`: Read 8 bytes at this offset both in the hook (direct) and in the callback (deferred), to verify the cold-page difference. - `--verbose`: Print libbpf diagnostic messages. -- `--`: Separates inspector options from the command to run. +- Ctrl-C or SIGTERM: Stop admission, wait for scheduled callbacks, drain events, print `SUMMARY`, and unload. ### Requirements @@ -1019,13 +849,13 @@ exec_image_inspector [--probe-offset BYTES] [--timeout-ms MS] [--verbose] -- COM ## Limitations and extensions -This tool observes one direct child per invocation, using a single map slot. For concurrent services, you would allocate per-task state, implement admission limits, and handle callback reclamation. Timeout cleanup sends SIGKILL to the child only; callers needing process-group management or external signal handling would add those features. +This tool observes successful execs system-wide after `READY`. The pending HASH map supports up to 4096 concurrent `pid_tgid` keys; insertion or scheduling pressure is visible in `schedule_errors`. Shutdown waits for callbacks for about one second before returning an error rather than destroying live callback state silently. `--probe-offset` is an advanced diagnostic for comparing cold-page behavior, not a workload filter. ## Summary -This tutorial demonstrates how to combine BPF task work and file dynptr to inspect the executable image actually installed by exec. The key insight is separating two moments: identifying the target (in a non-sleepable LSM hook) and reading file content (in a sleepable task work callback). This lets eBPF programs read file data reliably, even when the target bytes are not in the page cache. +This tutorial demonstrates how to combine BPF task work and file dynptr to inspect the executable image actually installed by exec. The key insight is separating two moments: admitting an exec (in a non-sleepable LSM hook) and reading file content (in a sleepable task work callback). This lets eBPF programs read file data reliably, even when the target bytes are not in the page cache. -The blocked-child handshake eliminates attach races, bounded execution ensures cleanup, and the final drain captures all events. Together, these techniques produce a reproducible single-command tool while leaving room for extension. +The persistent monitor exposes a natural `READY` boundary for independent workloads. Detach-before-drain shutdown, per-exec pending state, and completed-work accounting keep concurrent callbacks safe while preserving the original task-work and file-dynptr lesson. > To learn more about eBPF, visit our tutorial repository at or . diff --git a/src/54-exec-image-inspector/README.zh.md b/src/54-exec-image-inspector/README.zh.md index f3cd433e..33564735 100644 --- a/src/54-exec-image-inspector/README.zh.md +++ b/src/54-exec-image-inspector/README.zh.md @@ -2,7 +2,7 @@ 当进程调用 `execve` 时,内核会用新的可执行镜像替换它的内存映像。但具体是哪个可执行文件?如果命令行显示 `/usr/bin/wrapper.sh --config /etc/app.conf`,实际运行的代码可能是三层包装脚本深处的 Python 解释器或编译好的二进制。安全工具、容器运行时、故障排查工具都需要知道内核 *实际* 安装的是什么,而不仅仅是用户输入的命令行。 -本教程构建一个在内核层面捕获这些信息的工具。它在 exec 提交凭据后挂载钩子,安排一个延迟回调,然后读取已安装可执行文件的 ELF 头部,报告其架构、字节序和文件类型。过程中会演示两个较新的内核特性(BPF task work 和 file dynptr),它们组合起来可以解决传统 eBPF 方案无法处理的问题。 +本教程构建一个持续运行、在内核层面捕获这些信息的工具。它在每次成功 exec 提交凭据后触发钩子,安排一个延迟回调,然后读取已安装可执行文件的 ELF 头部,报告其架构、字节序和文件类型。过程中会演示两个较新的内核特性(BPF task work 和 file dynptr),它们组合起来可以解决传统 eBPF 方案无法处理的问题。 > 完整源码: @@ -14,6 +14,8 @@ Tracepoint 和 kprobe 可以钩住 `sched_process_exec` 同步观察 exec 事件,但这些钩子运行在内核所谓的**不可睡眠上下文**中。为什么这很重要?这涉及到 Linux 如何管理内存中的文件数据。 +本教程使用 LSM 还有一个更严格的原因:内核只允许 BPF LSM 程序调用 `bpf_get_task_exe_file`、`bpf_put_file` 和 `bpf_path_d_path`。`sched_process_exec` tracepoint 可以报告基本 exec 元数据,却不能调用这些 kfunc;它借用的 `bprm->file` 也不能跨异步 task-work 边界保留。没有 BPF LSM,这套设计无法为延迟冷页读取可靠地取得已安装的可执行文件和路径。 + 当你读取文件时,内核首先检查请求的字节是否已经在**页缓存**(page cache)中,这是一块缓存最近访问过的文件数据的内存区域。如果在,读取立即完成。如果不在(即**冷页**),内核必须向存储设备发起 I/O 请求,调用上下文必须**睡眠**等待 I/O 完成。 挂载在 tracepoint 和 kprobe 上的 BPF 程序不能睡眠。它们运行时可能中断被禁用、持有锁;如果睡眠会导致系统死锁。当 BPF 程序尝试读取文件内容遇到冷页时,读取会以 `-EFAULT` 失败,而不是等待 I/O。 @@ -28,17 +30,17 @@ Linux 6.19 引入了 **file dynptr**,提供验证器跟踪的文件数据访 结合这两个特性,设计变成: -1. 在 `bprm_committed_creds` 挂载 LSM 钩子,它在 exec 安装新凭据后触发 -2. 在钩子中(不可睡眠)识别目标进程并安排 task work 回调 +1. 在 `bprm_committed_creds` 挂载 LSM 钩子,它在每次成功 exec 安装新凭据后触发 +2. 在钩子中(不可睡眠)创建每次 exec 独立的状态并安排 task work 回调 3. 回调在可睡眠上下文中执行,可以访问已安装的可执行文件、读取任意偏移的内容(包括冷页)、然后把结果发送给用户态 -这种分离(在不可睡眠的钩子中识别目标,在可睡眠的回调中完成重活)是关键思路。 +这种分离(在不可睡眠的钩子中接收 exec,在可睡眠的回调中完成重活)是关键思路。 ## BPF task work 的工作机制 调用 `bpf_task_work_schedule_signal(task, work, map, callback)` 时,内核把你的回调关联到指定的任务。回调不会立即执行;它会稍后在该任务返回用户态之前的某个安全点执行。 -`struct bpf_task_work` 是一个不透明结构,内核用它来追踪已安排的回调。BPF 程序只需为它分配存储空间,不解释其内容。本工具使用单元素 ARRAY map 保存 `struct exec_work`,其中包含 `bpf_task_work` 存储以及时间戳和中间结果字段。 +`struct bpf_task_work` 是一个不透明结构,内核用它来追踪已安排的回调。BPF 程序只需为它分配存储空间,不解释其内容。本工具使用以 `pid_tgid` 为键的 HASH map;每个 `struct exec_work` 值包含 `bpf_task_work` 存储以及时间戳和中间结果字段。不同 key 让并发 exec 互不干扰。 回调签名是 `int callback(struct bpf_map *map, void *key, void *value)`。`value` 参数指向包含你的 `bpf_task_work` 的 map 元素,所以你可以通过周围的字段从调度钩子向回调传递数据。 @@ -56,18 +58,11 @@ dynptr 用边界信息包装指针,BPF 验证器可以追踪这些边界。对 ## 工具架构 -用户态程序 fork 出一个子进程,但在子进程调用 `execvp` 之前用管道阻塞它。这给父进程时间去: - -1. 记录子进程的 PID(它会成为 TGID,线程组 ID) -2. 打开 BPF skeleton 并把目标 TGID 写入只读数据段 -3. 加载并挂载 BPF 程序 -4. 创建 ring buffer reader - -只有这些都完成后,父进程才通过写管道来释放子进程。这个握手消除了竞态条件:没有它的话,快速退出的命令可能在 BPF 程序挂载之前就结束了。 +用户态程序加载并挂载 BPF 程序,创建 ring buffer reader,然后打印 `READY scope=system-wide`。之后它会持续运行到收到 SIGINT 或 SIGTERM,因此 workload 可以在就绪后独立启动,不需要通过特殊的子命令接口运行。 -当子进程调用 `execvp` 时,`lsm/bprm_committed_creds` 钩子触发。BPF 程序比较当前 TGID 与配置的目标;如果匹配,它记录时间戳并安排 task work 回调。 +`READY` 之后每次成功 exec 都会触发 `lsm/bprm_committed_creds`。钩子以当前 `pid_tgid` 为键向 `pending` HASH map 插入一个 `exec_work`,记录时间戳并安排 task work 回调。插入或调度失败都会被计数并清理对应 map 条目。 -回调 `inspect_executable` 在子进程的可睡眠上下文中执行。它: +回调 `inspect_executable` 稍后在执行 exec 的任务的可睡眠上下文中运行。它: 1. 调用 `bpf_get_task_exe_file` 获取已安装的可执行文件(返回一个带引用的 `struct file`,必须用 `bpf_put_file` 释放) 2. 用 `bpf_path_d_path` 解析路径 @@ -75,7 +70,7 @@ dynptr 用边界信息包装指针,BPF 验证器可以追踪这些边界。对 4. 解析 ELF 字段:魔数、class(32/64 位)、data(字节序)、type(可执行文件 vs 共享对象)、machine(架构) 5. 通过 ring buffer 发送事件 -用户态一边轮询 ring buffer 一边检查子进程是否已退出。单个子进程可能多次 exec(例如 `/bin/sh -c 'exec /bin/true'` 先 exec shell,然后 exec `/bin/true`),所以在子进程退出后,工具会取尽 ring buffer 中的剩余事件。 +用户态轮询 ring buffer,直到收到信号。关闭时先解除 LSM 挂载,阻止接收新的 exec;再等待 `completed >= scheduled`,排空剩余事件,打印稳定计数,最后销毁 skeleton。这个顺序避免排队中的回调晚于 map 或 ring buffer 的生命周期。 ![exec 镜像检查器数据流](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/54-exec-image-inspector/exec-image-flow.png) @@ -121,6 +116,7 @@ struct inspector_stats { unsigned long long scheduled; unsigned long long schedule_errors; unsigned long long callbacks; + unsigned long long completed; unsigned long long header_errors; unsigned long long path_errors; unsigned long long direct_probes; @@ -128,6 +124,7 @@ struct inspector_stats { unsigned long long deferred_probes; unsigned long long deferred_probe_errors; unsigned long long dropped; + unsigned long long cleanup_errors; }; #endif /* __EXEC_IMAGE_INSPECTOR_H */ @@ -196,7 +193,6 @@ char LICENSE[] SEC("license") = "GPL"; #define ELFDATA2LSB 1 #define ELFDATA2MSB 2 -const volatile __u32 target_tgid; const volatile __u32 probe_offset; struct inspector_stats stats; @@ -213,9 +209,10 @@ struct exec_work { }; struct { - __uint(type, BPF_MAP_TYPE_ARRAY); - __uint(max_entries, 1); - __type(key, __u32); + __uint(type, BPF_MAP_TYPE_HASH); + __uint(map_flags, BPF_F_NO_PREALLOC); + __uint(max_entries, 4096); + __type(key, __u64); __type(value, struct exec_work); } pending SEC(".maps"); @@ -256,91 +253,106 @@ record: return err; } -static int inspect_executable(struct bpf_map *map, void *key, void *value) +static __always_inline void record_header_error(struct exec_event *event, int err) { - unsigned char header[64] = {}; - struct exec_work *work = value; - struct exec_event event = {}; - struct task_struct *task; - struct bpf_dynptr dynptr; - struct file *file; - __u64 pid_tgid; - int err; + event->header_error = err; + __sync_fetch_and_add(&stats.header_errors, 1); +} - (void)map; - (void)key; - __sync_fetch_and_add(&stats.callbacks, 1); +static __always_inline void record_deferred_probe(struct exec_event *event, + int err) +{ + if (!probe_offset) + return; - pid_tgid = bpf_get_current_pid_tgid(); - event.pid = (__u32)pid_tgid; - event.tgid = pid_tgid >> 32; - event.latency_ns = bpf_ktime_get_ns() - work->scheduled_ns; - event.direct_probe_error = work->direct_probe_error; - event.probe_offset = probe_offset; - bpf_get_current_comm(event.comm, sizeof(event.comm)); + event->deferred_probe_error = err; + __sync_fetch_and_add(&stats.deferred_probes, 1); + if (err) + __sync_fetch_and_add(&stats.deferred_probe_errors, 1); +} - task = bpf_get_current_task_btf(); - file = bpf_get_task_exe_file(task); - if (!file) { - event.header_error = -ENOENT; - __sync_fetch_and_add(&stats.header_errors, 1); - if (probe_offset) { - event.deferred_probe_error = -ENOENT; - __sync_fetch_and_add(&stats.deferred_probes, 1); - __sync_fetch_and_add(&stats.deferred_probe_errors, 1); - } - goto emit; - } +static __always_inline void parse_elf_header(const unsigned char *header, + struct exec_event *event) +{ + if (event->header_error || header[0] != 0x7f || header[1] != 'E' || + header[2] != 'L' || header[3] != 'F') + return; - err = bpf_path_d_path(&file->f_path, event.path, sizeof(event.path)); + event->is_elf = 1; + event->elf_class = header[EI_CLASS]; + event->elf_data = header[EI_DATA]; + event->elf_type = read_elf_u16(header, 16, event->elf_data); + event->elf_machine = read_elf_u16(header, 18, event->elf_data); +} + +static __always_inline void inspect_file(struct file *file, + struct exec_event *event) +{ + unsigned char header[64] = {}; + struct bpf_dynptr dynptr; + int err; + + err = bpf_path_d_path(&file->f_path, event->path, sizeof(event->path)); if (err < 0) { - event.path_error = err; + event->path_error = err; __sync_fetch_and_add(&stats.path_errors, 1); } err = bpf_dynptr_from_file(file, 0, &dynptr); if (err) { bpf_dynptr_file_discard(&dynptr); - event.header_error = err; - __sync_fetch_and_add(&stats.header_errors, 1); - if (probe_offset) { - event.deferred_probe_error = err; - __sync_fetch_and_add(&stats.deferred_probes, 1); - __sync_fetch_and_add(&stats.deferred_probe_errors, 1); - } - goto put_file; + record_header_error(event, err); + record_deferred_probe(event, err); + return; } err = bpf_dynptr_read(header, sizeof(header), &dynptr, 0, 0); - if (err) { - event.header_error = err; - __sync_fetch_and_add(&stats.header_errors, 1); - } + if (err) + record_header_error(event, err); if (probe_offset) { - __sync_fetch_and_add(&stats.deferred_probes, 1); - err = bpf_dynptr_read(event.probe_bytes, sizeof(event.probe_bytes), + err = bpf_dynptr_read(event->probe_bytes, + sizeof(event->probe_bytes), &dynptr, probe_offset, 0); - event.deferred_probe_error = err; - if (err) - __sync_fetch_and_add(&stats.deferred_probe_errors, 1); + record_deferred_probe(event, err); } bpf_dynptr_file_discard(&dynptr); + parse_elf_header(header, event); +} + +static int inspect_executable(struct bpf_map *map, void *key, void *value) +{ + struct exec_work *work = value; + struct exec_event event = {}; + struct task_struct *task; + struct file *file; + __u64 pid_tgid; - if (!event.header_error && header[0] == 0x7f && header[1] == 'E' && - header[2] == 'L' && header[3] == 'F') { - event.is_elf = 1; - event.elf_class = header[EI_CLASS]; - event.elf_data = header[EI_DATA]; - event.elf_type = read_elf_u16(header, 16, event.elf_data); - event.elf_machine = read_elf_u16(header, 18, event.elf_data); + __sync_fetch_and_add(&stats.callbacks, 1); + pid_tgid = bpf_get_current_pid_tgid(); + event.pid = (__u32)pid_tgid; + event.tgid = pid_tgid >> 32; + event.latency_ns = bpf_ktime_get_ns() - work->scheduled_ns; + event.direct_probe_error = work->direct_probe_error; + event.probe_offset = probe_offset; + bpf_get_current_comm(event.comm, sizeof(event.comm)); + + task = bpf_get_current_task_btf(); + file = bpf_get_task_exe_file(task); + if (!file) { + record_header_error(&event, -ENOENT); + record_deferred_probe(&event, -ENOENT); + goto emit; } -put_file: + inspect_file(file, &event); bpf_put_file(file); emit: if (bpf_ringbuf_output(&events, &event, sizeof(event), 0)) __sync_fetch_and_add(&stats.dropped, 1); + if (bpf_map_delete_elem(map, key)) + __sync_fetch_and_add(&stats.cleanup_errors, 1); + __sync_fetch_and_add(&stats.completed, 1); return 0; } @@ -348,20 +360,25 @@ SEC("lsm/bprm_committed_creds") void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) { struct task_struct *task; + struct exec_work empty_work = {}; struct exec_work *work; __u64 pid_tgid; - __u32 key = 0, tgid; + __u64 key; int err; pid_tgid = bpf_get_current_pid_tgid(); - tgid = pid_tgid >> 32; - if (target_tgid && tgid != target_tgid) - return; - + key = pid_tgid; __sync_fetch_and_add(&stats.matched, 1); + err = bpf_map_update_elem(&pending, &key, &empty_work, BPF_NOEXIST); + if (err) { + __sync_fetch_and_add(&stats.schedule_errors, 1); + return; + } work = bpf_map_lookup_elem(&pending, &key); if (!work) { __sync_fetch_and_add(&stats.schedule_errors, 1); + if (bpf_map_delete_elem(&pending, &key)) + __sync_fetch_and_add(&stats.cleanup_errors, 1); return; } @@ -372,29 +389,31 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) inspect_executable); if (err) { __sync_fetch_and_add(&stats.schedule_errors, 1); + if (bpf_map_delete_elem(&pending, &key)) + __sync_fetch_and_add(&stats.cleanup_errors, 1); return; } __sync_fetch_and_add(&stats.scheduled, 1); } ``` -入口点是用 `SEC("lsm/bprm_committed_creds")` 声明的 `schedule_exec_inspection`。这个 LSM 钩子在新可执行文件的凭据安装后触发,此时 `bprm->file` 指向正在被执行的文件。钩子本身不可睡眠,但可以识别目标并安排延迟工作。 +入口点是用 `SEC("lsm/bprm_committed_creds")` 声明的 `schedule_exec_inspection`。这个 LSM 钩子在新可执行文件的凭据安装后触发,此时 `bprm->file` 指向正在被执行的文件。钩子本身不可睡眠,但可以接收这次 exec 并安排延迟工作。 -两个 `const volatile` 变量(`target_tgid` 和 `probe_offset`)位于 `.rodata` 段。用户态在 `open()` 和 `load()` 之间写入值,验证器把它们当作编译期常量来优化。 +可选的 `probe_offset` 变量位于 `.rodata` 段。用户态在 `open()` 和 `load()` 之间写入值,验证器把它当作编译期常量来优化。 -当目标匹配时,程序从单元素 `pending` ARRAY map 查找 `struct exec_work`。这个结构保存 `bpf_task_work` 存储以及时间戳和可选的直接探测结果。单个槽位就够了,因为本工具每次调用只观察一个子进程。 +每次 exec 都会用 `BPF_NOEXIST` 向 `pending` HASH map 插入清零的 `struct exec_work`,key 是 `pid_tgid`,然后查找该值并填入时间戳和可选直接探测结果。回调删除同一个 key,因此并发 exec 不会共享一个 task-work 槽位。 可选的 `--probe-offset` 标志让工具通过 `probe_file_without_sleep` 在不可睡眠的钩子中尝试直接读取。测试套件用这个来验证:读取冷页在不可睡眠上下文中以 `-EFAULT` 失败,但在可睡眠回调中成功。 -保存时间戳和直接探测结果后,钩子调用 `bpf_task_work_schedule_signal`。内核持有稍后执行回调所需的引用。 +保存时间戳和直接探测结果后,钩子调用 `bpf_task_work_schedule_signal`。内核持有稍后执行回调所需的引用。插入、查找或调度失败都会被计数;任何已经创建 pending 状态的失败路径都会删除它。 回调 `inspect_executable` 计算延迟用于诊断,然后用 `bpf_get_task_exe_file` 获取可执行文件。这返回一个带引用的 `struct file`,必须用 `bpf_put_file` 释放。回调解析路径、创建 file dynptr、读取 64 字节 ELF 头部并解析它。`read_elf_u16` 辅助函数处理字节序:ELF 文件在头部声明其字节序,多字节字段必须相应地读取。 -每条创建 dynptr 的路径(无论成功还是失败)都必须调用 `bpf_dynptr_file_discard`。最后,`bpf_ringbuf_output` 把事件发送给用户态。 +每条创建 dynptr 的路径(无论成功还是失败)都必须调用 `bpf_dynptr_file_discard`。最后,`bpf_ringbuf_output` 把事件发送给用户态,回调删除 pending 条目并增加 `completed`,使关闭流程等待真正完成的工作,而不只是已调度的工作。 ### 用户态加载器 -`exec_image_inspector.c` 协调子进程、加载 BPF、接收事件、报告结果: +`exec_image_inspector.c` 加载 BPF、持续接收事件、处理信号并报告结果: ```c // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) @@ -403,13 +422,9 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) #include #include #include -#include #include #include #include -#include -#include -#include #include #include #include "exec_image_inspector.h" @@ -417,26 +432,15 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) struct environment { unsigned long long probe_offset; - unsigned int timeout_ms; bool verbose; - char **command; -}; - -struct child_process { - pid_t pid; - int release_fd; - bool released; - bool reaped; - int status; }; struct event_context { - unsigned int seen; + unsigned long long seen; }; -static struct environment env = { - .timeout_ms = 5000, -}; +static struct environment env; +static volatile sig_atomic_t exiting; static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) @@ -446,40 +450,28 @@ static int libbpf_print_fn(enum libbpf_print_level level, const char *format, return vfprintf(stderr, format, args); } -static void usage(const char *program) +static void usage(FILE *stream, const char *program) { - fprintf(stderr, - "Usage: %s [--probe-offset BYTES] [--timeout-ms MS] [--verbose] " - "-- COMMAND [ARG...]\n\n" - "Inspect the executable image installed by one command.\n\n" + fprintf(stream, + "Usage: %s [--probe-offset BYTES] [--verbose]\n\n" + "Continuously inspect executable images installed by exec.\n" + "Press Ctrl-C to stop and print a summary.\n\n" "Options:\n" - " -p, --probe-offset BYTES also compare direct/deferred file reads\n" - " -t, --timeout-ms MS bound the command, 100-60000 " - "(default: 5000)\n" + " -p, --probe-offset BYTES compare reads at a positive offset\n" " -v, --verbose print libbpf diagnostics\n" " -h, --help show this help\n", program); } -static int parse_u64(const char *value, unsigned long long maximum, - unsigned long long *result) +static int parse_probe_offset(const char *value) { char *end = NULL; unsigned long long parsed; errno = 0; parsed = strtoull(value, &end, 10); - if (errno || end == value || *end || parsed > maximum) - return -EINVAL; - *result = parsed; - return 0; -} - -static int parse_probe_offset(const char *value) -{ - unsigned long long parsed; - - if (parse_u64(value, UINT_MAX - EXEC_PROBE_LEN, &parsed)) { + if (errno || end == value || *end || !parsed || + parsed > UINT_MAX - EXEC_PROBE_LEN) { fprintf(stderr, "invalid probe offset: %s\n", value); return -EINVAL; } @@ -487,154 +479,58 @@ static int parse_probe_offset(const char *value) return 0; } -static int parse_timeout(const char *value) -{ - unsigned long long parsed; - - if (parse_u64(value, 60000, &parsed) || parsed < 100) { - fprintf(stderr, "invalid timeout in milliseconds: %s\n", value); - return -EINVAL; - } - env.timeout_ms = parsed; - return 0; -} - -static int parse_option(int option, const char *program) -{ - switch (option) { - case 'p': - return parse_probe_offset(optarg); - case 't': - return parse_timeout(optarg); - case 'v': - env.verbose = true; - return 0; - case 'h': - usage(program); - exit(0); - default: - return -EINVAL; - } -} - static int parse_args(int argc, char **argv) { static const struct option options[] = { { "probe-offset", required_argument, NULL, 'p' }, - { "timeout-ms", required_argument, NULL, 't' }, { "verbose", no_argument, NULL, 'v' }, { "help", no_argument, NULL, 'h' }, {}, }; - int error, option; + int option; - while ((option = getopt_long(argc, argv, "+p:t:vh", options, NULL)) != -1) { - error = parse_option(option, argv[0]); - if (error) - return error; + while ((option = getopt_long(argc, argv, "+p:vh", options, NULL)) != -1) { + switch (option) { + case 'p': + if (parse_probe_offset(optarg)) + return -EINVAL; + break; + case 'v': + env.verbose = true; + break; + case 'h': + usage(stdout, argv[0]); + exit(0); + default: + return -EINVAL; + } } - if (optind == argc) { - fprintf(stderr, "COMMAND is required\n"); + if (optind != argc) { + fprintf(stderr, "unexpected argument: %s\n", argv[optind]); return -EINVAL; } - env.command = &argv[optind]; return 0; } -static long long monotonic_milliseconds(void) +static void handle_signal(int signal_number) { - struct timespec timestamp; - - if (clock_gettime(CLOCK_MONOTONIC, ×tamp)) - return -errno; - return timestamp.tv_sec * 1000LL + timestamp.tv_nsec / 1000000; + (void)signal_number; + exiting = 1; } -static int start_blocked_child(struct child_process *child) +static int install_signal_handlers(void) { - int pipe_fds[2]; - pid_t pid; + struct sigaction action = { + .sa_handler = handle_signal, + }; - if (pipe(pipe_fds)) + sigemptyset(&action.sa_mask); + if (sigaction(SIGINT, &action, NULL) || sigaction(SIGTERM, &action, NULL)) return -errno; - - pid = fork(); - if (pid < 0) { - int error = -errno; - - close(pipe_fds[0]); - close(pipe_fds[1]); - return error; - } - - if (pid == 0) { - char release; - ssize_t count; - - close(pipe_fds[1]); - do { - count = read(pipe_fds[0], &release, sizeof(release)); - } while (count < 0 && errno == EINTR); - close(pipe_fds[0]); - if (count != sizeof(release)) - _exit(126); - - /* Intentional argv execution; no shell parses the supplied arguments. */ - execvp(env.command[0], env.command); /* Flawfinder: ignore */ - fprintf(stderr, "failed to execute %s: %s\n", env.command[0], - strerror(errno)); - _exit(127); - } - - close(pipe_fds[0]); - child->pid = pid; - child->release_fd = pipe_fds[1]; - return 0; -} - -static int release_child(struct child_process *child) -{ - char release = 1; - ssize_t count; - - do { - count = write(child->release_fd, &release, sizeof(release)); - } while (count < 0 && errno == EINTR); - close(child->release_fd); - child->release_fd = -1; - if (count != sizeof(release)) - return count < 0 ? -errno : -EIO; - child->released = true; return 0; } -static int child_exit_code(int status) -{ - if (WIFEXITED(status)) - return WEXITSTATUS(status); - if (WIFSIGNALED(status)) - return 128 + WTERMSIG(status); - return 125; -} - -static int reap_child(struct child_process *child, int options) -{ - pid_t result; - - if (child->reaped) - return 1; - do { - result = waitpid(child->pid, &child->status, options); - } while (result < 0 && errno == EINTR); - if (result < 0) - return -errno; - if (result == 0) - return 0; - child->reaped = true; - return 1; -} - static int drain_events(struct ring_buffer *ring_buffer) { int error; @@ -738,21 +634,7 @@ static int handle_event(void *context, void *data, size_t size) return 0; } -static void stop_child(struct child_process *child) -{ - if (child->reaped || child->pid <= 0) - return; - if (!child->released && child->release_fd >= 0) { - close(child->release_fd); - child->release_fd = -1; - } else { - kill(child->pid, SIGKILL); - } - (void)reap_child(child, 0); -} - -static int setup_inspector(const struct child_process *child, - struct event_context *events, +static int setup_inspector(struct event_context *events, struct exec_image_inspector_bpf **skeleton, struct ring_buffer **ring_buffer) { @@ -766,12 +648,16 @@ static int setup_inspector(const struct child_process *child, return -ENOMEM; } *skeleton = skel; - skel->rodata->target_tgid = child->pid; skel->rodata->probe_offset = env.probe_offset; error = exec_image_inspector_bpf__load(skel); if (error) { - fprintf(stderr, "failed to load BPF object: %s\n", strerror(-error)); + fprintf(stderr, + "failed to load BPF object: %s\n" + "This monitor requires Linux 6.19+, BTF, BPF JIT, " + "CONFIG_BPF_LSM=y, and an active bpf LSM.\n" + "Check the active list with: cat /sys/kernel/security/lsm\n", + strerror(-error)); return error; } error = exec_image_inspector_bpf__attach(skel); @@ -791,155 +677,107 @@ static int setup_inspector(const struct child_process *child, return 0; } -static int reap_timed_out_child(struct child_process *child) -{ - int error; - - if (child->reaped) - return 0; - - fprintf(stderr, "command exceeded timeout; sending SIGKILL\n"); - kill(child->pid, SIGKILL); - error = reap_child(child, 0); - if (error < 0) { - fprintf(stderr, "waitpid after timeout failed: %s\n", - strerror(-error)); - return error; - } - return 0; -} - -static int wait_for_command(struct ring_buffer *ring_buffer, - struct child_process *child, - const struct event_context *events) +static int monitor_execs(struct ring_buffer *ring_buffer) { - long long deadline, now; int error; - printf("READY target_tgid=%d probe_offset=%llu timeout_ms=%u command=%s\n", - child->pid, env.probe_offset, env.timeout_ms, env.command[0]); + printf("READY scope=system-wide probe_offset=%llu\n", env.probe_offset); fflush(stdout); - error = release_child(child); - if (error) { - fprintf(stderr, "failed to release command process: %s\n", - strerror(-error)); - return error; - } - - now = monotonic_milliseconds(); - if (now < 0) { - fprintf(stderr, "failed to read monotonic clock: %s\n", - strerror((int)-now)); - return (int)now; - } - deadline = now + env.timeout_ms; - - for (;;) { - error = ring_buffer__poll(ring_buffer, 50); + while (!exiting) { + error = ring_buffer__poll(ring_buffer, 100); if (error == -EINTR) continue; if (error < 0) { fprintf(stderr, "ring-buffer poll failed: %s\n", strerror(-error)); return error; } + } + return 0; +} + +static int drain_pending_events(struct ring_buffer *ring_buffer, + const struct exec_image_inspector_bpf *skel) +{ + int attempts, error; - error = reap_child(child, WNOHANG); + for (attempts = 0; attempts < 10; attempts++) { + if (skel->bss->stats.completed >= skel->bss->stats.scheduled) + return drain_events(ring_buffer); + error = ring_buffer__poll(ring_buffer, 100); + if (error == -EINTR) + continue; if (error < 0) { - fprintf(stderr, "waitpid failed: %s\n", strerror(-error)); + fprintf(stderr, "ring-buffer shutdown poll failed: %s\n", + strerror(-error)); return error; } - if (child->reaped && events->seen) - break; - - now = monotonic_milliseconds(); - if (now < 0) - return (int)now; - if (now >= deadline) - break; - if (child->reaped && !events->seen) - continue; } - error = reap_timed_out_child(child); - if (error) - return error; - error = drain_events(ring_buffer); - if (error) - return error; - return child_exit_code(child->status); + fprintf(stderr, "timed out waiting for %llu scheduled callbacks\n", + skel->bss->stats.scheduled - skel->bss->stats.completed); + return -ETIMEDOUT; } -static int report_result(const struct exec_image_inspector_bpf *skel, - const struct event_context *events, int command_exit) +static void report_result(const struct exec_image_inspector_bpf *skel, + const struct event_context *events) { struct inspector_stats final_stats = skel->bss->stats; printf("SUMMARY matched=%llu scheduled=%llu schedule_errors=%llu " - "callbacks=%llu header_errors=%llu path_errors=%llu " + "callbacks=%llu completed=%llu header_errors=%llu path_errors=%llu " "direct_probes=%llu direct_probe_errors=%llu " "deferred_probes=%llu deferred_probe_errors=%llu dropped=%llu " - "events=%u command_exit=%d\n", + "cleanup_errors=%llu events=%llu\n", final_stats.matched, final_stats.scheduled, final_stats.schedule_errors, final_stats.callbacks, - final_stats.header_errors, final_stats.path_errors, + final_stats.completed, final_stats.header_errors, + final_stats.path_errors, final_stats.direct_probes, final_stats.direct_probe_errors, final_stats.deferred_probes, final_stats.deferred_probe_errors, - final_stats.dropped, events->seen, command_exit); - - if (!events->seen) { - fprintf(stderr, "no executable image event was observed\n"); - return 1; - } - if (command_exit) { - fprintf(stderr, "command exited with status %d\n", command_exit); - return command_exit; - } - return 0; + final_stats.dropped, final_stats.cleanup_errors, events->seen); } int main(int argc, char **argv) { struct exec_image_inspector_bpf *skel = NULL; - struct child_process child = { .release_fd = -1 }; struct event_context events = {}; struct ring_buffer *ring_buffer = NULL; - int command_exit, error, result = 1; + int error, result = 1; error = parse_args(argc, argv); if (error) { - usage(argv[0]); + usage(stderr, argv[0]); return 2; } - - libbpf_set_print(libbpf_print_fn); - error = start_blocked_child(&child); + error = install_signal_handlers(); if (error) { - fprintf(stderr, "failed to create command process: %s\n", + fprintf(stderr, "failed to install signal handlers: %s\n", strerror(-error)); return 1; } - error = setup_inspector(&child, &events, &skel, &ring_buffer); + libbpf_set_print(libbpf_print_fn); + error = setup_inspector(&events, &skel, &ring_buffer); if (error) goto cleanup; - command_exit = wait_for_command(ring_buffer, &child, &events); - if (command_exit < 0) - goto cleanup; - result = report_result(skel, &events, command_exit); + error = monitor_execs(ring_buffer); + exec_image_inspector_bpf__detach(skel); + if (!error) + error = drain_pending_events(ring_buffer, skel); + report_result(skel, &events); + if (!error) + result = 0; cleanup: - stop_child(&child); ring_buffer__free(ring_buffer); exec_image_inspector_bpf__destroy(skel); return result; } ``` -核心技术是阻塞子进程握手。`start_blocked_child` 在 BPF 设置前 fork,但子进程阻塞在 pipe 读取上。父进程记录子进程 PID、打开 skeleton、写入 `target_tgid`、加载并挂载、创建 ring buffer,然后才调用 `release_child` 写管道让子进程继续执行 `execvp`。 +`setup_inspector` 打开、配置、加载并挂载 skeleton,然后创建 ring buffer。`monitor_execs` 打印 `READY`,轮询到 SIGINT 或 SIGTERM。程序不要求 timeout,也不再提供 `-- COMMAND` 子进程模式。 -`wait_for_command` 是主循环。它打印 `READY` 行、释放子进程,然后交替轮询 ring buffer 和检查子进程是否退出。当子进程被回收且至少收到一条事件时循环结束,或者超时时结束。超时后,`reap_timed_out_child` 发送 SIGKILL 并等待。 - -单次 exec 可能触发多条事件,如果命令本身也调用 exec(例如 `/bin/sh -c 'exec /bin/true'`)。子进程退出后,`drain_events` 用零超时 poll 取尽剩余事件。 +关闭时 `main` 先 detach。`drain_pending_events` 再用有界的 100 ms poll 等待 `completed` 追上 `scheduled`,排空 ring buffer,并在销毁资源前报告全部计数。 `handle_event` 格式化输出,把数字 ELF 值转换为可读名称,同时保留原始值供脚本使用。 @@ -968,44 +806,36 @@ cd src/54-exec-image-inspector sudo make test ``` -仓库 CI 只编译本课。运行时行为在 x86_64 上通过功能测试,内核版本 `7.0.0-rc2+`。示例输出: +仓库 CI 会编译本课;运行时行为也在教程 KVM 的 x86_64、内核 `7.2.0-rc4` 上通过功能测试。下面是缩短后的示例输出: ```text -TEST-MISSING matched=0 events=0 command_exit=127 -TEST-TIMEOUT matched=1 callbacks=1 events=1 command_exit=137 -TEST-REEXEC matched=2 callbacks=2 events=2 command_exit=0 final_path=/usr/bin/true -READY target_tgid=1265 probe_offset=4214784 timeout_ms=3000 command=/tmp/exec-image-inspector-sxm3lumw/exec_fixture_image -EXEC pid=1265 tgid=1265 comm=exec_fixture_im path=/tmp/exec-image-inspector-sxm3lumw/exec_fixture_image is_elf=1 class=ELF64 endian=LSB type=ET_DYN(3) machine=EM_X86_64(62) header_error=0 path_error=0 latency_us=37 +TEST-CONTINUOUS workers=16 matched=18 callbacks=18 events=18 +READY scope=system-wide probe_offset=4214784 +EXEC pid=... tgid=... comm=exec_fixture_im path=/tmp/.../exec_fixture_image is_elf=1 class=ELF64 endian=LSB type=ET_DYN(3) machine=EM_X86_64(62) header_error=0 path_error=0 latency_us=... PROBE offset=4214784 direct_error=-14 deferred_error=0 bytes=454950524f424521 -exec fixture completed -SUMMARY matched=1 scheduled=1 schedule_errors=0 callbacks=1 header_errors=0 path_errors=0 direct_probes=1 direct_probe_errors=1 deferred_probes=1 deferred_probe_errors=0 dropped=0 events=1 command_exit=0 -PASS: missing-command, timeout cleanup, re-exec drain, ELF decode, and deferred file read succeeded +SUMMARY matched=18 scheduled=18 schedule_errors=0 callbacks=18 completed=18 header_errors=0 path_errors=0 direct_probes=18 direct_probe_errors=18 deferred_probes=18 deferred_probe_errors=2 dropped=0 cleanup_errors=0 events=18 +PASS: persistent monitoring, concurrent execs, signal cleanup, ELF decode, and deferred file reads succeeded ``` -前三行测试覆盖边界条件: - -- **TEST-MISSING**:不存在的命令以状态 127 退出。LSM 钩子从未触发,因为 exec 在凭据提交前就失败了,所以 `matched=0` 且 `events=0`。 -- **TEST-TIMEOUT**:命令运行太久,被 SIGKILL 终止,以状态 137(128 + 9)回收。观察到一条 exec 事件。 -- **TEST-REEXEC**:内部使用 `exec` 的 shell 命令产生两条事件,最终路径是 `/usr/bin/true`。 +测试先启动监控器并等待 `READY`,再并发运行 16 个 fixture 进程和一个最终 re-exec `/bin/true` 的 shell,最后用 SIGINT 停止监控器。它检查 `scheduled == callbacks == completed == events`,并要求调度、丢弃和清理错误全为零;还会确认旧的 `--timeout-ms` 和 `-- COMMAND` 接口被拒绝。 `EXEC` 行显示已安装的镜像和解析的 ELF 字段。`PROBE` 行展示了可睡眠上下文的差异:测试向一个页面写入标记(`EIPROBE!`),刷新并从页缓存驱逐它,然后 exec。不可睡眠钩子中的直接读取返回 `-EFAULT`(`-14`),因为页是冷的。可睡眠回调中的延迟读取成功,返回标记字节的十六进制表示(`454950524f424521`)。 -检查简单命令: +持续监控之后发生的系统级 exec: ```bash -sudo ./exec_image_inspector --timeout-ms 3000 -- /bin/true +sudo ./exec_image_inspector ``` 命令行格式: ```text -exec_image_inspector [--probe-offset BYTES] [--timeout-ms MS] [--verbose] -- COMMAND [ARG...] +exec_image_inspector [--probe-offset BYTES] [--verbose] ``` -- `--timeout-ms`:100 到 60000 毫秒(默认 5000)。超过此期限后工具会终止并回收命令。 - `--probe-offset`:在钩子中(直接)和回调中(延迟)分别读取此偏移处的 8 字节,以验证冷页差异。 - `--verbose`:打印 libbpf 诊断信息。 -- `--`:分隔 inspector 选项和要运行的命令。 +- Ctrl-C 或 SIGTERM:停止接收新 exec,等待已调度回调,排空事件,打印 `SUMMARY` 并卸载。 ### 环境要求 @@ -1019,13 +849,13 @@ exec_image_inspector [--probe-offset BYTES] [--timeout-ms MS] [--verbose] -- COM ## 局限性与扩展 -本工具每次调用观察一个直接子进程,使用单个 map 槽位。对于并发服务场景,需要按任务分配状态、实现准入限制、处理回调回收。超时清理只向子进程发送 SIGKILL;需要进程组管理或外部信号处理的调用方需自行添加这些功能。 +本工具在 `READY` 后观察系统级成功 exec。pending HASH map 最多支持 4096 个并发 `pid_tgid` key,插入或调度压力会反映在 `schedule_errors`。关闭时大约等待回调一秒;若未完成会返回错误,而不是静默销毁仍被回调使用的状态。`--probe-offset` 是比较冷页行为的高级诊断,不是 workload 过滤器。 ## 总结 -本教程展示了如何结合 BPF task work 和 file dynptr 来检查 exec 实际安装的可执行镜像。关键思路是分离两个时刻:识别目标(在不可睡眠的 LSM 钩子中)和读取文件内容(在可睡眠的 task work 回调中)。这让 eBPF 程序能可靠地读取文件数据,即使目标字节不在页缓存中也能完成。 +本教程展示了如何结合 BPF task work 和 file dynptr 来检查 exec 实际安装的可执行镜像。关键思路是分离两个时刻:接收 exec(在不可睡眠的 LSM 钩子中)和读取文件内容(在可睡眠的 task work 回调中)。这让 eBPF 程序能可靠地读取文件数据,即使目标字节不在页缓存中也能完成。 -阻塞子进程握手消除了 attach 竞态,有界执行确保清理完整,最终 drain 捕获所有事件。这些技术组合产生一个可复现的单命令工具,同时为扩展留出空间。 +持续监控器为独立 workload 提供自然的 `READY` 边界。先 detach 再 drain 的关闭顺序、每次 exec 独立的 pending 状态和完成计数,在保留原有 task-work 与 file-dynptr 教学内容的同时保证并发回调安全。 > 要深入了解 eBPF,请访问我们的教程仓库 。 diff --git a/src/54-exec-image-inspector/exec-image-flow.dot b/src/54-exec-image-inspector/exec-image-flow.dot index 1c63eff6..170dee01 100644 --- a/src/54-exec-image-inspector/exec-image-flow.dot +++ b/src/54-exec-image-inspector/exec-image-flow.dot @@ -29,23 +29,23 @@ digraph exec_image_flow { arrowsize=0.75 ]; - fork [ - label="User space\nfork child\nchild waits on pipe", + start [ + label="User space\nstart system-wide monitor", fillcolor="#EBF8FF", color="#3182CE" ]; prepare [ - label="target_tgid + probe_offset\nload LSM + ring buffer", + label="probe_offset\nload LSM + ring buffer", fillcolor="#EBF8FF", color="#3182CE" ]; exec [ - label="release pipe\nchild calls execvp", + label="any process calls exec", fillcolor="#EBF8FF", color="#3182CE" ]; hook [ - label="bprm_committed_creds\nmatch target_tgid", + label="bprm_committed_creds\nobserve every committed exec", fillcolor="#FFFAF0", color="#DD6B20" ]; @@ -63,7 +63,7 @@ digraph exec_image_flow { color="#DD6B20" ]; pending [ - label="pending[0]\nscheduled_ns + direct result", + label="pending[pid_tgid]\nscheduled_ns + direct result", shape=cylinder, fillcolor="#FFF5F5", color="#C05621" @@ -89,24 +89,24 @@ digraph exec_image_flow { color="#805AD5" ]; event [ - label="ring buffer event\npath + ELF + probe + latency", + label="ring buffer event\npath + ELF + probe + latency\ndelete pending entry", fillcolor="#F0FFF4", color="#38A169" ]; collect [ - label="User space\npoll + waitpid\nfinal drain + stats", + label="User space\nstream events until SIGINT/SIGTERM\nfinal drain + stats", fillcolor="#EBF8FF", color="#3182CE" ]; - { rank=same; fork; prepare; exec; } + { rank=same; start; prepare; exec; } { rank=same; hook; probe; direct; } { rank=same; pending; schedule; } { rank=same; callback; file; read; } { rank=same; event; collect; } - fork -> prepare [label="parent knows child TGID"]; - prepare -> exec [label="attach completes"]; + start -> prepare; + prepare -> exec [label="READY"]; exec -> hook [label="each committed exec"]; hook -> probe; probe -> direct [label="yes"]; @@ -118,4 +118,5 @@ digraph exec_image_flow { file -> read; read -> event; event -> collect; + collect -> exec [label="keep monitoring", style=dashed]; } diff --git a/src/54-exec-image-inspector/exec-image-flow.png b/src/54-exec-image-inspector/exec-image-flow.png index 9f21ac28bcfa287c9c0e4a20ff5b75b9a9bc0b4f..7a28f51becc54a5425d85ebe80628cc115bcb7cb 100644 GIT binary patch literal 109558 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 Ze{xpRDO8$)2zQ_Ym$rtUdXbuS$iIV+9cTam literal 209831 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

gl|j^UZ+< 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

HY-fs2TUDyE1JVc_pg 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

7Kkaj+kpdk%KvWjePZj!AaH@_^T3q7 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 z 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 diff --git a/src/54-exec-image-inspector/exec_image_inspector.bpf.c b/src/54-exec-image-inspector/exec_image_inspector.bpf.c index 01027894..c00cdf89 100644 --- a/src/54-exec-image-inspector/exec_image_inspector.bpf.c +++ b/src/54-exec-image-inspector/exec_image_inspector.bpf.c @@ -16,7 +16,6 @@ char LICENSE[] SEC("license") = "GPL"; #define ELFDATA2LSB 1 #define ELFDATA2MSB 2 -const volatile __u32 target_tgid; const volatile __u32 probe_offset; struct inspector_stats stats; @@ -33,9 +32,10 @@ struct exec_work { }; struct { - __uint(type, BPF_MAP_TYPE_ARRAY); - __uint(max_entries, 1); - __type(key, __u32); + __uint(type, BPF_MAP_TYPE_HASH); + __uint(map_flags, BPF_F_NO_PREALLOC); + __uint(max_entries, 4096); + __type(key, __u64); __type(value, struct exec_work); } pending SEC(".maps"); @@ -76,91 +76,106 @@ static int probe_file_without_sleep(struct file *file) return err; } -static int inspect_executable(struct bpf_map *map, void *key, void *value) +static __always_inline void record_header_error(struct exec_event *event, int err) { - unsigned char header[64] = {}; - struct exec_work *work = value; - struct exec_event event = {}; - struct task_struct *task; - struct bpf_dynptr dynptr; - struct file *file; - __u64 pid_tgid; - int err; + event->header_error = err; + __sync_fetch_and_add(&stats.header_errors, 1); +} - (void)map; - (void)key; - __sync_fetch_and_add(&stats.callbacks, 1); +static __always_inline void record_deferred_probe(struct exec_event *event, + int err) +{ + if (!probe_offset) + return; - pid_tgid = bpf_get_current_pid_tgid(); - event.pid = (__u32)pid_tgid; - event.tgid = pid_tgid >> 32; - event.latency_ns = bpf_ktime_get_ns() - work->scheduled_ns; - event.direct_probe_error = work->direct_probe_error; - event.probe_offset = probe_offset; - bpf_get_current_comm(event.comm, sizeof(event.comm)); + event->deferred_probe_error = err; + __sync_fetch_and_add(&stats.deferred_probes, 1); + if (err) + __sync_fetch_and_add(&stats.deferred_probe_errors, 1); +} - task = bpf_get_current_task_btf(); - file = bpf_get_task_exe_file(task); - if (!file) { - event.header_error = -ENOENT; - __sync_fetch_and_add(&stats.header_errors, 1); - if (probe_offset) { - event.deferred_probe_error = -ENOENT; - __sync_fetch_and_add(&stats.deferred_probes, 1); - __sync_fetch_and_add(&stats.deferred_probe_errors, 1); - } - goto emit; - } +static __always_inline void parse_elf_header(const unsigned char *header, + struct exec_event *event) +{ + if (event->header_error || header[0] != 0x7f || header[1] != 'E' || + header[2] != 'L' || header[3] != 'F') + return; + + event->is_elf = 1; + event->elf_class = header[EI_CLASS]; + event->elf_data = header[EI_DATA]; + event->elf_type = read_elf_u16(header, 16, event->elf_data); + event->elf_machine = read_elf_u16(header, 18, event->elf_data); +} - err = bpf_path_d_path(&file->f_path, event.path, sizeof(event.path)); +static __always_inline void inspect_file(struct file *file, + struct exec_event *event) +{ + unsigned char header[64] = {}; + struct bpf_dynptr dynptr; + int err; + + err = bpf_path_d_path(&file->f_path, event->path, sizeof(event->path)); if (err < 0) { - event.path_error = err; + event->path_error = err; __sync_fetch_and_add(&stats.path_errors, 1); } err = bpf_dynptr_from_file(file, 0, &dynptr); if (err) { bpf_dynptr_file_discard(&dynptr); - event.header_error = err; - __sync_fetch_and_add(&stats.header_errors, 1); - if (probe_offset) { - event.deferred_probe_error = err; - __sync_fetch_and_add(&stats.deferred_probes, 1); - __sync_fetch_and_add(&stats.deferred_probe_errors, 1); - } - goto put_file; + record_header_error(event, err); + record_deferred_probe(event, err); + return; } err = bpf_dynptr_read(header, sizeof(header), &dynptr, 0, 0); - if (err) { - event.header_error = err; - __sync_fetch_and_add(&stats.header_errors, 1); - } + if (err) + record_header_error(event, err); if (probe_offset) { - __sync_fetch_and_add(&stats.deferred_probes, 1); - err = bpf_dynptr_read(event.probe_bytes, sizeof(event.probe_bytes), + err = bpf_dynptr_read(event->probe_bytes, + sizeof(event->probe_bytes), &dynptr, probe_offset, 0); - event.deferred_probe_error = err; - if (err) - __sync_fetch_and_add(&stats.deferred_probe_errors, 1); + record_deferred_probe(event, err); } bpf_dynptr_file_discard(&dynptr); + parse_elf_header(header, event); +} + +static int inspect_executable(struct bpf_map *map, void *key, void *value) +{ + struct exec_work *work = value; + struct exec_event event = {}; + struct task_struct *task; + struct file *file; + __u64 pid_tgid; + + __sync_fetch_and_add(&stats.callbacks, 1); + pid_tgid = bpf_get_current_pid_tgid(); + event.pid = (__u32)pid_tgid; + event.tgid = pid_tgid >> 32; + event.latency_ns = bpf_ktime_get_ns() - work->scheduled_ns; + event.direct_probe_error = work->direct_probe_error; + event.probe_offset = probe_offset; + bpf_get_current_comm(event.comm, sizeof(event.comm)); - if (!event.header_error && header[0] == 0x7f && header[1] == 'E' && - header[2] == 'L' && header[3] == 'F') { - event.is_elf = 1; - event.elf_class = header[EI_CLASS]; - event.elf_data = header[EI_DATA]; - event.elf_type = read_elf_u16(header, 16, event.elf_data); - event.elf_machine = read_elf_u16(header, 18, event.elf_data); + task = bpf_get_current_task_btf(); + file = bpf_get_task_exe_file(task); + if (!file) { + record_header_error(&event, -ENOENT); + record_deferred_probe(&event, -ENOENT); + goto emit; } -put_file: + inspect_file(file, &event); bpf_put_file(file); emit: if (bpf_ringbuf_output(&events, &event, sizeof(event), 0)) __sync_fetch_and_add(&stats.dropped, 1); + if (bpf_map_delete_elem(map, key)) + __sync_fetch_and_add(&stats.cleanup_errors, 1); + __sync_fetch_and_add(&stats.completed, 1); return 0; } @@ -168,20 +183,25 @@ SEC("lsm/bprm_committed_creds") void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) { struct task_struct *task; + struct exec_work empty_work = {}; struct exec_work *work; __u64 pid_tgid; - __u32 key = 0, tgid; + __u64 key; int err; pid_tgid = bpf_get_current_pid_tgid(); - tgid = pid_tgid >> 32; - if (target_tgid && tgid != target_tgid) - return; - + key = pid_tgid; __sync_fetch_and_add(&stats.matched, 1); + err = bpf_map_update_elem(&pending, &key, &empty_work, BPF_NOEXIST); + if (err) { + __sync_fetch_and_add(&stats.schedule_errors, 1); + return; + } work = bpf_map_lookup_elem(&pending, &key); if (!work) { __sync_fetch_and_add(&stats.schedule_errors, 1); + if (bpf_map_delete_elem(&pending, &key)) + __sync_fetch_and_add(&stats.cleanup_errors, 1); return; } @@ -192,6 +212,8 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) inspect_executable); if (err) { __sync_fetch_and_add(&stats.schedule_errors, 1); + if (bpf_map_delete_elem(&pending, &key)) + __sync_fetch_and_add(&stats.cleanup_errors, 1); return; } __sync_fetch_and_add(&stats.scheduled, 1); diff --git a/src/54-exec-image-inspector/exec_image_inspector.c b/src/54-exec-image-inspector/exec_image_inspector.c index ce087e3a..f6a76219 100644 --- a/src/54-exec-image-inspector/exec_image_inspector.c +++ b/src/54-exec-image-inspector/exec_image_inspector.c @@ -4,13 +4,9 @@ #include #include #include -#include #include #include #include -#include -#include -#include #include #include #include "exec_image_inspector.h" @@ -18,26 +14,15 @@ struct environment { unsigned long long probe_offset; - unsigned int timeout_ms; bool verbose; - char **command; -}; - -struct child_process { - pid_t pid; - int release_fd; - bool released; - bool reaped; - int status; }; struct event_context { - unsigned int seen; + unsigned long long seen; }; -static struct environment env = { - .timeout_ms = 5000, -}; +static struct environment env; +static volatile sig_atomic_t exiting; static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) @@ -47,40 +32,28 @@ static int libbpf_print_fn(enum libbpf_print_level level, const char *format, return vfprintf(stderr, format, args); } -static void usage(const char *program) +static void usage(FILE *stream, const char *program) { - fprintf(stderr, - "Usage: %s [--probe-offset BYTES] [--timeout-ms MS] [--verbose] " - "-- COMMAND [ARG...]\n\n" - "Inspect the executable image installed by one command.\n\n" + fprintf(stream, + "Usage: %s [--probe-offset BYTES] [--verbose]\n\n" + "Continuously inspect executable images installed by exec.\n" + "Press Ctrl-C to stop and print a summary.\n\n" "Options:\n" - " -p, --probe-offset BYTES also compare direct/deferred file reads\n" - " -t, --timeout-ms MS bound the command, 100-60000 " - "(default: 5000)\n" + " -p, --probe-offset BYTES compare reads at a positive offset\n" " -v, --verbose print libbpf diagnostics\n" " -h, --help show this help\n", program); } -static int parse_u64(const char *value, unsigned long long maximum, - unsigned long long *result) +static int parse_probe_offset(const char *value) { char *end = NULL; unsigned long long parsed; errno = 0; parsed = strtoull(value, &end, 10); - if (errno || end == value || *end || parsed > maximum) - return -EINVAL; - *result = parsed; - return 0; -} - -static int parse_probe_offset(const char *value) -{ - unsigned long long parsed; - - if (parse_u64(value, UINT_MAX - EXEC_PROBE_LEN, &parsed)) { + if (errno || end == value || *end || !parsed || + parsed > UINT_MAX - EXEC_PROBE_LEN) { fprintf(stderr, "invalid probe offset: %s\n", value); return -EINVAL; } @@ -88,154 +61,58 @@ static int parse_probe_offset(const char *value) return 0; } -static int parse_timeout(const char *value) -{ - unsigned long long parsed; - - if (parse_u64(value, 60000, &parsed) || parsed < 100) { - fprintf(stderr, "invalid timeout in milliseconds: %s\n", value); - return -EINVAL; - } - env.timeout_ms = parsed; - return 0; -} - -static int parse_option(int option, const char *program) -{ - switch (option) { - case 'p': - return parse_probe_offset(optarg); - case 't': - return parse_timeout(optarg); - case 'v': - env.verbose = true; - return 0; - case 'h': - usage(program); - exit(0); - default: - return -EINVAL; - } -} - static int parse_args(int argc, char **argv) { static const struct option options[] = { { "probe-offset", required_argument, NULL, 'p' }, - { "timeout-ms", required_argument, NULL, 't' }, { "verbose", no_argument, NULL, 'v' }, { "help", no_argument, NULL, 'h' }, {}, }; - int error, option; + int option; - while ((option = getopt_long(argc, argv, "+p:t:vh", options, NULL)) != -1) { - error = parse_option(option, argv[0]); - if (error) - return error; + while ((option = getopt_long(argc, argv, "+p:vh", options, NULL)) != -1) { + switch (option) { + case 'p': + if (parse_probe_offset(optarg)) + return -EINVAL; + break; + case 'v': + env.verbose = true; + break; + case 'h': + usage(stdout, argv[0]); + exit(0); + default: + return -EINVAL; + } } - if (optind == argc) { - fprintf(stderr, "COMMAND is required\n"); + if (optind != argc) { + fprintf(stderr, "unexpected argument: %s\n", argv[optind]); return -EINVAL; } - env.command = &argv[optind]; return 0; } -static long long monotonic_milliseconds(void) +static void handle_signal(int signal_number) { - struct timespec timestamp; - - if (clock_gettime(CLOCK_MONOTONIC, ×tamp)) - return -errno; - return timestamp.tv_sec * 1000LL + timestamp.tv_nsec / 1000000; + (void)signal_number; + exiting = 1; } -static int start_blocked_child(struct child_process *child) +static int install_signal_handlers(void) { - int pipe_fds[2]; - pid_t pid; + struct sigaction action = { + .sa_handler = handle_signal, + }; - if (pipe(pipe_fds)) + sigemptyset(&action.sa_mask); + if (sigaction(SIGINT, &action, NULL) || sigaction(SIGTERM, &action, NULL)) return -errno; - - pid = fork(); - if (pid < 0) { - int error = -errno; - - close(pipe_fds[0]); - close(pipe_fds[1]); - return error; - } - - if (pid == 0) { - char release; - ssize_t count; - - close(pipe_fds[1]); - do { - count = read(pipe_fds[0], &release, sizeof(release)); - } while (count < 0 && errno == EINTR); - close(pipe_fds[0]); - if (count != sizeof(release)) - _exit(126); - - /* Intentional argv execution; no shell parses the supplied arguments. */ - execvp(env.command[0], env.command); /* Flawfinder: ignore */ - fprintf(stderr, "failed to execute %s: %s\n", env.command[0], - strerror(errno)); - _exit(127); - } - - close(pipe_fds[0]); - child->pid = pid; - child->release_fd = pipe_fds[1]; return 0; } -static int release_child(struct child_process *child) -{ - char release = 1; - ssize_t count; - - do { - count = write(child->release_fd, &release, sizeof(release)); - } while (count < 0 && errno == EINTR); - close(child->release_fd); - child->release_fd = -1; - if (count != sizeof(release)) - return count < 0 ? -errno : -EIO; - child->released = true; - return 0; -} - -static int child_exit_code(int status) -{ - if (WIFEXITED(status)) - return WEXITSTATUS(status); - if (WIFSIGNALED(status)) - return 128 + WTERMSIG(status); - return 125; -} - -static int reap_child(struct child_process *child, int options) -{ - pid_t result; - - if (child->reaped) - return 1; - do { - result = waitpid(child->pid, &child->status, options); - } while (result < 0 && errno == EINTR); - if (result < 0) - return -errno; - if (result == 0) - return 0; - child->reaped = true; - return 1; -} - static int drain_events(struct ring_buffer *ring_buffer) { int error; @@ -339,21 +216,7 @@ static int handle_event(void *context, void *data, size_t size) return 0; } -static void stop_child(struct child_process *child) -{ - if (child->reaped || child->pid <= 0) - return; - if (!child->released && child->release_fd >= 0) { - close(child->release_fd); - child->release_fd = -1; - } else { - kill(child->pid, SIGKILL); - } - (void)reap_child(child, 0); -} - -static int setup_inspector(const struct child_process *child, - struct event_context *events, +static int setup_inspector(struct event_context *events, struct exec_image_inspector_bpf **skeleton, struct ring_buffer **ring_buffer) { @@ -367,12 +230,16 @@ static int setup_inspector(const struct child_process *child, return -ENOMEM; } *skeleton = skel; - skel->rodata->target_tgid = child->pid; skel->rodata->probe_offset = env.probe_offset; error = exec_image_inspector_bpf__load(skel); if (error) { - fprintf(stderr, "failed to load BPF object: %s\n", strerror(-error)); + fprintf(stderr, + "failed to load BPF object: %s\n" + "This monitor requires Linux 6.19+, BTF, BPF JIT, " + "CONFIG_BPF_LSM=y, and an active bpf LSM.\n" + "Check the active list with: cat /sys/kernel/security/lsm\n", + strerror(-error)); return error; } error = exec_image_inspector_bpf__attach(skel); @@ -392,144 +259,98 @@ static int setup_inspector(const struct child_process *child, return 0; } -static int reap_timed_out_child(struct child_process *child) -{ - int error; - - if (child->reaped) - return 0; - - fprintf(stderr, "command exceeded timeout; sending SIGKILL\n"); - kill(child->pid, SIGKILL); - error = reap_child(child, 0); - if (error < 0) { - fprintf(stderr, "waitpid after timeout failed: %s\n", - strerror(-error)); - return error; - } - return 0; -} - -static int wait_for_command(struct ring_buffer *ring_buffer, - struct child_process *child, - const struct event_context *events) +static int monitor_execs(struct ring_buffer *ring_buffer) { - long long deadline, now; int error; - printf("READY target_tgid=%d probe_offset=%llu timeout_ms=%u command=%s\n", - child->pid, env.probe_offset, env.timeout_ms, env.command[0]); + printf("READY scope=system-wide probe_offset=%llu\n", env.probe_offset); fflush(stdout); - error = release_child(child); - if (error) { - fprintf(stderr, "failed to release command process: %s\n", - strerror(-error)); - return error; - } - - now = monotonic_milliseconds(); - if (now < 0) { - fprintf(stderr, "failed to read monotonic clock: %s\n", - strerror((int)-now)); - return (int)now; - } - deadline = now + env.timeout_ms; - - for (;;) { - error = ring_buffer__poll(ring_buffer, 50); + while (!exiting) { + error = ring_buffer__poll(ring_buffer, 100); if (error == -EINTR) continue; if (error < 0) { fprintf(stderr, "ring-buffer poll failed: %s\n", strerror(-error)); return error; } + } + return 0; +} - error = reap_child(child, WNOHANG); +static int drain_pending_events(struct ring_buffer *ring_buffer, + const struct exec_image_inspector_bpf *skel) +{ + int attempts, error; + + for (attempts = 0; attempts < 10; attempts++) { + if (skel->bss->stats.completed >= skel->bss->stats.scheduled) + return drain_events(ring_buffer); + error = ring_buffer__poll(ring_buffer, 100); + if (error == -EINTR) + continue; if (error < 0) { - fprintf(stderr, "waitpid failed: %s\n", strerror(-error)); + fprintf(stderr, "ring-buffer shutdown poll failed: %s\n", + strerror(-error)); return error; } - if (child->reaped && events->seen) - break; - - now = monotonic_milliseconds(); - if (now < 0) - return (int)now; - if (now >= deadline) - break; - if (child->reaped && !events->seen) - continue; } - error = reap_timed_out_child(child); - if (error) - return error; - error = drain_events(ring_buffer); - if (error) - return error; - return child_exit_code(child->status); + fprintf(stderr, "timed out waiting for %llu scheduled callbacks\n", + skel->bss->stats.scheduled - skel->bss->stats.completed); + return -ETIMEDOUT; } -static int report_result(const struct exec_image_inspector_bpf *skel, - const struct event_context *events, int command_exit) +static void report_result(const struct exec_image_inspector_bpf *skel, + const struct event_context *events) { struct inspector_stats final_stats = skel->bss->stats; printf("SUMMARY matched=%llu scheduled=%llu schedule_errors=%llu " - "callbacks=%llu header_errors=%llu path_errors=%llu " + "callbacks=%llu completed=%llu header_errors=%llu path_errors=%llu " "direct_probes=%llu direct_probe_errors=%llu " "deferred_probes=%llu deferred_probe_errors=%llu dropped=%llu " - "events=%u command_exit=%d\n", + "cleanup_errors=%llu events=%llu\n", final_stats.matched, final_stats.scheduled, final_stats.schedule_errors, final_stats.callbacks, - final_stats.header_errors, final_stats.path_errors, + final_stats.completed, final_stats.header_errors, + final_stats.path_errors, final_stats.direct_probes, final_stats.direct_probe_errors, final_stats.deferred_probes, final_stats.deferred_probe_errors, - final_stats.dropped, events->seen, command_exit); - - if (!events->seen) { - fprintf(stderr, "no executable image event was observed\n"); - return 1; - } - if (command_exit) { - fprintf(stderr, "command exited with status %d\n", command_exit); - return command_exit; - } - return 0; + final_stats.dropped, final_stats.cleanup_errors, events->seen); } int main(int argc, char **argv) { struct exec_image_inspector_bpf *skel = NULL; - struct child_process child = { .release_fd = -1 }; struct event_context events = {}; struct ring_buffer *ring_buffer = NULL; - int command_exit, error, result = 1; + int error, result = 1; error = parse_args(argc, argv); if (error) { - usage(argv[0]); + usage(stderr, argv[0]); return 2; } - - libbpf_set_print(libbpf_print_fn); - error = start_blocked_child(&child); + error = install_signal_handlers(); if (error) { - fprintf(stderr, "failed to create command process: %s\n", + fprintf(stderr, "failed to install signal handlers: %s\n", strerror(-error)); return 1; } - error = setup_inspector(&child, &events, &skel, &ring_buffer); + libbpf_set_print(libbpf_print_fn); + error = setup_inspector(&events, &skel, &ring_buffer); if (error) goto cleanup; - command_exit = wait_for_command(ring_buffer, &child, &events); - if (command_exit < 0) - goto cleanup; - result = report_result(skel, &events, command_exit); + error = monitor_execs(ring_buffer); + exec_image_inspector_bpf__detach(skel); + if (!error) + error = drain_pending_events(ring_buffer, skel); + report_result(skel, &events); + if (!error) + result = 0; cleanup: - stop_child(&child); ring_buffer__free(ring_buffer); exec_image_inspector_bpf__destroy(skel); return result; diff --git a/src/54-exec-image-inspector/exec_image_inspector.h b/src/54-exec-image-inspector/exec_image_inspector.h index 43801760..41672e74 100644 --- a/src/54-exec-image-inspector/exec_image_inspector.h +++ b/src/54-exec-image-inspector/exec_image_inspector.h @@ -31,6 +31,7 @@ struct inspector_stats { unsigned long long scheduled; unsigned long long schedule_errors; unsigned long long callbacks; + unsigned long long completed; unsigned long long header_errors; unsigned long long path_errors; unsigned long long direct_probes; @@ -38,6 +39,7 @@ struct inspector_stats { unsigned long long deferred_probes; unsigned long long deferred_probe_errors; unsigned long long dropped; + unsigned long long cleanup_errors; }; #endif /* __EXEC_IMAGE_INSPECTOR_H */ diff --git a/src/54-exec-image-inspector/tests/test_exec_image_inspector.py b/src/54-exec-image-inspector/tests/test_exec_image_inspector.py index cc322328..fc39b4ba 100644 --- a/src/54-exec-image-inspector/tests/test_exec_image_inspector.py +++ b/src/54-exec-image-inspector/tests/test_exec_image_inspector.py @@ -1,26 +1,30 @@ #!/usr/bin/env python3 -"""Deterministic KVM checks for the deferred executable image inspector.""" +"""Deterministic KVM checks for the continuous executable image inspector.""" from __future__ import annotations import os import re +import select import shutil +import signal import stat import subprocess import sys import tempfile +import time MARKER = b"EIPROBE!" PROBE_DISTANCE = 4 * 1024 * 1024 +WORKERS = 16 SUMMARY = re.compile( r"SUMMARY matched=(\d+) scheduled=(\d+) schedule_errors=(\d+) " - r"callbacks=(\d+) header_errors=(\d+) path_errors=(\d+) " + r"callbacks=(\d+) completed=(\d+) header_errors=(\d+) path_errors=(\d+) " r"direct_probes=(\d+) direct_probe_errors=(\d+) " r"deferred_probes=(\d+) deferred_probe_errors=(\d+) dropped=(\d+) " - r"events=(\d+) command_exit=(\d+)" + r"cleanup_errors=(\d+) events=(\d+)" ) @@ -44,6 +48,7 @@ def parse_summary(output: str) -> dict[str, int]: "scheduled", "schedule_errors", "callbacks", + "completed", "header_errors", "path_errors", "direct_probes", @@ -51,8 +56,8 @@ def parse_summary(output: str) -> dict[str, int]: "deferred_probes", "deferred_probe_errors", "dropped", + "cleanup_errors", "events", - "command_exit", ) return dict(zip(names, map(int, match.groups()))) @@ -73,124 +78,125 @@ def create_probe_image(fixture: str, directory: str) -> tuple[str, int]: return image, probe_offset -def test_missing_command(inspector: str) -> dict[str, int]: - missing = "/definitely/missing/exec-image-inspector-fixture" - result = run( - inspector, - "--timeout-ms", "500", - "--", - missing, - check=False, - ) - assert result.returncode != 0, result.stdout - assert f"failed to execute {missing}" in result.stdout, result.stdout - assert "no executable image event was observed" in result.stdout, result.stdout - stats = parse_summary(result.stdout) - assert stats["matched"] == 0, stats - assert stats["scheduled"] == 0, stats - assert stats["callbacks"] == 0, stats - assert stats["events"] == 0, stats - assert stats["command_exit"] == 127, stats - return stats - - -def test_timeout_cleanup(inspector: str) -> dict[str, int]: - result = run( - inspector, - "--timeout-ms", "200", - "--", - "/bin/sleep", "2", - check=False, - ) - assert result.returncode == 128 + 9, result.stdout - assert "command exceeded timeout; sending SIGKILL" in result.stdout, result.stdout - stats = parse_summary(result.stdout) - assert stats["matched"] == 1, stats - assert stats["scheduled"] == 1, stats - assert stats["callbacks"] == 1, stats - assert stats["events"] == 1, stats - assert stats["command_exit"] == 137, stats - return stats - - -def test_reexec_chain(inspector: str) -> tuple[dict[str, int], str]: - final_path = os.path.realpath("/bin/true") - result = run( - inspector, - "--timeout-ms", "1000", - "--", - "/bin/sh", "-c", "exec /bin/true", - check=False, - ) - assert result.returncode == 0, result.stdout - exec_lines = [ - line for line in result.stdout.splitlines() if line.startswith("EXEC ") - ] - assert len(exec_lines) == 2, result.stdout - assert f"path={final_path}" in exec_lines[-1], exec_lines[-1] - - stats = parse_summary(result.stdout) - assert stats["matched"] == 2, stats - assert stats["scheduled"] == 2, stats - assert stats["callbacks"] == 2, stats - assert stats["events"] == 2, stats - assert stats["command_exit"] == 0, stats - return stats, final_path - - -def test_deferred_probe(inspector: str, fixture: str) -> str: +def test_cli(inspector: str) -> None: + help_result = run(inspector, "--help") + assert help_result.returncode == 0, help_result.stdout + assert "Continuously inspect executable images" in help_result.stdout + assert "--timeout-ms" not in help_result.stdout + + legacy_result = run(inspector, "--", "/bin/true", check=False) + assert legacy_result.returncode == 2, legacy_result.stdout + assert "unexpected argument: /bin/true" in legacy_result.stdout + + zero_offset = run(inspector, "--probe-offset", "0", check=False) + assert zero_offset.returncode == 2, zero_offset.stdout + assert "invalid probe offset: 0" in zero_offset.stdout + + +def stop_monitor( + monitor: subprocess.Popen[str], signal_number: signal.Signals +) -> tuple[int, str]: + monitor.send_signal(signal_number) + try: + output, _ = monitor.communicate(timeout=10) + except subprocess.TimeoutExpired: + monitor.kill() + output, _ = monitor.communicate() + raise AssertionError("monitor did not stop after signal:\n" + output) + return monitor.returncode, output + + +def wait_until_ready(monitor: subprocess.Popen[str]) -> list[str]: + lines: list[str] = [] + deadline = time.monotonic() + 8 + assert monitor.stdout is not None + + while time.monotonic() < deadline: + readable, _, _ = select.select([monitor.stdout], [], [], 0.25) + if readable: + line = monitor.stdout.readline() + if line: + lines.append(line) + if line.startswith("READY "): + return lines + if monitor.poll() is not None: + break + + monitor.kill() + remainder, _ = monitor.communicate() + raise AssertionError("monitor did not become ready:\n" + "".join(lines) + remainder) + + +def test_continuous_monitor( + inspector: str, fixture: str +) -> tuple[str, dict[str, int]]: with tempfile.TemporaryDirectory(prefix="exec-image-inspector-") as directory: image, probe_offset = create_probe_image(fixture, directory) - result = run( - inspector, - "--probe-offset", str(probe_offset), - "--timeout-ms", "3000", - "--", - image, - check=False, - ) - assert result.returncode == 0, result.stdout - - exec_line = next( - (line for line in result.stdout.splitlines() if line.startswith("EXEC ")), - "", + monitor = subprocess.Popen( + [inspector, "--probe-offset", str(probe_offset)], + text=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, ) - assert exec_line, result.stdout - assert f"path={image}" in exec_line, exec_line - assert "is_elf=1" in exec_line, exec_line - assert "class=ELF64" in exec_line, exec_line - assert "endian=LSB" in exec_line, exec_line - assert "machine=EM_X86_64(62)" in exec_line, exec_line - assert "header_error=0 path_error=0" in exec_line, exec_line - - probe_line = next( - (line for line in result.stdout.splitlines() if line.startswith("PROBE ")), - "", + try: + lines = wait_until_ready(monitor) + + workers = [ + subprocess.Popen( + [image], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT + ) + for _ in range(WORKERS) + ] + for worker in workers: + assert worker.wait(timeout=5) == 0 + + reexec = run("/bin/sh", "-c", "exec /bin/true") + assert reexec.returncode == 0, reexec.stdout + time.sleep(1) + returncode, remainder = stop_monitor(monitor, signal.SIGINT) + output = "".join(lines) + remainder + finally: + if monitor.poll() is None: + monitor.kill() + monitor.wait() + + assert returncode == 0, output + assert f"READY scope=system-wide probe_offset={probe_offset}" in output, output + + exec_lines = [ + line for line in output.splitlines() if line.startswith("EXEC ") + ] + image_lines = [line for line in exec_lines if f"path={image}" in line] + assert len(image_lines) == WORKERS, output + assert all("is_elf=1" in line for line in image_lines), image_lines + assert all("class=ELF64" in line for line in image_lines), image_lines + assert all("endian=LSB" in line for line in image_lines), image_lines + assert all("machine=EM_X86_64(62)" in line for line in image_lines), image_lines + assert all("header_error=0 path_error=0" in line for line in image_lines) + + final_path = os.path.realpath("/bin/true") + assert any(f"path={final_path}" in line for line in exec_lines), output + + probe_lines = [ + line for line in output.splitlines() if line.startswith("PROBE ") + ] + expected_probe = ( + f"offset={probe_offset} direct_error=-14 deferred_error=0 " + f"bytes={MARKER.hex()}" ) - assert probe_line, result.stdout - assert f"offset={probe_offset}" in probe_line, probe_line - assert "direct_error=-14" in probe_line, probe_line - assert "deferred_error=0" in probe_line, probe_line - assert f"bytes={MARKER.hex()}" in probe_line, probe_line - - stats = parse_summary(result.stdout) - expected = { - "matched": 1, - "scheduled": 1, - "schedule_errors": 0, - "callbacks": 1, - "header_errors": 0, - "path_errors": 0, - "direct_probes": 1, - "direct_probe_errors": 1, - "deferred_probes": 1, - "deferred_probe_errors": 0, - "dropped": 0, - "events": 1, - "command_exit": 0, - } - assert stats == expected, stats - return result.stdout + assert any(expected_probe in line for line in probe_lines), output + + stats = parse_summary(output) + assert stats["matched"] >= WORKERS + 2, stats + assert stats["scheduled"] == stats["matched"], stats + assert stats["schedule_errors"] == 0, stats + assert stats["callbacks"] == stats["scheduled"], stats + assert stats["completed"] == stats["scheduled"], stats + assert stats["events"] == stats["completed"], stats + assert stats["dropped"] == 0, stats + assert stats["cleanup_errors"] == 0, stats + assert stats["deferred_probe_errors"] == stats["matched"] - WORKERS, stats + return output, stats def main() -> int: @@ -204,30 +210,17 @@ def main() -> int: sys.argv[2] if len(sys.argv) > 2 else "./tests/exec_fixture" ) - missing_stats = test_missing_command(inspector) - timeout_stats = test_timeout_cleanup(inspector) - reexec_stats, final_path = test_reexec_chain(inspector) - output = test_deferred_probe(inspector, fixture) - print( - "TEST-MISSING " - f"matched={missing_stats['matched']} events={missing_stats['events']} " - f"command_exit={missing_stats['command_exit']}" - ) - print( - "TEST-TIMEOUT " - f"matched={timeout_stats['matched']} callbacks={timeout_stats['callbacks']} " - f"events={timeout_stats['events']} command_exit={timeout_stats['command_exit']}" - ) + test_cli(inspector) + output, stats = test_continuous_monitor(inspector, fixture) print( - "TEST-REEXEC " - f"matched={reexec_stats['matched']} callbacks={reexec_stats['callbacks']} " - f"events={reexec_stats['events']} command_exit={reexec_stats['command_exit']} " - f"final_path={final_path}" + "TEST-CONTINUOUS " + f"workers={WORKERS} matched={stats['matched']} " + f"callbacks={stats['callbacks']} events={stats['events']}" ) print(output, end="") print( - "PASS: missing-command, timeout cleanup, re-exec drain, ELF decode, " - "and deferred file read succeeded" + "PASS: persistent monitoring, concurrent execs, signal cleanup, ELF decode, " + "and deferred file reads succeeded" ) return 0 From 79bd072abca31e3b8f667dcc590ef55fd45a716a Mon Sep 17 00:00:00 2001 From: LinuxDev9002 Date: Wed, 22 Jul 2026 02:46:22 -0700 Subject: [PATCH 2/4] docs: preserve lesson 54 introduction --- src/54-exec-image-inspector/README.md | 2 +- src/54-exec-image-inspector/README.zh.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/54-exec-image-inspector/README.md b/src/54-exec-image-inspector/README.md index e8743701..6ddc378d 100644 --- a/src/54-exec-image-inspector/README.md +++ b/src/54-exec-image-inspector/README.md @@ -2,7 +2,7 @@ When a process calls `execve`, the kernel replaces its memory image with a new executable. But which executable, exactly? If the command line says `/usr/bin/wrapper.sh --config /etc/app.conf`, the actual running code might be a Python interpreter or a compiled binary launched three layers deep through wrapper scripts. Security tools, container runtimes, and troubleshooting utilities all need to know what the kernel *actually* installed, not just what the user typed. -This tutorial builds a continuously running tool that captures that information at the kernel level. It hooks the moment credentials are committed after each successful exec, schedules a deferred callback, then reads the installed executable's ELF header and reports the architecture, byte order, and file type. Along the way, it demonstrates two recent kernel features (BPF task work and file dynptr) that together solve a problem traditional eBPF approaches cannot. +This tutorial builds a tool that captures that information at the kernel level. It hooks the moment credentials are committed after exec, schedules a deferred callback, then reads the installed executable's ELF header and reports the architecture, byte order, and file type. Along the way, it demonstrates two recent kernel features (BPF task work and file dynptr) that together solve a problem traditional eBPF approaches cannot. > Complete source: diff --git a/src/54-exec-image-inspector/README.zh.md b/src/54-exec-image-inspector/README.zh.md index 33564735..19df052f 100644 --- a/src/54-exec-image-inspector/README.zh.md +++ b/src/54-exec-image-inspector/README.zh.md @@ -2,7 +2,7 @@ 当进程调用 `execve` 时,内核会用新的可执行镜像替换它的内存映像。但具体是哪个可执行文件?如果命令行显示 `/usr/bin/wrapper.sh --config /etc/app.conf`,实际运行的代码可能是三层包装脚本深处的 Python 解释器或编译好的二进制。安全工具、容器运行时、故障排查工具都需要知道内核 *实际* 安装的是什么,而不仅仅是用户输入的命令行。 -本教程构建一个持续运行、在内核层面捕获这些信息的工具。它在每次成功 exec 提交凭据后触发钩子,安排一个延迟回调,然后读取已安装可执行文件的 ELF 头部,报告其架构、字节序和文件类型。过程中会演示两个较新的内核特性(BPF task work 和 file dynptr),它们组合起来可以解决传统 eBPF 方案无法处理的问题。 +本教程构建一个在内核层面捕获这些信息的工具。它在 exec 提交凭据后挂载钩子,安排一个延迟回调,然后读取已安装可执行文件的 ELF 头部,报告其架构、字节序和文件类型。过程中会演示两个较新的内核特性(BPF task work 和 file dynptr),它们组合起来可以解决传统 eBPF 方案无法处理的问题。 > 完整源码: From e53fc8ee306bced7e1dc2ac8d87fc92eea4906ea Mon Sep 17 00:00:00 2001 From: LinuxDev9002 Date: Wed, 22 Jul 2026 02:54:34 -0700 Subject: [PATCH 3/4] docs: remove design aside from lesson 54 --- src/54-exec-image-inspector/README.md | 2 -- src/54-exec-image-inspector/README.zh.md | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/54-exec-image-inspector/README.md b/src/54-exec-image-inspector/README.md index 6ddc378d..c982925a 100644 --- a/src/54-exec-image-inspector/README.md +++ b/src/54-exec-image-inspector/README.md @@ -14,8 +14,6 @@ The most direct approach to inspecting an executable is reading `/proc//exe Tracepoints and kprobes can hook `sched_process_exec` to observe exec events synchronously, but these hooks run in what the kernel calls a **non-sleepable context**. This matters because of how Linux manages file data in memory. -This tutorial uses an LSM hook for a second, stricter reason: the kernel exposes `bpf_get_task_exe_file`, `bpf_put_file`, and `bpf_path_d_path` only to BPF LSM programs. A `sched_process_exec` tracepoint can report basic exec metadata, but it cannot call those kfuncs, and its borrowed `bprm->file` cannot be retained across an asynchronous task-work boundary. Without BPF LSM, this exact design cannot reliably recover the installed executable file and path for deferred cold-page reads. - When you read from a file, the kernel first checks whether the requested bytes are already in the **page cache**, a memory region that caches recently-accessed file data. If they are, the read completes immediately. If they are not (a **cold page**), the kernel must issue I/O to the storage device, and the calling context must **sleep** while waiting for that I/O to complete. BPF programs attached to tracepoints and kprobes cannot sleep. They run with interrupts potentially disabled and locks held; sleeping would deadlock the system. If a BPF program tries to read file content and encounters a cold page, the read fails with `-EFAULT` instead of waiting for I/O. diff --git a/src/54-exec-image-inspector/README.zh.md b/src/54-exec-image-inspector/README.zh.md index 19df052f..1792aa97 100644 --- a/src/54-exec-image-inspector/README.zh.md +++ b/src/54-exec-image-inspector/README.zh.md @@ -14,8 +14,6 @@ Tracepoint 和 kprobe 可以钩住 `sched_process_exec` 同步观察 exec 事件,但这些钩子运行在内核所谓的**不可睡眠上下文**中。为什么这很重要?这涉及到 Linux 如何管理内存中的文件数据。 -本教程使用 LSM 还有一个更严格的原因:内核只允许 BPF LSM 程序调用 `bpf_get_task_exe_file`、`bpf_put_file` 和 `bpf_path_d_path`。`sched_process_exec` tracepoint 可以报告基本 exec 元数据,却不能调用这些 kfunc;它借用的 `bprm->file` 也不能跨异步 task-work 边界保留。没有 BPF LSM,这套设计无法为延迟冷页读取可靠地取得已安装的可执行文件和路径。 - 当你读取文件时,内核首先检查请求的字节是否已经在**页缓存**(page cache)中,这是一块缓存最近访问过的文件数据的内存区域。如果在,读取立即完成。如果不在(即**冷页**),内核必须向存储设备发起 I/O 请求,调用上下文必须**睡眠**等待 I/O 完成。 挂载在 tracepoint 和 kprobe 上的 BPF 程序不能睡眠。它们运行时可能中断被禁用、持有锁;如果睡眠会导致系统死锁。当 BPF 程序尝试读取文件内容遇到冷页时,读取会以 `-EFAULT` 失败,而不是等待 I/O。 From dd5a9d50102c4880069b43828841e81b80fd9cec Mon Sep 17 00:00:00 2001 From: LinuxDev9002 Date: Wed, 22 Jul 2026 03:08:11 -0700 Subject: [PATCH 4/4] Simplify lesson 54 to the monitor path --- src/54-exec-image-inspector/README.md | 531 ++---------------- src/54-exec-image-inspector/README.zh.md | 531 ++---------------- .../exec-image-flow.dot | 29 +- .../exec-image-flow.png | Bin 109558 -> 89598 bytes .../exec_image_inspector.bpf.c | 139 ++--- .../exec_image_inspector.c | 56 +- .../exec_image_inspector.h | 9 - .../tests/test_exec_image_inspector.py | 160 ++---- 8 files changed, 207 insertions(+), 1248 deletions(-) diff --git a/src/54-exec-image-inspector/README.md b/src/54-exec-image-inspector/README.md index c982925a..e4b4b23e 100644 --- a/src/54-exec-image-inspector/README.md +++ b/src/54-exec-image-inspector/README.md @@ -28,11 +28,11 @@ Linux 6.19 introduced **file dynptr**, which provides verifier-tracked access to Combining these features, the design becomes: -1. Attach an LSM hook to `bprm_committed_creds`, which fires after each successful exec installs the new credentials +1. Attach an LSM hook to `bprm_committed_creds`, which fires after exec installs the new credentials 2. In the hook (non-sleepable), create per-exec state and schedule a task work callback 3. The callback runs in a sleepable context, where it can access the installed executable, read content from any offset (including cold pages), and send results to user space -This separation (admit the exec in a non-sleepable hook, do the heavy lifting in a sleepable callback) is the key insight. +This separation (schedule work in a non-sleepable hook, read the file in a sleepable callback) is the key insight. ## How BPF task work operates @@ -56,7 +56,7 @@ In a non-sleepable context, `bpf_dynptr_read` only succeeds if the target bytes ## Tool architecture -The user-space program loads and attaches the BPF program, creates a ring buffer reader, and prints `READY scope=system-wide`. It then remains active until SIGINT or SIGTERM, so workloads can start independently after readiness instead of being launched through a special child-command interface. +The user-space program loads and attaches the BPF program, creates a ring buffer reader, and prints `READY scope=system-wide`. It then remains active until SIGINT or SIGTERM while workloads run normally. For every successful exec after `READY`, the `lsm/bprm_committed_creds` hook inserts one `exec_work` value into the `pending` HASH map under the current `pid_tgid`, records a timestamp, and schedules a task work callback. Failed insertions or scheduling attempts are counted and clean up the map entry. @@ -68,7 +68,7 @@ The callback (`inspect_executable`) runs later in the execing task's sleepable c 4. Parses ELF fields: magic number, class (32/64-bit), data (endianness), type (executable vs shared object), and machine (architecture) 5. Sends an event through the ring buffer -User space polls the ring buffer until a signal arrives. Shutdown first detaches the LSM program to stop admitting new execs, waits until `completed >= scheduled`, drains remaining events, prints stable counters, and only then destroys the skeleton. This ordering prevents queued callbacks from outliving their maps or ring buffer. +User space polls the ring buffer until a signal arrives. On shutdown it detaches the LSM program, waits until `completed >= scheduled`, drains remaining events, prints the counters, and then destroys the skeleton. ![Exec image inspector data flow](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/54-exec-image-inspector/exec-image-flow.png) @@ -87,7 +87,6 @@ The implementation spans four files: a shared header, a compatibility header for #define EXEC_COMM_LEN 16 #define EXEC_PATH_LEN 256 -#define EXEC_PROBE_LEN 8 struct exec_event { unsigned int pid; @@ -100,13 +99,9 @@ struct exec_event { unsigned short elf_machine; int header_error; int path_error; - int direct_probe_error; - int deferred_probe_error; unsigned long long latency_ns; - unsigned long long probe_offset; char comm[EXEC_COMM_LEN]; char path[EXEC_PATH_LEN]; - unsigned char probe_bytes[EXEC_PROBE_LEN]; }; struct inspector_stats { @@ -117,10 +112,6 @@ struct inspector_stats { unsigned long long completed; unsigned long long header_errors; unsigned long long path_errors; - unsigned long long direct_probes; - unsigned long long direct_probe_errors; - unsigned long long deferred_probes; - unsigned long long deferred_probe_errors; unsigned long long dropped; unsigned long long cleanup_errors; }; @@ -191,8 +182,6 @@ char LICENSE[] SEC("license") = "GPL"; #define ELFDATA2LSB 1 #define ELFDATA2MSB 2 -const volatile __u32 probe_offset; - struct inspector_stats stats; struct { @@ -202,7 +191,6 @@ struct { struct exec_work { __u64 scheduled_ns; - int direct_probe_error; struct bpf_task_work work; }; @@ -221,129 +209,63 @@ static __u16 read_elf_u16(const unsigned char *header, int offset, __u8 data) return header[offset] | ((__u16)header[offset + 1] << 8); } -static int probe_file_without_sleep(struct file *file) +static int inspect_executable(struct bpf_map *map, void *key, void *value) { - unsigned char sample[EXEC_PROBE_LEN]; + unsigned char header[64] = {}; + struct exec_work *work = value; + struct exec_event event = {}; + struct task_struct *task; struct bpf_dynptr dynptr; + struct file *file; + __u64 pid_tgid; int err; - if (!probe_offset) - return 0; + __sync_fetch_and_add(&stats.callbacks, 1); + pid_tgid = bpf_get_current_pid_tgid(); + event.pid = (__u32)pid_tgid; + event.tgid = pid_tgid >> 32; + event.latency_ns = bpf_ktime_get_ns() - work->scheduled_ns; + bpf_get_current_comm(event.comm, sizeof(event.comm)); - __sync_fetch_and_add(&stats.direct_probes, 1); + task = bpf_get_current_task_btf(); + file = bpf_get_task_exe_file(task); if (!file) { - err = -ENOENT; - goto record; - } - - err = bpf_dynptr_from_file(file, 0, &dynptr); - if (err) { - bpf_dynptr_file_discard(&dynptr); - goto record; + event.header_error = -ENOENT; + __sync_fetch_and_add(&stats.header_errors, 1); + goto emit; } - err = bpf_dynptr_read(sample, sizeof(sample), &dynptr, probe_offset, 0); - bpf_dynptr_file_discard(&dynptr); - -record: - if (err) - __sync_fetch_and_add(&stats.direct_probe_errors, 1); - return err; -} - -static __always_inline void record_header_error(struct exec_event *event, int err) -{ - event->header_error = err; - __sync_fetch_and_add(&stats.header_errors, 1); -} - -static __always_inline void record_deferred_probe(struct exec_event *event, - int err) -{ - if (!probe_offset) - return; - - event->deferred_probe_error = err; - __sync_fetch_and_add(&stats.deferred_probes, 1); - if (err) - __sync_fetch_and_add(&stats.deferred_probe_errors, 1); -} - -static __always_inline void parse_elf_header(const unsigned char *header, - struct exec_event *event) -{ - if (event->header_error || header[0] != 0x7f || header[1] != 'E' || - header[2] != 'L' || header[3] != 'F') - return; - - event->is_elf = 1; - event->elf_class = header[EI_CLASS]; - event->elf_data = header[EI_DATA]; - event->elf_type = read_elf_u16(header, 16, event->elf_data); - event->elf_machine = read_elf_u16(header, 18, event->elf_data); -} - -static __always_inline void inspect_file(struct file *file, - struct exec_event *event) -{ - unsigned char header[64] = {}; - struct bpf_dynptr dynptr; - int err; - - err = bpf_path_d_path(&file->f_path, event->path, sizeof(event->path)); + err = bpf_path_d_path(&file->f_path, event.path, sizeof(event.path)); if (err < 0) { - event->path_error = err; + event.path_error = err; __sync_fetch_and_add(&stats.path_errors, 1); } err = bpf_dynptr_from_file(file, 0, &dynptr); if (err) { bpf_dynptr_file_discard(&dynptr); - record_header_error(event, err); - record_deferred_probe(event, err); - return; + event.header_error = err; + __sync_fetch_and_add(&stats.header_errors, 1); + goto put_file; } err = bpf_dynptr_read(header, sizeof(header), &dynptr, 0, 0); - if (err) - record_header_error(event, err); - - if (probe_offset) { - err = bpf_dynptr_read(event->probe_bytes, - sizeof(event->probe_bytes), - &dynptr, probe_offset, 0); - record_deferred_probe(event, err); + if (err) { + event.header_error = err; + __sync_fetch_and_add(&stats.header_errors, 1); } bpf_dynptr_file_discard(&dynptr); - parse_elf_header(header, event); -} - -static int inspect_executable(struct bpf_map *map, void *key, void *value) -{ - struct exec_work *work = value; - struct exec_event event = {}; - struct task_struct *task; - struct file *file; - __u64 pid_tgid; - - __sync_fetch_and_add(&stats.callbacks, 1); - pid_tgid = bpf_get_current_pid_tgid(); - event.pid = (__u32)pid_tgid; - event.tgid = pid_tgid >> 32; - event.latency_ns = bpf_ktime_get_ns() - work->scheduled_ns; - event.direct_probe_error = work->direct_probe_error; - event.probe_offset = probe_offset; - bpf_get_current_comm(event.comm, sizeof(event.comm)); - task = bpf_get_current_task_btf(); - file = bpf_get_task_exe_file(task); - if (!file) { - record_header_error(&event, -ENOENT); - record_deferred_probe(&event, -ENOENT); - goto emit; + if (!event.header_error && header[0] == 0x7f && header[1] == 'E' && + header[2] == 'L' && header[3] == 'F') { + event.is_elf = 1; + event.elf_class = header[EI_CLASS]; + event.elf_data = header[EI_DATA]; + event.elf_type = read_elf_u16(header, 16, event.elf_data); + event.elf_machine = read_elf_u16(header, 18, event.elf_data); } - inspect_file(file, &event); +put_file: bpf_put_file(file); emit: if (bpf_ringbuf_output(&events, &event, sizeof(event), 0)) @@ -364,6 +286,7 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) __u64 key; int err; + (void)bprm; pid_tgid = bpf_get_current_pid_tgid(); key = pid_tgid; __sync_fetch_and_add(&stats.matched, 1); @@ -381,7 +304,6 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) } work->scheduled_ns = bpf_ktime_get_ns(); - work->direct_probe_error = probe_file_without_sleep(bprm->file); task = bpf_get_current_task_btf(); err = bpf_task_work_schedule_signal(task, &work->work, &pending, inspect_executable); @@ -395,15 +317,11 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) } ``` -The entry point is `schedule_exec_inspection`, declared with `SEC("lsm/bprm_committed_creds")`. This LSM hook fires after the new executable's credentials have been installed, so `bprm->file` points to the file being executed. The hook itself is non-sleepable, but it can admit the exec and schedule the deferred work. - -The optional `probe_offset` variable lives in `.rodata`. User space writes it between `open()` and `load()`, and the verifier treats it as a compile-time constant for optimization. +The entry point is `schedule_exec_inspection`, declared with `SEC("lsm/bprm_committed_creds")`. This LSM hook fires after the new executable's credentials have been installed. The hook itself is non-sleepable, so it creates the per-exec state and schedules the deferred work. -For each exec, the program inserts a zeroed `struct exec_work` into the `pending` HASH map with `BPF_NOEXIST`, keyed by `pid_tgid`, then looks it up to fill the timestamp and optional direct-probe result. The callback deletes that exact key. This supports concurrent execs without sharing one task-work slot. +For each exec, the program inserts a zeroed `struct exec_work` into the `pending` HASH map with `BPF_NOEXIST`, keyed by `pid_tgid`, then records the timestamp. The callback deletes that exact key. This supports concurrent execs without sharing one task-work slot. -The optional `--probe-offset` flag makes the tool attempt a direct read in the non-sleepable hook via `probe_file_without_sleep`. The test suite uses this to verify that reading a cold page fails with `-EFAULT` in the non-sleepable context but succeeds in the sleepable callback. - -After saving the timestamp and direct-probe result, the hook calls `bpf_task_work_schedule_signal`. The kernel holds the references needed to execute the callback later. Every insert, lookup, or scheduling failure is counted, and every path that created pending state deletes it. +The hook calls `bpf_task_work_schedule_signal` after saving the timestamp. The kernel holds the references needed to execute the callback later. Every insert, lookup, or scheduling failure is counted, and every path that created pending state deletes it. The callback `inspect_executable` calculates latency for diagnostics, then acquires the executable file with `bpf_get_task_exe_file`. This returns a referenced `struct file` that must be released with `bpf_put_file`. The callback resolves the path, creates a file dynptr, reads the 64-byte ELF header, and parses it. The `read_elf_u16` helper handles endianness: ELF files declare their byte order in the header, and multi-byte fields must be read accordingly. @@ -411,330 +329,9 @@ Every path that creates a dynptr, success or failure, must call `bpf_dynptr_file ### User-space loader -`exec_image_inspector.c` loads BPF, receives events continuously, handles signals, and reports results: +The complete loader is linked at the beginning of this tutorial. Its main lifecycle is: ```c -// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "exec_image_inspector.h" -#include "exec_image_inspector.skel.h" - -struct environment { - unsigned long long probe_offset; - bool verbose; -}; - -struct event_context { - unsigned long long seen; -}; - -static struct environment env; -static volatile sig_atomic_t exiting; - -static int libbpf_print_fn(enum libbpf_print_level level, const char *format, - va_list args) -{ - if (level == LIBBPF_DEBUG && !env.verbose) - return 0; - return vfprintf(stderr, format, args); -} - -static void usage(FILE *stream, const char *program) -{ - fprintf(stream, - "Usage: %s [--probe-offset BYTES] [--verbose]\n\n" - "Continuously inspect executable images installed by exec.\n" - "Press Ctrl-C to stop and print a summary.\n\n" - "Options:\n" - " -p, --probe-offset BYTES compare reads at a positive offset\n" - " -v, --verbose print libbpf diagnostics\n" - " -h, --help show this help\n", - program); -} - -static int parse_probe_offset(const char *value) -{ - char *end = NULL; - unsigned long long parsed; - - errno = 0; - parsed = strtoull(value, &end, 10); - if (errno || end == value || *end || !parsed || - parsed > UINT_MAX - EXEC_PROBE_LEN) { - fprintf(stderr, "invalid probe offset: %s\n", value); - return -EINVAL; - } - env.probe_offset = parsed; - return 0; -} - -static int parse_args(int argc, char **argv) -{ - static const struct option options[] = { - { "probe-offset", required_argument, NULL, 'p' }, - { "verbose", no_argument, NULL, 'v' }, - { "help", no_argument, NULL, 'h' }, - {}, - }; - int option; - - while ((option = getopt_long(argc, argv, "+p:vh", options, NULL)) != -1) { - switch (option) { - case 'p': - if (parse_probe_offset(optarg)) - return -EINVAL; - break; - case 'v': - env.verbose = true; - break; - case 'h': - usage(stdout, argv[0]); - exit(0); - default: - return -EINVAL; - } - } - - if (optind != argc) { - fprintf(stderr, "unexpected argument: %s\n", argv[optind]); - return -EINVAL; - } - return 0; -} - -static void handle_signal(int signal_number) -{ - (void)signal_number; - exiting = 1; -} - -static int install_signal_handlers(void) -{ - struct sigaction action = { - .sa_handler = handle_signal, - }; - - sigemptyset(&action.sa_mask); - if (sigaction(SIGINT, &action, NULL) || sigaction(SIGTERM, &action, NULL)) - return -errno; - return 0; -} - -static int drain_events(struct ring_buffer *ring_buffer) -{ - int error; - - for (;;) { - error = ring_buffer__poll(ring_buffer, 0); - if (error == -EINTR) - continue; - if (error < 0) { - fprintf(stderr, "ring-buffer drain failed: %s\n", - strerror(-error)); - return error; - } - if (!error) - return 0; - } -} - -static const char *elf_class_name(unsigned char value) -{ - switch (value) { - case 1: - return "ELF32"; - case 2: - return "ELF64"; - default: - return "UNKNOWN"; - } -} - -static const char *elf_data_name(unsigned char value) -{ - switch (value) { - case 1: - return "LSB"; - case 2: - return "MSB"; - default: - return "UNKNOWN"; - } -} - -static const char *elf_type_name(unsigned short value) -{ - switch (value) { - case 2: - return "ET_EXEC"; - case 3: - return "ET_DYN"; - default: - return "OTHER"; - } -} - -static const char *elf_machine_name(unsigned short value) -{ - switch (value) { - case 3: - return "EM_386"; - case 62: - return "EM_X86_64"; - case 183: - return "EM_AARCH64"; - default: - return "OTHER"; - } -} - -static int handle_event(void *context, void *data, size_t size) -{ - const struct exec_event *event = data; - struct event_context *events = context; - unsigned int index; - - if (size < sizeof(*event)) { - fprintf(stderr, "short ring-buffer event: %zu bytes\n", size); - return 0; - } - - events->seen++; - printf("EXEC pid=%u tgid=%u comm=%.*s path=%.*s is_elf=%u " - "class=%s endian=%s type=%s(%u) machine=%s(%u) " - "header_error=%d path_error=%d latency_us=%llu\n", - event->pid, event->tgid, EXEC_COMM_LEN, event->comm, - EXEC_PATH_LEN, event->path, event->is_elf, - elf_class_name(event->elf_class), elf_data_name(event->elf_data), - elf_type_name(event->elf_type), event->elf_type, - elf_machine_name(event->elf_machine), event->elf_machine, - event->header_error, event->path_error, - event->latency_ns / 1000); - - if (event->probe_offset) { - printf("PROBE offset=%llu direct_error=%d deferred_error=%d bytes=", - event->probe_offset, event->direct_probe_error, - event->deferred_probe_error); - for (index = 0; index < EXEC_PROBE_LEN; index++) - printf("%02x", event->probe_bytes[index]); - putchar('\n'); - } - fflush(stdout); - return 0; -} - -static int setup_inspector(struct event_context *events, - struct exec_image_inspector_bpf **skeleton, - struct ring_buffer **ring_buffer) -{ - struct exec_image_inspector_bpf *skel; - struct ring_buffer *ring; - int error; - - skel = exec_image_inspector_bpf__open(); - if (!skel) { - fprintf(stderr, "failed to open BPF skeleton\n"); - return -ENOMEM; - } - *skeleton = skel; - skel->rodata->probe_offset = env.probe_offset; - - error = exec_image_inspector_bpf__load(skel); - if (error) { - fprintf(stderr, - "failed to load BPF object: %s\n" - "This monitor requires Linux 6.19+, BTF, BPF JIT, " - "CONFIG_BPF_LSM=y, and an active bpf LSM.\n" - "Check the active list with: cat /sys/kernel/security/lsm\n", - strerror(-error)); - return error; - } - error = exec_image_inspector_bpf__attach(skel); - if (error) { - fprintf(stderr, "failed to attach bprm_committed_creds LSM hook: %s\n", - strerror(-error)); - return error; - } - - ring = ring_buffer__new(bpf_map__fd(skel->maps.events), handle_event, - events, NULL); - if (!ring) { - fprintf(stderr, "failed to create ring buffer: %s\n", strerror(errno)); - return errno ? -errno : -ENOMEM; - } - *ring_buffer = ring; - return 0; -} - -static int monitor_execs(struct ring_buffer *ring_buffer) -{ - int error; - - printf("READY scope=system-wide probe_offset=%llu\n", env.probe_offset); - fflush(stdout); - while (!exiting) { - error = ring_buffer__poll(ring_buffer, 100); - if (error == -EINTR) - continue; - if (error < 0) { - fprintf(stderr, "ring-buffer poll failed: %s\n", strerror(-error)); - return error; - } - } - return 0; -} - -static int drain_pending_events(struct ring_buffer *ring_buffer, - const struct exec_image_inspector_bpf *skel) -{ - int attempts, error; - - for (attempts = 0; attempts < 10; attempts++) { - if (skel->bss->stats.completed >= skel->bss->stats.scheduled) - return drain_events(ring_buffer); - error = ring_buffer__poll(ring_buffer, 100); - if (error == -EINTR) - continue; - if (error < 0) { - fprintf(stderr, "ring-buffer shutdown poll failed: %s\n", - strerror(-error)); - return error; - } - } - - fprintf(stderr, "timed out waiting for %llu scheduled callbacks\n", - skel->bss->stats.scheduled - skel->bss->stats.completed); - return -ETIMEDOUT; -} - -static void report_result(const struct exec_image_inspector_bpf *skel, - const struct event_context *events) -{ - struct inspector_stats final_stats = skel->bss->stats; - - printf("SUMMARY matched=%llu scheduled=%llu schedule_errors=%llu " - "callbacks=%llu completed=%llu header_errors=%llu path_errors=%llu " - "direct_probes=%llu direct_probe_errors=%llu " - "deferred_probes=%llu deferred_probe_errors=%llu dropped=%llu " - "cleanup_errors=%llu events=%llu\n", - final_stats.matched, final_stats.scheduled, - final_stats.schedule_errors, final_stats.callbacks, - final_stats.completed, final_stats.header_errors, - final_stats.path_errors, - final_stats.direct_probes, final_stats.direct_probe_errors, - final_stats.deferred_probes, final_stats.deferred_probe_errors, - final_stats.dropped, final_stats.cleanup_errors, events->seen); -} - int main(int argc, char **argv) { struct exec_image_inspector_bpf *skel = NULL; @@ -773,7 +370,7 @@ cleanup: } ``` -`setup_inspector` opens, configures, loads, and attaches the skeleton before creating the ring buffer. `monitor_execs` prints `READY`, then polls until SIGINT or SIGTERM. There is no required timeout and no `-- COMMAND` child-launch mode. +`setup_inspector` opens, loads, and attaches the skeleton before creating the ring buffer. `monitor_execs` prints `READY` and polls until SIGINT or SIGTERM. On shutdown, `main` detaches first. `drain_pending_events` then waits in bounded 100 ms polls for `completed` to catch up with `scheduled`, drains the ring buffer, and reports all counters before resources are destroyed. @@ -789,7 +386,7 @@ make -C src/54-exec-image-inspector clean make -C src/54-exec-image-inspector -j2 ``` -The test suite requires Linux 6.19 or newer with the BPF LSM active. Check that `bpf` appears in the LSM list: +Before running, check that `bpf` appears in the active LSM list: ```bash cat /sys/kernel/security/lsm @@ -797,44 +394,20 @@ cat /sys/kernel/security/lsm If `bpf` is missing, add it to the kernel command line: change `lsm=` to `lsm=,bpf` in your bootloader configuration. -Run the tests: +Start the monitor: ```bash -cd src/54-exec-image-inspector -sudo make test -``` - -The repository CI compiles this lesson. Runtime behavior was also functionally tested in the tutorial KVM on x86_64 with kernel `7.2.0-rc4`. A shortened sample is: - -```text -TEST-CONTINUOUS workers=16 matched=18 callbacks=18 events=18 -READY scope=system-wide probe_offset=4214784 -EXEC pid=... tgid=... comm=exec_fixture_im path=/tmp/.../exec_fixture_image is_elf=1 class=ELF64 endian=LSB type=ET_DYN(3) machine=EM_X86_64(62) header_error=0 path_error=0 latency_us=... -PROBE offset=4214784 direct_error=-14 deferred_error=0 bytes=454950524f424521 -SUMMARY matched=18 scheduled=18 schedule_errors=0 callbacks=18 completed=18 header_errors=0 path_errors=0 direct_probes=18 direct_probe_errors=18 deferred_probes=18 deferred_probe_errors=2 dropped=0 cleanup_errors=0 events=18 -PASS: persistent monitoring, concurrent execs, signal cleanup, ELF decode, and deferred file reads succeeded +sudo ./src/54-exec-image-inspector/exec_image_inspector ``` -The test starts the monitor, waits for `READY`, launches 16 fixture processes concurrently plus a shell that re-execs `/bin/true`, and stops the monitor with SIGINT. It checks `scheduled == callbacks == completed == events`, with zero scheduling, drop, or cleanup errors. It also verifies that the obsolete `--timeout-ms` and `-- COMMAND` interface is rejected. +Once the program prints `READY scope=system-wide`, it reports each successful exec with an `EXEC` line containing the process IDs, command name, resolved executable path, ELF metadata, and callback latency. Press Ctrl-C to stop; the final `SUMMARY` shows scheduling, callback, error, drop, and event counts. -The `EXEC` line shows the installed image and parsed ELF fields. The `PROBE` line demonstrates the sleepable-context difference: the test writes a marker (`EIPROBE!`) to a page, flushes and evicts it from the page cache, then execs. The direct read in the non-sleepable hook returns `-EFAULT` (`-14`) because the page is cold. The deferred read in the sleepable callback succeeds, returning the marker bytes as hex (`454950524f424521`). - -To monitor subsequent execs system-wide: +Use `--verbose` when libbpf diagnostics are needed: ```bash -sudo ./exec_image_inspector +sudo ./src/54-exec-image-inspector/exec_image_inspector --verbose ``` -Command-line format: - -```text -exec_image_inspector [--probe-offset BYTES] [--verbose] -``` - -- `--probe-offset`: Read 8 bytes at this offset both in the hook (direct) and in the callback (deferred), to verify the cold-page difference. -- `--verbose`: Print libbpf diagnostic messages. -- Ctrl-C or SIGTERM: Stop admission, wait for scheduled callbacks, drain events, print `SUMMARY`, and unload. - ### Requirements | Requirement | Details | @@ -847,11 +420,11 @@ exec_image_inspector [--probe-offset BYTES] [--verbose] ## Limitations and extensions -This tool observes successful execs system-wide after `READY`. The pending HASH map supports up to 4096 concurrent `pid_tgid` keys; insertion or scheduling pressure is visible in `schedule_errors`. Shutdown waits for callbacks for about one second before returning an error rather than destroying live callback state silently. `--probe-offset` is an advanced diagnostic for comparing cold-page behavior, not a workload filter. +This tool observes successful execs system-wide after `READY`. The pending HASH map supports up to 4096 concurrent `pid_tgid` keys; insertion or scheduling pressure is visible in `schedule_errors`. Shutdown waits for callbacks for about one second before returning an error. ## Summary -This tutorial demonstrates how to combine BPF task work and file dynptr to inspect the executable image actually installed by exec. The key insight is separating two moments: admitting an exec (in a non-sleepable LSM hook) and reading file content (in a sleepable task work callback). This lets eBPF programs read file data reliably, even when the target bytes are not in the page cache. +This tutorial demonstrates how to combine BPF task work and file dynptr to inspect the executable image actually installed by exec. The LSM hook schedules work for each exec, and the task work callback reads the file in a sleepable context. This lets eBPF programs read file data reliably, even when the target bytes are not in the page cache. The persistent monitor exposes a natural `READY` boundary for independent workloads. Detach-before-drain shutdown, per-exec pending state, and completed-work accounting keep concurrent callbacks safe while preserving the original task-work and file-dynptr lesson. diff --git a/src/54-exec-image-inspector/README.zh.md b/src/54-exec-image-inspector/README.zh.md index 1792aa97..88ad7229 100644 --- a/src/54-exec-image-inspector/README.zh.md +++ b/src/54-exec-image-inspector/README.zh.md @@ -28,11 +28,11 @@ Linux 6.19 引入了 **file dynptr**,提供验证器跟踪的文件数据访 结合这两个特性,设计变成: -1. 在 `bprm_committed_creds` 挂载 LSM 钩子,它在每次成功 exec 安装新凭据后触发 +1. 在 `bprm_committed_creds` 挂载 LSM 钩子,它在 exec 安装新凭据后触发 2. 在钩子中(不可睡眠)创建每次 exec 独立的状态并安排 task work 回调 3. 回调在可睡眠上下文中执行,可以访问已安装的可执行文件、读取任意偏移的内容(包括冷页)、然后把结果发送给用户态 -这种分离(在不可睡眠的钩子中接收 exec,在可睡眠的回调中完成重活)是关键思路。 +这种分离(在不可睡眠钩子中安排工作,在可睡眠回调中读取文件)是关键思路。 ## BPF task work 的工作机制 @@ -56,7 +56,7 @@ dynptr 用边界信息包装指针,BPF 验证器可以追踪这些边界。对 ## 工具架构 -用户态程序加载并挂载 BPF 程序,创建 ring buffer reader,然后打印 `READY scope=system-wide`。之后它会持续运行到收到 SIGINT 或 SIGTERM,因此 workload 可以在就绪后独立启动,不需要通过特殊的子命令接口运行。 +用户态程序加载并挂载 BPF 程序,创建 ring buffer reader,然后打印 `READY scope=system-wide`。之后它会持续运行到收到 SIGINT 或 SIGTERM,期间 workload 可以正常运行。 `READY` 之后每次成功 exec 都会触发 `lsm/bprm_committed_creds`。钩子以当前 `pid_tgid` 为键向 `pending` HASH map 插入一个 `exec_work`,记录时间戳并安排 task work 回调。插入或调度失败都会被计数并清理对应 map 条目。 @@ -68,7 +68,7 @@ dynptr 用边界信息包装指针,BPF 验证器可以追踪这些边界。对 4. 解析 ELF 字段:魔数、class(32/64 位)、data(字节序)、type(可执行文件 vs 共享对象)、machine(架构) 5. 通过 ring buffer 发送事件 -用户态轮询 ring buffer,直到收到信号。关闭时先解除 LSM 挂载,阻止接收新的 exec;再等待 `completed >= scheduled`,排空剩余事件,打印稳定计数,最后销毁 skeleton。这个顺序避免排队中的回调晚于 map 或 ring buffer 的生命周期。 +用户态轮询 ring buffer,直到收到信号。关闭时先解除 LSM 挂载,再等待 `completed >= scheduled`,排空剩余事件并打印计数,最后销毁 skeleton。 ![exec 镜像检查器数据流](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/54-exec-image-inspector/exec-image-flow.png) @@ -87,7 +87,6 @@ dynptr 用边界信息包装指针,BPF 验证器可以追踪这些边界。对 #define EXEC_COMM_LEN 16 #define EXEC_PATH_LEN 256 -#define EXEC_PROBE_LEN 8 struct exec_event { unsigned int pid; @@ -100,13 +99,9 @@ struct exec_event { unsigned short elf_machine; int header_error; int path_error; - int direct_probe_error; - int deferred_probe_error; unsigned long long latency_ns; - unsigned long long probe_offset; char comm[EXEC_COMM_LEN]; char path[EXEC_PATH_LEN]; - unsigned char probe_bytes[EXEC_PROBE_LEN]; }; struct inspector_stats { @@ -117,10 +112,6 @@ struct inspector_stats { unsigned long long completed; unsigned long long header_errors; unsigned long long path_errors; - unsigned long long direct_probes; - unsigned long long direct_probe_errors; - unsigned long long deferred_probes; - unsigned long long deferred_probe_errors; unsigned long long dropped; unsigned long long cleanup_errors; }; @@ -191,8 +182,6 @@ char LICENSE[] SEC("license") = "GPL"; #define ELFDATA2LSB 1 #define ELFDATA2MSB 2 -const volatile __u32 probe_offset; - struct inspector_stats stats; struct { @@ -202,7 +191,6 @@ struct { struct exec_work { __u64 scheduled_ns; - int direct_probe_error; struct bpf_task_work work; }; @@ -221,129 +209,63 @@ static __u16 read_elf_u16(const unsigned char *header, int offset, __u8 data) return header[offset] | ((__u16)header[offset + 1] << 8); } -static int probe_file_without_sleep(struct file *file) +static int inspect_executable(struct bpf_map *map, void *key, void *value) { - unsigned char sample[EXEC_PROBE_LEN]; + unsigned char header[64] = {}; + struct exec_work *work = value; + struct exec_event event = {}; + struct task_struct *task; struct bpf_dynptr dynptr; + struct file *file; + __u64 pid_tgid; int err; - if (!probe_offset) - return 0; + __sync_fetch_and_add(&stats.callbacks, 1); + pid_tgid = bpf_get_current_pid_tgid(); + event.pid = (__u32)pid_tgid; + event.tgid = pid_tgid >> 32; + event.latency_ns = bpf_ktime_get_ns() - work->scheduled_ns; + bpf_get_current_comm(event.comm, sizeof(event.comm)); - __sync_fetch_and_add(&stats.direct_probes, 1); + task = bpf_get_current_task_btf(); + file = bpf_get_task_exe_file(task); if (!file) { - err = -ENOENT; - goto record; - } - - err = bpf_dynptr_from_file(file, 0, &dynptr); - if (err) { - bpf_dynptr_file_discard(&dynptr); - goto record; + event.header_error = -ENOENT; + __sync_fetch_and_add(&stats.header_errors, 1); + goto emit; } - err = bpf_dynptr_read(sample, sizeof(sample), &dynptr, probe_offset, 0); - bpf_dynptr_file_discard(&dynptr); - -record: - if (err) - __sync_fetch_and_add(&stats.direct_probe_errors, 1); - return err; -} - -static __always_inline void record_header_error(struct exec_event *event, int err) -{ - event->header_error = err; - __sync_fetch_and_add(&stats.header_errors, 1); -} - -static __always_inline void record_deferred_probe(struct exec_event *event, - int err) -{ - if (!probe_offset) - return; - - event->deferred_probe_error = err; - __sync_fetch_and_add(&stats.deferred_probes, 1); - if (err) - __sync_fetch_and_add(&stats.deferred_probe_errors, 1); -} - -static __always_inline void parse_elf_header(const unsigned char *header, - struct exec_event *event) -{ - if (event->header_error || header[0] != 0x7f || header[1] != 'E' || - header[2] != 'L' || header[3] != 'F') - return; - - event->is_elf = 1; - event->elf_class = header[EI_CLASS]; - event->elf_data = header[EI_DATA]; - event->elf_type = read_elf_u16(header, 16, event->elf_data); - event->elf_machine = read_elf_u16(header, 18, event->elf_data); -} - -static __always_inline void inspect_file(struct file *file, - struct exec_event *event) -{ - unsigned char header[64] = {}; - struct bpf_dynptr dynptr; - int err; - - err = bpf_path_d_path(&file->f_path, event->path, sizeof(event->path)); + err = bpf_path_d_path(&file->f_path, event.path, sizeof(event.path)); if (err < 0) { - event->path_error = err; + event.path_error = err; __sync_fetch_and_add(&stats.path_errors, 1); } err = bpf_dynptr_from_file(file, 0, &dynptr); if (err) { bpf_dynptr_file_discard(&dynptr); - record_header_error(event, err); - record_deferred_probe(event, err); - return; + event.header_error = err; + __sync_fetch_and_add(&stats.header_errors, 1); + goto put_file; } err = bpf_dynptr_read(header, sizeof(header), &dynptr, 0, 0); - if (err) - record_header_error(event, err); - - if (probe_offset) { - err = bpf_dynptr_read(event->probe_bytes, - sizeof(event->probe_bytes), - &dynptr, probe_offset, 0); - record_deferred_probe(event, err); + if (err) { + event.header_error = err; + __sync_fetch_and_add(&stats.header_errors, 1); } bpf_dynptr_file_discard(&dynptr); - parse_elf_header(header, event); -} - -static int inspect_executable(struct bpf_map *map, void *key, void *value) -{ - struct exec_work *work = value; - struct exec_event event = {}; - struct task_struct *task; - struct file *file; - __u64 pid_tgid; - - __sync_fetch_and_add(&stats.callbacks, 1); - pid_tgid = bpf_get_current_pid_tgid(); - event.pid = (__u32)pid_tgid; - event.tgid = pid_tgid >> 32; - event.latency_ns = bpf_ktime_get_ns() - work->scheduled_ns; - event.direct_probe_error = work->direct_probe_error; - event.probe_offset = probe_offset; - bpf_get_current_comm(event.comm, sizeof(event.comm)); - task = bpf_get_current_task_btf(); - file = bpf_get_task_exe_file(task); - if (!file) { - record_header_error(&event, -ENOENT); - record_deferred_probe(&event, -ENOENT); - goto emit; + if (!event.header_error && header[0] == 0x7f && header[1] == 'E' && + header[2] == 'L' && header[3] == 'F') { + event.is_elf = 1; + event.elf_class = header[EI_CLASS]; + event.elf_data = header[EI_DATA]; + event.elf_type = read_elf_u16(header, 16, event.elf_data); + event.elf_machine = read_elf_u16(header, 18, event.elf_data); } - inspect_file(file, &event); +put_file: bpf_put_file(file); emit: if (bpf_ringbuf_output(&events, &event, sizeof(event), 0)) @@ -364,6 +286,7 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) __u64 key; int err; + (void)bprm; pid_tgid = bpf_get_current_pid_tgid(); key = pid_tgid; __sync_fetch_and_add(&stats.matched, 1); @@ -381,7 +304,6 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) } work->scheduled_ns = bpf_ktime_get_ns(); - work->direct_probe_error = probe_file_without_sleep(bprm->file); task = bpf_get_current_task_btf(); err = bpf_task_work_schedule_signal(task, &work->work, &pending, inspect_executable); @@ -395,15 +317,11 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) } ``` -入口点是用 `SEC("lsm/bprm_committed_creds")` 声明的 `schedule_exec_inspection`。这个 LSM 钩子在新可执行文件的凭据安装后触发,此时 `bprm->file` 指向正在被执行的文件。钩子本身不可睡眠,但可以接收这次 exec 并安排延迟工作。 - -可选的 `probe_offset` 变量位于 `.rodata` 段。用户态在 `open()` 和 `load()` 之间写入值,验证器把它当作编译期常量来优化。 +入口点是用 `SEC("lsm/bprm_committed_creds")` 声明的 `schedule_exec_inspection`。这个 LSM 钩子在新可执行文件的凭据安装后触发。钩子本身不可睡眠,因此它创建每次 exec 独立的状态并安排延迟工作。 -每次 exec 都会用 `BPF_NOEXIST` 向 `pending` HASH map 插入清零的 `struct exec_work`,key 是 `pid_tgid`,然后查找该值并填入时间戳和可选直接探测结果。回调删除同一个 key,因此并发 exec 不会共享一个 task-work 槽位。 +每次 exec 都会用 `BPF_NOEXIST` 向 `pending` HASH map 插入清零的 `struct exec_work`,key 是 `pid_tgid`,然后记录时间戳。回调删除同一个 key,因此并发 exec 不会共享一个 task-work 槽位。 -可选的 `--probe-offset` 标志让工具通过 `probe_file_without_sleep` 在不可睡眠的钩子中尝试直接读取。测试套件用这个来验证:读取冷页在不可睡眠上下文中以 `-EFAULT` 失败,但在可睡眠回调中成功。 - -保存时间戳和直接探测结果后,钩子调用 `bpf_task_work_schedule_signal`。内核持有稍后执行回调所需的引用。插入、查找或调度失败都会被计数;任何已经创建 pending 状态的失败路径都会删除它。 +保存时间戳后,钩子调用 `bpf_task_work_schedule_signal`。内核持有稍后执行回调所需的引用。插入、查找或调度失败都会被计数;任何已经创建 pending 状态的失败路径都会删除它。 回调 `inspect_executable` 计算延迟用于诊断,然后用 `bpf_get_task_exe_file` 获取可执行文件。这返回一个带引用的 `struct file`,必须用 `bpf_put_file` 释放。回调解析路径、创建 file dynptr、读取 64 字节 ELF 头部并解析它。`read_elf_u16` 辅助函数处理字节序:ELF 文件在头部声明其字节序,多字节字段必须相应地读取。 @@ -411,330 +329,9 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) ### 用户态加载器 -`exec_image_inspector.c` 加载 BPF、持续接收事件、处理信号并报告结果: +完整加载器可从教程开头的源码链接查看。它的主生命周期如下: ```c -// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "exec_image_inspector.h" -#include "exec_image_inspector.skel.h" - -struct environment { - unsigned long long probe_offset; - bool verbose; -}; - -struct event_context { - unsigned long long seen; -}; - -static struct environment env; -static volatile sig_atomic_t exiting; - -static int libbpf_print_fn(enum libbpf_print_level level, const char *format, - va_list args) -{ - if (level == LIBBPF_DEBUG && !env.verbose) - return 0; - return vfprintf(stderr, format, args); -} - -static void usage(FILE *stream, const char *program) -{ - fprintf(stream, - "Usage: %s [--probe-offset BYTES] [--verbose]\n\n" - "Continuously inspect executable images installed by exec.\n" - "Press Ctrl-C to stop and print a summary.\n\n" - "Options:\n" - " -p, --probe-offset BYTES compare reads at a positive offset\n" - " -v, --verbose print libbpf diagnostics\n" - " -h, --help show this help\n", - program); -} - -static int parse_probe_offset(const char *value) -{ - char *end = NULL; - unsigned long long parsed; - - errno = 0; - parsed = strtoull(value, &end, 10); - if (errno || end == value || *end || !parsed || - parsed > UINT_MAX - EXEC_PROBE_LEN) { - fprintf(stderr, "invalid probe offset: %s\n", value); - return -EINVAL; - } - env.probe_offset = parsed; - return 0; -} - -static int parse_args(int argc, char **argv) -{ - static const struct option options[] = { - { "probe-offset", required_argument, NULL, 'p' }, - { "verbose", no_argument, NULL, 'v' }, - { "help", no_argument, NULL, 'h' }, - {}, - }; - int option; - - while ((option = getopt_long(argc, argv, "+p:vh", options, NULL)) != -1) { - switch (option) { - case 'p': - if (parse_probe_offset(optarg)) - return -EINVAL; - break; - case 'v': - env.verbose = true; - break; - case 'h': - usage(stdout, argv[0]); - exit(0); - default: - return -EINVAL; - } - } - - if (optind != argc) { - fprintf(stderr, "unexpected argument: %s\n", argv[optind]); - return -EINVAL; - } - return 0; -} - -static void handle_signal(int signal_number) -{ - (void)signal_number; - exiting = 1; -} - -static int install_signal_handlers(void) -{ - struct sigaction action = { - .sa_handler = handle_signal, - }; - - sigemptyset(&action.sa_mask); - if (sigaction(SIGINT, &action, NULL) || sigaction(SIGTERM, &action, NULL)) - return -errno; - return 0; -} - -static int drain_events(struct ring_buffer *ring_buffer) -{ - int error; - - for (;;) { - error = ring_buffer__poll(ring_buffer, 0); - if (error == -EINTR) - continue; - if (error < 0) { - fprintf(stderr, "ring-buffer drain failed: %s\n", - strerror(-error)); - return error; - } - if (!error) - return 0; - } -} - -static const char *elf_class_name(unsigned char value) -{ - switch (value) { - case 1: - return "ELF32"; - case 2: - return "ELF64"; - default: - return "UNKNOWN"; - } -} - -static const char *elf_data_name(unsigned char value) -{ - switch (value) { - case 1: - return "LSB"; - case 2: - return "MSB"; - default: - return "UNKNOWN"; - } -} - -static const char *elf_type_name(unsigned short value) -{ - switch (value) { - case 2: - return "ET_EXEC"; - case 3: - return "ET_DYN"; - default: - return "OTHER"; - } -} - -static const char *elf_machine_name(unsigned short value) -{ - switch (value) { - case 3: - return "EM_386"; - case 62: - return "EM_X86_64"; - case 183: - return "EM_AARCH64"; - default: - return "OTHER"; - } -} - -static int handle_event(void *context, void *data, size_t size) -{ - const struct exec_event *event = data; - struct event_context *events = context; - unsigned int index; - - if (size < sizeof(*event)) { - fprintf(stderr, "short ring-buffer event: %zu bytes\n", size); - return 0; - } - - events->seen++; - printf("EXEC pid=%u tgid=%u comm=%.*s path=%.*s is_elf=%u " - "class=%s endian=%s type=%s(%u) machine=%s(%u) " - "header_error=%d path_error=%d latency_us=%llu\n", - event->pid, event->tgid, EXEC_COMM_LEN, event->comm, - EXEC_PATH_LEN, event->path, event->is_elf, - elf_class_name(event->elf_class), elf_data_name(event->elf_data), - elf_type_name(event->elf_type), event->elf_type, - elf_machine_name(event->elf_machine), event->elf_machine, - event->header_error, event->path_error, - event->latency_ns / 1000); - - if (event->probe_offset) { - printf("PROBE offset=%llu direct_error=%d deferred_error=%d bytes=", - event->probe_offset, event->direct_probe_error, - event->deferred_probe_error); - for (index = 0; index < EXEC_PROBE_LEN; index++) - printf("%02x", event->probe_bytes[index]); - putchar('\n'); - } - fflush(stdout); - return 0; -} - -static int setup_inspector(struct event_context *events, - struct exec_image_inspector_bpf **skeleton, - struct ring_buffer **ring_buffer) -{ - struct exec_image_inspector_bpf *skel; - struct ring_buffer *ring; - int error; - - skel = exec_image_inspector_bpf__open(); - if (!skel) { - fprintf(stderr, "failed to open BPF skeleton\n"); - return -ENOMEM; - } - *skeleton = skel; - skel->rodata->probe_offset = env.probe_offset; - - error = exec_image_inspector_bpf__load(skel); - if (error) { - fprintf(stderr, - "failed to load BPF object: %s\n" - "This monitor requires Linux 6.19+, BTF, BPF JIT, " - "CONFIG_BPF_LSM=y, and an active bpf LSM.\n" - "Check the active list with: cat /sys/kernel/security/lsm\n", - strerror(-error)); - return error; - } - error = exec_image_inspector_bpf__attach(skel); - if (error) { - fprintf(stderr, "failed to attach bprm_committed_creds LSM hook: %s\n", - strerror(-error)); - return error; - } - - ring = ring_buffer__new(bpf_map__fd(skel->maps.events), handle_event, - events, NULL); - if (!ring) { - fprintf(stderr, "failed to create ring buffer: %s\n", strerror(errno)); - return errno ? -errno : -ENOMEM; - } - *ring_buffer = ring; - return 0; -} - -static int monitor_execs(struct ring_buffer *ring_buffer) -{ - int error; - - printf("READY scope=system-wide probe_offset=%llu\n", env.probe_offset); - fflush(stdout); - while (!exiting) { - error = ring_buffer__poll(ring_buffer, 100); - if (error == -EINTR) - continue; - if (error < 0) { - fprintf(stderr, "ring-buffer poll failed: %s\n", strerror(-error)); - return error; - } - } - return 0; -} - -static int drain_pending_events(struct ring_buffer *ring_buffer, - const struct exec_image_inspector_bpf *skel) -{ - int attempts, error; - - for (attempts = 0; attempts < 10; attempts++) { - if (skel->bss->stats.completed >= skel->bss->stats.scheduled) - return drain_events(ring_buffer); - error = ring_buffer__poll(ring_buffer, 100); - if (error == -EINTR) - continue; - if (error < 0) { - fprintf(stderr, "ring-buffer shutdown poll failed: %s\n", - strerror(-error)); - return error; - } - } - - fprintf(stderr, "timed out waiting for %llu scheduled callbacks\n", - skel->bss->stats.scheduled - skel->bss->stats.completed); - return -ETIMEDOUT; -} - -static void report_result(const struct exec_image_inspector_bpf *skel, - const struct event_context *events) -{ - struct inspector_stats final_stats = skel->bss->stats; - - printf("SUMMARY matched=%llu scheduled=%llu schedule_errors=%llu " - "callbacks=%llu completed=%llu header_errors=%llu path_errors=%llu " - "direct_probes=%llu direct_probe_errors=%llu " - "deferred_probes=%llu deferred_probe_errors=%llu dropped=%llu " - "cleanup_errors=%llu events=%llu\n", - final_stats.matched, final_stats.scheduled, - final_stats.schedule_errors, final_stats.callbacks, - final_stats.completed, final_stats.header_errors, - final_stats.path_errors, - final_stats.direct_probes, final_stats.direct_probe_errors, - final_stats.deferred_probes, final_stats.deferred_probe_errors, - final_stats.dropped, final_stats.cleanup_errors, events->seen); -} - int main(int argc, char **argv) { struct exec_image_inspector_bpf *skel = NULL; @@ -773,7 +370,7 @@ cleanup: } ``` -`setup_inspector` 打开、配置、加载并挂载 skeleton,然后创建 ring buffer。`monitor_execs` 打印 `READY`,轮询到 SIGINT 或 SIGTERM。程序不要求 timeout,也不再提供 `-- COMMAND` 子进程模式。 +`setup_inspector` 打开、加载并挂载 skeleton,然后创建 ring buffer。`monitor_execs` 打印 `READY`,并轮询到 SIGINT 或 SIGTERM。 关闭时 `main` 先 detach。`drain_pending_events` 再用有界的 100 ms poll 等待 `completed` 追上 `scheduled`,排空 ring buffer,并在销毁资源前报告全部计数。 @@ -789,7 +386,7 @@ make -C src/54-exec-image-inspector clean make -C src/54-exec-image-inspector -j2 ``` -测试套件要求 Linux 6.19 或更新版本,且 BPF LSM 处于活动状态。检查 `bpf` 是否出现在 LSM 列表中: +运行前,检查 `bpf` 是否出现在活动 LSM 列表中: ```bash cat /sys/kernel/security/lsm @@ -797,44 +394,20 @@ cat /sys/kernel/security/lsm 如果缺少 `bpf`,在内核命令行中添加它:把引导加载器配置中的 `lsm=` 改为 `lsm=,bpf`。 -运行测试: +启动监控器: ```bash -cd src/54-exec-image-inspector -sudo make test -``` - -仓库 CI 会编译本课;运行时行为也在教程 KVM 的 x86_64、内核 `7.2.0-rc4` 上通过功能测试。下面是缩短后的示例输出: - -```text -TEST-CONTINUOUS workers=16 matched=18 callbacks=18 events=18 -READY scope=system-wide probe_offset=4214784 -EXEC pid=... tgid=... comm=exec_fixture_im path=/tmp/.../exec_fixture_image is_elf=1 class=ELF64 endian=LSB type=ET_DYN(3) machine=EM_X86_64(62) header_error=0 path_error=0 latency_us=... -PROBE offset=4214784 direct_error=-14 deferred_error=0 bytes=454950524f424521 -SUMMARY matched=18 scheduled=18 schedule_errors=0 callbacks=18 completed=18 header_errors=0 path_errors=0 direct_probes=18 direct_probe_errors=18 deferred_probes=18 deferred_probe_errors=2 dropped=0 cleanup_errors=0 events=18 -PASS: persistent monitoring, concurrent execs, signal cleanup, ELF decode, and deferred file reads succeeded +sudo ./src/54-exec-image-inspector/exec_image_inspector ``` -测试先启动监控器并等待 `READY`,再并发运行 16 个 fixture 进程和一个最终 re-exec `/bin/true` 的 shell,最后用 SIGINT 停止监控器。它检查 `scheduled == callbacks == completed == events`,并要求调度、丢弃和清理错误全为零;还会确认旧的 `--timeout-ms` 和 `-- COMMAND` 接口被拒绝。 +程序打印 `READY scope=system-wide` 后,会为每次成功 exec 输出一行 `EXEC`,其中包含进程 ID、命令名、解析后的可执行文件路径、ELF 元数据和回调延迟。按 Ctrl-C 停止;最后的 `SUMMARY` 会显示调度、回调、错误、丢弃和事件计数。 -`EXEC` 行显示已安装的镜像和解析的 ELF 字段。`PROBE` 行展示了可睡眠上下文的差异:测试向一个页面写入标记(`EIPROBE!`),刷新并从页缓存驱逐它,然后 exec。不可睡眠钩子中的直接读取返回 `-EFAULT`(`-14`),因为页是冷的。可睡眠回调中的延迟读取成功,返回标记字节的十六进制表示(`454950524f424521`)。 - -持续监控之后发生的系统级 exec: +需要查看 libbpf 诊断信息时使用 `--verbose`: ```bash -sudo ./exec_image_inspector +sudo ./src/54-exec-image-inspector/exec_image_inspector --verbose ``` -命令行格式: - -```text -exec_image_inspector [--probe-offset BYTES] [--verbose] -``` - -- `--probe-offset`:在钩子中(直接)和回调中(延迟)分别读取此偏移处的 8 字节,以验证冷页差异。 -- `--verbose`:打印 libbpf 诊断信息。 -- Ctrl-C 或 SIGTERM:停止接收新 exec,等待已调度回调,排空事件,打印 `SUMMARY` 并卸载。 - ### 环境要求 | 要求 | 详情 | @@ -847,11 +420,11 @@ exec_image_inspector [--probe-offset BYTES] [--verbose] ## 局限性与扩展 -本工具在 `READY` 后观察系统级成功 exec。pending HASH map 最多支持 4096 个并发 `pid_tgid` key,插入或调度压力会反映在 `schedule_errors`。关闭时大约等待回调一秒;若未完成会返回错误,而不是静默销毁仍被回调使用的状态。`--probe-offset` 是比较冷页行为的高级诊断,不是 workload 过滤器。 +本工具在 `READY` 后观察系统级成功 exec。pending HASH map 最多支持 4096 个并发 `pid_tgid` key,插入或调度压力会反映在 `schedule_errors`。关闭时会等待回调约一秒,超时则返回错误。 ## 总结 -本教程展示了如何结合 BPF task work 和 file dynptr 来检查 exec 实际安装的可执行镜像。关键思路是分离两个时刻:接收 exec(在不可睡眠的 LSM 钩子中)和读取文件内容(在可睡眠的 task work 回调中)。这让 eBPF 程序能可靠地读取文件数据,即使目标字节不在页缓存中也能完成。 +本教程展示了如何结合 BPF task work 和 file dynptr 来检查 exec 实际安装的可执行镜像。LSM 钩子为每次 exec 安排工作,task work 回调则在可睡眠上下文中读取文件。这让 eBPF 程序能可靠地读取文件数据,即使目标字节不在页缓存中也能完成。 持续监控器为独立 workload 提供自然的 `READY` 边界。先 detach 再 drain 的关闭顺序、每次 exec 独立的 pending 状态和完成计数,在保留原有 task-work 与 file-dynptr 教学内容的同时保证并发回调安全。 diff --git a/src/54-exec-image-inspector/exec-image-flow.dot b/src/54-exec-image-inspector/exec-image-flow.dot index 170dee01..6b93b883 100644 --- a/src/54-exec-image-inspector/exec-image-flow.dot +++ b/src/54-exec-image-inspector/exec-image-flow.dot @@ -35,7 +35,7 @@ digraph exec_image_flow { color="#3182CE" ]; prepare [ - label="probe_offset\nload LSM + ring buffer", + label="load LSM + ring buffer", fillcolor="#EBF8FF", color="#3182CE" ]; @@ -49,21 +49,8 @@ digraph exec_image_flow { fillcolor="#FFFAF0", color="#DD6B20" ]; - probe [ - label="probe_offset set?", - shape=diamond, - style="filled", - fillcolor="#FFFAF0", - color="#DD6B20", - margin="0.10,0.05" - ]; - direct [ - label="non-sleepable direct probe\nstore result", - fillcolor="#FFFAF0", - color="#DD6B20" - ]; pending [ - label="pending[pid_tgid]\nscheduled_ns + direct result", + label="pending[pid_tgid]\nscheduled_ns + task work", shape=cylinder, fillcolor="#FFF5F5", color="#C05621" @@ -84,12 +71,12 @@ digraph exec_image_flow { color="#805AD5" ]; read [ - label="file-backed dynptr\nread ELF header + marker\ndiscard dynptr + put file", + label="file-backed dynptr\nread ELF header\ndiscard dynptr + put file", fillcolor="#FAF5FF", color="#805AD5" ]; event [ - label="ring buffer event\npath + ELF + probe + latency\ndelete pending entry", + label="ring buffer event\npath + ELF + latency\ndelete pending entry", fillcolor="#F0FFF4", color="#38A169" ]; @@ -100,18 +87,14 @@ digraph exec_image_flow { ]; { rank=same; start; prepare; exec; } - { rank=same; hook; probe; direct; } - { rank=same; pending; schedule; } + { rank=same; hook; pending; schedule; } { rank=same; callback; file; read; } { rank=same; event; collect; } start -> prepare; prepare -> exec [label="READY"]; exec -> hook [label="each committed exec"]; - hook -> probe; - probe -> direct [label="yes"]; - probe -> pending [label="no"]; - direct -> pending; + hook -> pending; pending -> schedule; schedule -> callback [label="task work runs"]; callback -> file; diff --git a/src/54-exec-image-inspector/exec-image-flow.png b/src/54-exec-image-inspector/exec-image-flow.png index 7a28f51becc54a5425d85ebe80628cc115bcb7cb..2c43f1a940bd4f86cde64a220a067f4c34636456 100644 GIT binary patch literal 89598 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 e%uN0MgK?`#9q3U0Tjg~ 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 literal 109558 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 Ze{xpRDO8$)2zQ_Ym$rtUdXbuS$iIV+9cTam diff --git a/src/54-exec-image-inspector/exec_image_inspector.bpf.c b/src/54-exec-image-inspector/exec_image_inspector.bpf.c index c00cdf89..7fedf2d9 100644 --- a/src/54-exec-image-inspector/exec_image_inspector.bpf.c +++ b/src/54-exec-image-inspector/exec_image_inspector.bpf.c @@ -16,8 +16,6 @@ char LICENSE[] SEC("license") = "GPL"; #define ELFDATA2LSB 1 #define ELFDATA2MSB 2 -const volatile __u32 probe_offset; - struct inspector_stats stats; struct { @@ -27,7 +25,6 @@ struct { struct exec_work { __u64 scheduled_ns; - int direct_probe_error; struct bpf_task_work work; }; @@ -46,129 +43,63 @@ static __u16 read_elf_u16(const unsigned char *header, int offset, __u8 data) return header[offset] | ((__u16)header[offset + 1] << 8); } -static int probe_file_without_sleep(struct file *file) +static int inspect_executable(struct bpf_map *map, void *key, void *value) { - unsigned char sample[EXEC_PROBE_LEN]; + unsigned char header[64] = {}; + struct exec_work *work = value; + struct exec_event event = {}; + struct task_struct *task; struct bpf_dynptr dynptr; + struct file *file; + __u64 pid_tgid; int err; - if (!probe_offset) - return 0; + __sync_fetch_and_add(&stats.callbacks, 1); + pid_tgid = bpf_get_current_pid_tgid(); + event.pid = (__u32)pid_tgid; + event.tgid = pid_tgid >> 32; + event.latency_ns = bpf_ktime_get_ns() - work->scheduled_ns; + bpf_get_current_comm(event.comm, sizeof(event.comm)); - __sync_fetch_and_add(&stats.direct_probes, 1); + task = bpf_get_current_task_btf(); + file = bpf_get_task_exe_file(task); if (!file) { - err = -ENOENT; - goto record; - } - - err = bpf_dynptr_from_file(file, 0, &dynptr); - if (err) { - bpf_dynptr_file_discard(&dynptr); - goto record; + event.header_error = -ENOENT; + __sync_fetch_and_add(&stats.header_errors, 1); + goto emit; } - err = bpf_dynptr_read(sample, sizeof(sample), &dynptr, probe_offset, 0); - bpf_dynptr_file_discard(&dynptr); - -record: - if (err) - __sync_fetch_and_add(&stats.direct_probe_errors, 1); - return err; -} - -static __always_inline void record_header_error(struct exec_event *event, int err) -{ - event->header_error = err; - __sync_fetch_and_add(&stats.header_errors, 1); -} - -static __always_inline void record_deferred_probe(struct exec_event *event, - int err) -{ - if (!probe_offset) - return; - - event->deferred_probe_error = err; - __sync_fetch_and_add(&stats.deferred_probes, 1); - if (err) - __sync_fetch_and_add(&stats.deferred_probe_errors, 1); -} - -static __always_inline void parse_elf_header(const unsigned char *header, - struct exec_event *event) -{ - if (event->header_error || header[0] != 0x7f || header[1] != 'E' || - header[2] != 'L' || header[3] != 'F') - return; - - event->is_elf = 1; - event->elf_class = header[EI_CLASS]; - event->elf_data = header[EI_DATA]; - event->elf_type = read_elf_u16(header, 16, event->elf_data); - event->elf_machine = read_elf_u16(header, 18, event->elf_data); -} - -static __always_inline void inspect_file(struct file *file, - struct exec_event *event) -{ - unsigned char header[64] = {}; - struct bpf_dynptr dynptr; - int err; - - err = bpf_path_d_path(&file->f_path, event->path, sizeof(event->path)); + err = bpf_path_d_path(&file->f_path, event.path, sizeof(event.path)); if (err < 0) { - event->path_error = err; + event.path_error = err; __sync_fetch_and_add(&stats.path_errors, 1); } err = bpf_dynptr_from_file(file, 0, &dynptr); if (err) { bpf_dynptr_file_discard(&dynptr); - record_header_error(event, err); - record_deferred_probe(event, err); - return; + event.header_error = err; + __sync_fetch_and_add(&stats.header_errors, 1); + goto put_file; } err = bpf_dynptr_read(header, sizeof(header), &dynptr, 0, 0); - if (err) - record_header_error(event, err); - - if (probe_offset) { - err = bpf_dynptr_read(event->probe_bytes, - sizeof(event->probe_bytes), - &dynptr, probe_offset, 0); - record_deferred_probe(event, err); + if (err) { + event.header_error = err; + __sync_fetch_and_add(&stats.header_errors, 1); } bpf_dynptr_file_discard(&dynptr); - parse_elf_header(header, event); -} -static int inspect_executable(struct bpf_map *map, void *key, void *value) -{ - struct exec_work *work = value; - struct exec_event event = {}; - struct task_struct *task; - struct file *file; - __u64 pid_tgid; - - __sync_fetch_and_add(&stats.callbacks, 1); - pid_tgid = bpf_get_current_pid_tgid(); - event.pid = (__u32)pid_tgid; - event.tgid = pid_tgid >> 32; - event.latency_ns = bpf_ktime_get_ns() - work->scheduled_ns; - event.direct_probe_error = work->direct_probe_error; - event.probe_offset = probe_offset; - bpf_get_current_comm(event.comm, sizeof(event.comm)); - - task = bpf_get_current_task_btf(); - file = bpf_get_task_exe_file(task); - if (!file) { - record_header_error(&event, -ENOENT); - record_deferred_probe(&event, -ENOENT); - goto emit; + if (!event.header_error && header[0] == 0x7f && header[1] == 'E' && + header[2] == 'L' && header[3] == 'F') { + event.is_elf = 1; + event.elf_class = header[EI_CLASS]; + event.elf_data = header[EI_DATA]; + event.elf_type = read_elf_u16(header, 16, event.elf_data); + event.elf_machine = read_elf_u16(header, 18, event.elf_data); } - inspect_file(file, &event); +put_file: bpf_put_file(file); emit: if (bpf_ringbuf_output(&events, &event, sizeof(event), 0)) @@ -189,6 +120,7 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) __u64 key; int err; + (void)bprm; pid_tgid = bpf_get_current_pid_tgid(); key = pid_tgid; __sync_fetch_and_add(&stats.matched, 1); @@ -206,7 +138,6 @@ void BPF_PROG(schedule_exec_inspection, struct linux_binprm *bprm) } work->scheduled_ns = bpf_ktime_get_ns(); - work->direct_probe_error = probe_file_without_sleep(bprm->file); task = bpf_get_current_task_btf(); err = bpf_task_work_schedule_signal(task, &work->work, &pending, inspect_executable); diff --git a/src/54-exec-image-inspector/exec_image_inspector.c b/src/54-exec-image-inspector/exec_image_inspector.c index f6a76219..c26aed0a 100644 --- a/src/54-exec-image-inspector/exec_image_inspector.c +++ b/src/54-exec-image-inspector/exec_image_inspector.c @@ -1,7 +1,6 @@ // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) #include #include -#include #include #include #include @@ -12,22 +11,17 @@ #include "exec_image_inspector.h" #include "exec_image_inspector.skel.h" -struct environment { - unsigned long long probe_offset; - bool verbose; -}; - struct event_context { unsigned long long seen; }; -static struct environment env; +static bool verbose; static volatile sig_atomic_t exiting; static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) { - if (level == LIBBPF_DEBUG && !env.verbose) + if (level == LIBBPF_DEBUG && !verbose) return 0; return vfprintf(stderr, format, args); } @@ -35,50 +29,28 @@ static int libbpf_print_fn(enum libbpf_print_level level, const char *format, static void usage(FILE *stream, const char *program) { fprintf(stream, - "Usage: %s [--probe-offset BYTES] [--verbose]\n\n" + "Usage: %s [--verbose]\n\n" "Continuously inspect executable images installed by exec.\n" "Press Ctrl-C to stop and print a summary.\n\n" "Options:\n" - " -p, --probe-offset BYTES compare reads at a positive offset\n" " -v, --verbose print libbpf diagnostics\n" " -h, --help show this help\n", program); } -static int parse_probe_offset(const char *value) -{ - char *end = NULL; - unsigned long long parsed; - - errno = 0; - parsed = strtoull(value, &end, 10); - if (errno || end == value || *end || !parsed || - parsed > UINT_MAX - EXEC_PROBE_LEN) { - fprintf(stderr, "invalid probe offset: %s\n", value); - return -EINVAL; - } - env.probe_offset = parsed; - return 0; -} - static int parse_args(int argc, char **argv) { static const struct option options[] = { - { "probe-offset", required_argument, NULL, 'p' }, { "verbose", no_argument, NULL, 'v' }, { "help", no_argument, NULL, 'h' }, {}, }; int option; - while ((option = getopt_long(argc, argv, "+p:vh", options, NULL)) != -1) { + while ((option = getopt_long(argc, argv, "+vh", options, NULL)) != -1) { switch (option) { - case 'p': - if (parse_probe_offset(optarg)) - return -EINVAL; - break; case 'v': - env.verbose = true; + verbose = true; break; case 'h': usage(stdout, argv[0]); @@ -185,7 +157,6 @@ static int handle_event(void *context, void *data, size_t size) { const struct exec_event *event = data; struct event_context *events = context; - unsigned int index; if (size < sizeof(*event)) { fprintf(stderr, "short ring-buffer event: %zu bytes\n", size); @@ -204,14 +175,6 @@ static int handle_event(void *context, void *data, size_t size) event->header_error, event->path_error, event->latency_ns / 1000); - if (event->probe_offset) { - printf("PROBE offset=%llu direct_error=%d deferred_error=%d bytes=", - event->probe_offset, event->direct_probe_error, - event->deferred_probe_error); - for (index = 0; index < EXEC_PROBE_LEN; index++) - printf("%02x", event->probe_bytes[index]); - putchar('\n'); - } fflush(stdout); return 0; } @@ -230,7 +193,6 @@ static int setup_inspector(struct event_context *events, return -ENOMEM; } *skeleton = skel; - skel->rodata->probe_offset = env.probe_offset; error = exec_image_inspector_bpf__load(skel); if (error) { @@ -263,7 +225,7 @@ static int monitor_execs(struct ring_buffer *ring_buffer) { int error; - printf("READY scope=system-wide probe_offset=%llu\n", env.probe_offset); + printf("READY scope=system-wide\n"); fflush(stdout); while (!exiting) { error = ring_buffer__poll(ring_buffer, 100); @@ -307,15 +269,11 @@ static void report_result(const struct exec_image_inspector_bpf *skel, printf("SUMMARY matched=%llu scheduled=%llu schedule_errors=%llu " "callbacks=%llu completed=%llu header_errors=%llu path_errors=%llu " - "direct_probes=%llu direct_probe_errors=%llu " - "deferred_probes=%llu deferred_probe_errors=%llu dropped=%llu " - "cleanup_errors=%llu events=%llu\n", + "dropped=%llu cleanup_errors=%llu events=%llu\n", final_stats.matched, final_stats.scheduled, final_stats.schedule_errors, final_stats.callbacks, final_stats.completed, final_stats.header_errors, final_stats.path_errors, - final_stats.direct_probes, final_stats.direct_probe_errors, - final_stats.deferred_probes, final_stats.deferred_probe_errors, final_stats.dropped, final_stats.cleanup_errors, events->seen); } diff --git a/src/54-exec-image-inspector/exec_image_inspector.h b/src/54-exec-image-inspector/exec_image_inspector.h index 41672e74..241fe137 100644 --- a/src/54-exec-image-inspector/exec_image_inspector.h +++ b/src/54-exec-image-inspector/exec_image_inspector.h @@ -4,7 +4,6 @@ #define EXEC_COMM_LEN 16 #define EXEC_PATH_LEN 256 -#define EXEC_PROBE_LEN 8 struct exec_event { unsigned int pid; @@ -17,13 +16,9 @@ struct exec_event { unsigned short elf_machine; int header_error; int path_error; - int direct_probe_error; - int deferred_probe_error; unsigned long long latency_ns; - unsigned long long probe_offset; char comm[EXEC_COMM_LEN]; char path[EXEC_PATH_LEN]; - unsigned char probe_bytes[EXEC_PROBE_LEN]; }; struct inspector_stats { @@ -34,10 +29,6 @@ struct inspector_stats { unsigned long long completed; unsigned long long header_errors; unsigned long long path_errors; - unsigned long long direct_probes; - unsigned long long direct_probe_errors; - unsigned long long deferred_probes; - unsigned long long deferred_probe_errors; unsigned long long dropped; unsigned long long cleanup_errors; }; diff --git a/src/54-exec-image-inspector/tests/test_exec_image_inspector.py b/src/54-exec-image-inspector/tests/test_exec_image_inspector.py index fc39b4ba..dbcd477b 100644 --- a/src/54-exec-image-inspector/tests/test_exec_image_inspector.py +++ b/src/54-exec-image-inspector/tests/test_exec_image_inspector.py @@ -6,25 +6,18 @@ import os import re import select -import shutil import signal -import stat import subprocess import sys -import tempfile import time -MARKER = b"EIPROBE!" -PROBE_DISTANCE = 4 * 1024 * 1024 WORKERS = 16 SUMMARY = re.compile( r"SUMMARY matched=(\d+) scheduled=(\d+) schedule_errors=(\d+) " r"callbacks=(\d+) completed=(\d+) header_errors=(\d+) path_errors=(\d+) " - r"direct_probes=(\d+) direct_probe_errors=(\d+) " - r"deferred_probes=(\d+) deferred_probe_errors=(\d+) dropped=(\d+) " - r"cleanup_errors=(\d+) events=(\d+)" + r"dropped=(\d+) cleanup_errors=(\d+) events=(\d+)" ) @@ -51,10 +44,6 @@ def parse_summary(output: str) -> dict[str, int]: "completed", "header_errors", "path_errors", - "direct_probes", - "direct_probe_errors", - "deferred_probes", - "deferred_probe_errors", "dropped", "cleanup_errors", "events", @@ -62,35 +51,10 @@ def parse_summary(output: str) -> dict[str, int]: return dict(zip(names, map(int, match.groups()))) -def create_probe_image(fixture: str, directory: str) -> tuple[str, int]: - image = os.path.join(directory, "exec_fixture_image") - shutil.copyfile(fixture, image) - os.chmod(image, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) - - original_size = os.path.getsize(image) - probe_offset = ((original_size + 4095) // 4096) * 4096 + PROBE_DISTANCE - with open(image, "r+b", buffering=0) as executable: - executable.seek(probe_offset) - executable.write(MARKER) - os.fsync(executable.fileno()) - if hasattr(os, "posix_fadvise"): - os.posix_fadvise(executable.fileno(), 0, 0, os.POSIX_FADV_DONTNEED) - return image, probe_offset - - def test_cli(inspector: str) -> None: help_result = run(inspector, "--help") assert help_result.returncode == 0, help_result.stdout assert "Continuously inspect executable images" in help_result.stdout - assert "--timeout-ms" not in help_result.stdout - - legacy_result = run(inspector, "--", "/bin/true", check=False) - assert legacy_result.returncode == 2, legacy_result.stdout - assert "unexpected argument: /bin/true" in legacy_result.stdout - - zero_offset = run(inspector, "--probe-offset", "0", check=False) - assert zero_offset.returncode == 2, zero_offset.stdout - assert "invalid probe offset: 0" in zero_offset.stdout def stop_monitor( @@ -130,73 +94,59 @@ def wait_until_ready(monitor: subprocess.Popen[str]) -> list[str]: def test_continuous_monitor( inspector: str, fixture: str ) -> tuple[str, dict[str, int]]: - with tempfile.TemporaryDirectory(prefix="exec-image-inspector-") as directory: - image, probe_offset = create_probe_image(fixture, directory) - monitor = subprocess.Popen( - [inspector, "--probe-offset", str(probe_offset)], - text=True, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - ) - try: - lines = wait_until_ready(monitor) - - workers = [ - subprocess.Popen( - [image], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT - ) - for _ in range(WORKERS) - ] - for worker in workers: - assert worker.wait(timeout=5) == 0 - - reexec = run("/bin/sh", "-c", "exec /bin/true") - assert reexec.returncode == 0, reexec.stdout - time.sleep(1) - returncode, remainder = stop_monitor(monitor, signal.SIGINT) - output = "".join(lines) + remainder - finally: - if monitor.poll() is None: - monitor.kill() - monitor.wait() - - assert returncode == 0, output - assert f"READY scope=system-wide probe_offset={probe_offset}" in output, output - - exec_lines = [ - line for line in output.splitlines() if line.startswith("EXEC ") - ] - image_lines = [line for line in exec_lines if f"path={image}" in line] - assert len(image_lines) == WORKERS, output - assert all("is_elf=1" in line for line in image_lines), image_lines - assert all("class=ELF64" in line for line in image_lines), image_lines - assert all("endian=LSB" in line for line in image_lines), image_lines - assert all("machine=EM_X86_64(62)" in line for line in image_lines), image_lines - assert all("header_error=0 path_error=0" in line for line in image_lines) - - final_path = os.path.realpath("/bin/true") - assert any(f"path={final_path}" in line for line in exec_lines), output - - probe_lines = [ - line for line in output.splitlines() if line.startswith("PROBE ") + monitor = subprocess.Popen( + [inspector], + text=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) + try: + lines = wait_until_ready(monitor) + + workers = [ + subprocess.Popen( + [fixture], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT + ) + for _ in range(WORKERS) ] - expected_probe = ( - f"offset={probe_offset} direct_error=-14 deferred_error=0 " - f"bytes={MARKER.hex()}" - ) - assert any(expected_probe in line for line in probe_lines), output - - stats = parse_summary(output) - assert stats["matched"] >= WORKERS + 2, stats - assert stats["scheduled"] == stats["matched"], stats - assert stats["schedule_errors"] == 0, stats - assert stats["callbacks"] == stats["scheduled"], stats - assert stats["completed"] == stats["scheduled"], stats - assert stats["events"] == stats["completed"], stats - assert stats["dropped"] == 0, stats - assert stats["cleanup_errors"] == 0, stats - assert stats["deferred_probe_errors"] == stats["matched"] - WORKERS, stats - return output, stats + for worker in workers: + assert worker.wait(timeout=5) == 0 + + reexec = run("/bin/sh", "-c", "exec /bin/true") + assert reexec.returncode == 0, reexec.stdout + time.sleep(1) + returncode, remainder = stop_monitor(monitor, signal.SIGINT) + output = "".join(lines) + remainder + finally: + if monitor.poll() is None: + monitor.kill() + monitor.wait() + + assert returncode == 0, output + assert "READY scope=system-wide" in output, output + + exec_lines = [line for line in output.splitlines() if line.startswith("EXEC ")] + fixture_lines = [line for line in exec_lines if f"path={fixture}" in line] + assert len(fixture_lines) == WORKERS, output + assert all("is_elf=1" in line for line in fixture_lines), fixture_lines + assert all("class=ELF64" in line for line in fixture_lines), fixture_lines + assert all("endian=LSB" in line for line in fixture_lines), fixture_lines + assert all("machine=EM_X86_64(62)" in line for line in fixture_lines) + assert all("header_error=0 path_error=0" in line for line in fixture_lines) + + final_path = os.path.realpath("/bin/true") + assert any(f"path={final_path}" in line for line in exec_lines), output + + stats = parse_summary(output) + assert stats["matched"] >= WORKERS + 2, stats + assert stats["scheduled"] == stats["matched"], stats + assert stats["schedule_errors"] == 0, stats + assert stats["callbacks"] == stats["scheduled"], stats + assert stats["completed"] == stats["scheduled"], stats + assert stats["events"] == stats["completed"], stats + assert stats["dropped"] == 0, stats + assert stats["cleanup_errors"] == 0, stats + return output, stats def main() -> int: @@ -219,8 +169,8 @@ def main() -> int: ) print(output, end="") print( - "PASS: persistent monitoring, concurrent execs, signal cleanup, ELF decode, " - "and deferred file reads succeeded" + "PASS: persistent monitoring, concurrent execs, signal cleanup, " + "and ELF decode succeeded" ) return 0